[英]Self-made Iterator bug
我必須使自己成為自定義鏈接列表,並且Iterator遇到問題。 next()
方法可以正常工作,但是奇怪的是, hasNext()
方法不能正常工作。
這是代碼:
public Iterator<T> iterator() {
final Node<T> currentNode = this.iteratorNode;
final MyLinkedList<T> list = this;
final Node<T> firstNode = this.firstNode;
return new Iterator<T>() {
@Override
public boolean hasNext() {
if (list.isEmpty()) {
return false;
} else if (currentNode == null){
list.setIteratorNode(firstNode);
return true;
} else if (currentNode.nextNode == null){
return false;
}
list.setIteratorNode(currentNode.nextNode);
return true;
}
@Override
public T next() {
if (list.isEmpty()){
return null;
} else if (currentNode == null){
list.setIteratorNode(firstNode);
return firstNode.data;
} else if (currentNode.nextNode == null) {
return null;
}
list.setIteratorNode(currentNode.nextNode);
return currentNode.nextNode.data;
}
};
}
代碼的組件(例如isEmpty()
和setIteratorNode()
方法)可以正常工作。真正使這個怪異的(在我看來)的是,我基本上在next()
中執行與hasNext()
。
任何幫助將不勝感激。
您的缺點是hasNext
應該是冪等的。 它不應更新當前位置的位置。 因此,代碼為list.setIteratorNode(currentNode.nextNode);
在hasNext
不應該存在
加成:
將變量currentNode
和firstNode
移到Iterator
類中。 將currentNode
為非最終形式。 currentNode
應該初始化為null
。 Iterator
唯一需要修改的是它自己的currentNode
。
您應該刪除該行
list.setIteratorNode(currentNode.nextNode);
從您的hasNext()
方法中。 您只想在next()
方法中更新迭代器的位置。
順便說一句,我不喜歡您似乎將迭代器的位置存儲在列表中的事實。 這使得不可能在同一列表中有兩個位置不同的迭代器。 您應該將位置存儲在迭代器本身中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.