Java:通过引用传递/ ListIterator.add()

Nic*_*ner 0 java variables iterator pass-by-reference data-structures

Java不通过引用传递变量.在这种情况下,数据结构如何ListIterator更改其相应的列表?

这是我写的一个示例迭代器:

public class OdpIterator<E> implements ListIterator<E> {

    private OdpList<E> list;
    private int cursor;

    public OdpIterator(OdpList<E> list) {
        this.list = list;
    }

    @Override
    public void add(E arg0) {
        list.add(arg0);
    }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试更改listadd(),它不会更改基础列表,因此以下测试失败:

OdpList<Integer> list = new OdpList<Integer>();
ListIterator<Integer> iter = list.listIterator();
iter.add(42);
assertTrue(list.contains(42));
Run Code Online (Sandbox Code Playgroud)

OdpList add:我认为它是正确的,因为它通过了它的单元测试.

@Override
public boolean add(E arg0) {
    ListCell<E> cell = new ListCell<E>(arg0);

    if (size() > 0) { //if something is already in the list
        tail.setNext(cell);
        tail = cell;
    }
    else {
        head = cell;
        tail = cell;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

ListCell构造函数:

public class ListCell<T> {
    public ListCell(T arg0) {
        this.datum = arg0;
        next = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

OdpList listIterator:

@Override
public ListIterator<E> listIterator() {
    return new OdpIterator<E>(this);
}
Run Code Online (Sandbox Code Playgroud)

OdpList包含:

@Override
public boolean contains(Object arg0) {
    return indexOf(arg0) == -1;
}

@Override
public int indexOf(Object arg0) {
    return findAfter(head, arg0, 0);
}

private int findAfter(ListCell<E> o, Object search, int soFar) {
    if (o == null) {
        return -1;
    }
    if (o.getDatum() == null && search != null) {
        return findAfter(o.getNext(), search, soFar + 1);           
    }
    if ((o.getDatum() == null && search == null) || o.getDatum().equals(search)) {
        return soFar;
    }

    return findAfter(o.getNext(), search, soFar + 1);
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?或者我误解了迭代器是如何工作的?

Mic*_*ers 6

在人们经历过的所有心理锻炼之后,我几乎不愿意这样说,但是......问题只是一个错字.

@Override
public boolean contains(Object arg0) {
    return indexOf(arg0) == -1;
}
Run Code Online (Sandbox Code Playgroud)

应该

@Override
public boolean contains(Object arg0) {
    return indexOf(arg0) != -1;
}
Run Code Online (Sandbox Code Playgroud)

containstrue只有当对象不在列表中时才返回!