这是我iterator
对ArrayList
的实施:
public class MyClass {
List<E> list = new ArraList<E>();
public Iterator<E> iterator() {
return new MyIterator<E>();
}
private class MyIterator<T> implements Iterator<E> {
int index;
public MyIterator() {
index = 0;
}
public E next() {
if (hasNext()){
index++;
return list.get(index + 1);
}
else
throw new NoSuchElementException();
}
public boolean hasNext() {
if ((list.get(index + 1) != null) && (index < list.size() -1)){
index++;
return true;
}
else
return false;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}
然而,虽然逻辑看起来不错,但这种实现是错误的,因为它无法正常工作。
我的问题是:我做错了什么,我怎样才能改变它以使其正常工作?
更新:
public E next() {
if (index == 0) {
index++;
return list.get(0);
}
else if (hasNext()) {
index++;
return list.get(index);
}
else
throw new NoSuchElementException();
}
我设法以某种方式使其工作,但现在下一个方法是跳过数组的索引。我该如何解决这个问题?
答案 0 :(得分:1)
如果没有您如何使用此迭代器的示例,很难给您建议。话虽如此,至少有两件事你做错了。在next()
方法中,您有
index++;
return list.get(index + 1);
因此,您将首先递增索引,然后返回NEXT索引。这应该导致越界异常。将其更改为返回list.get(index);
其次,您的hasNext()
方法未正确排序。也就是说,在检查下一个对象是否存在之前,应检查下一个索引是否有效。将您的if语句重新排序为:
if ((index < list.size() -1) && (list.get(index + 1) != null))
同时摆脱index++;
中的hasNext()
行。该方法应该只检查有效性,而不是实际更改当前索引。这应该发生在next()
。