我有这种迭代器。但我想只返回next()方法中的特定元素。在我的例子中,我想返回作为BagCoffee
@Override
public Iterator<E> iterator() {
return new Iterator<E>(){
private Node<E> current = head;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
@Override
public E next() {
Coffee value = null;
if (!hasNext()) throw new NoSuchElementException();
if(!(current.value instanceof BagCoffee)) {
if(!hasNext()) {
current = current.next;
return next();
} else {
//Stop executing method?
}
} else {
value = current.value;
current = current.next;
}
return (E) value;
}
};
}
以下代码将打印我需要的内容,然后它将打印NullPointerException,因为它继续迭代,即使hasNext()返回false
for(Coffee coff: mySet3) {
System.out.println("\n");
coff.sayType();
}
问题是如果下一个没有元素,我就无法停止方法。
if(!hasNext()) {
current = current.next;
return next();
} else {
//Stop executing method
}
使迭代器返回特定元素并停止方法运行的正确方法是什么?
答案 0 :(得分:0)
主要问题是您错误地管理了迭代器的状态:current
的值不应包含BagCoffee
以外的任何内容。
如果是,则无法保证hasNext()
合同方法得到尊重,因为即使下一个没有true
,它也可以返回BagCoffee
。
因此,您应该在对象生命的两个不同时间通过以下方式确保此状态的正确性:
current
的第一个值,使其为BagCoffee
或null。current
的下一个值,使其为BagCoffee
或null。然后你最终可以重构以避免重复的代码。