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);
}
しかし、 を変更しようとしても、基になるリストは変更list
さadd()
れないため、次のテストは失敗します。
OdpList<Integer> list = new OdpList<Integer>();
ListIterator<Integer> iter = list.listIterator();
iter.add(42);
assertTrue(list.contains(42));
OdpList 追加: 単体テストに合格しているので、正しいと思います。
@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;
}
ListCell コンストラクター:
public class ListCell<T> {
public ListCell(T arg0) {
this.datum = arg0;
next = null;
}
}
OdpList listIterator:
@Override
public ListIterator<E> listIterator() {
return new OdpIterator<E>(this);
}
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);
}
どうすればいいですか?それとも、イテレータの仕組みを誤解していますか?