Java 自制迭代器错误

Java 自制迭代器错误,java,list,linked-list,iterator,Java,List,Linked List,Iterator,我必须自己制作一个自定义链表,迭代器也有问题。next()方法工作正常,但奇怪的是,hasNext()方法工作不正常。 代码如下: public Iterator<T> iterator() { final Node<T> currentNode = this.iteratorNode; final MyLinkedList<T> list = this; final Node<T> firstNode = this.fir

我必须自己制作一个自定义链表,迭代器也有问题。
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;
        }
    };
}
公共迭代器迭代器(){
最终节点currentNode=this.iteratorNode;
最终MyLinkedList列表=此;
final Node firstNode=this.firstNode;
返回新的迭代器(){
@凌驾
公共布尔hasNext(){
if(list.isEmpty()){
返回false;
}else if(currentNode==null){
setIteratorNode(firstNode);
返回true;
}else if(currentNode.nextNode==null){
返回false;
}
setIteratorNode(currentNode.nextNode);
返回true;
}
@凌驾
公共交通工具{
if(list.isEmpty()){
返回null;
}else if(currentNode==null){
setIteratorNode(firstNode);
返回firstNode.data;
}else if(currentNode.nextNode==null){
返回null;
}
setIteratorNode(currentNode.nextNode);
返回currentNode.nextNode.data;
}
};
}
代码的组件(如
isEmpty()
setIteratorNode()
方法)工作正常。在我看来,真正让人感到奇怪的是,我在
next()
中做的事情基本上与在
hasNext()
中做的事情相同


非常感谢您的帮助。

您的缺陷是
hasNext
应该是幂等的。它不应该更新当前位置的位置。因此,code
list.setIteratorNode(currentNode.nextNode);
不应该存在于
hasNext

补充:


将变量:
currentNode
firstNode
移动到
Iterator
类中。使
currentNode
非final。
currentNode
应初始化为
null
Iterator
应修改的唯一内容是它自己的
currentNode
您的缺陷是
具有Next
应该是幂等的。它不应该更新当前位置的位置。因此,code
list.setIteratorNode(currentNode.nextNode);
不应该存在于
hasNext

补充:


将变量:
currentNode
firstNode
移动到
Iterator
类中。将
currentNode
设为非final。
currentNode
应初始化为
null
Iterator
应修改的唯一内容是它自己的
currentNode
<

list.setIteratorNode(currentNode.nextNode);
hasNext()
方法。您只想更新迭代器在
next()
方法中的位置


顺便说一句,我不喜欢您似乎在列表中存储迭代器的位置。这使得在同一个列表中不可能有两个位置不同的迭代器。您应该将位置存储在迭代器本身。

您应该删除该行

list.setIteratorNode(currentNode.nextNode);
hasNext()
方法。您只想更新迭代器在
next()
方法中的位置


顺便说一句,我不喜欢您似乎在列表中存储迭代器的位置。这使得在同一个列表中不可能有两个位置不同的迭代器。您应该将位置存储在迭代器本身。

什么“工作不正常”意思是?在
hasNext
中设置某个内容是一个非常糟糕的主意-人们希望
hasNext
只提供一些信息,而不会更改内部状态。这意味着当通过包含多个元素的列表进行迭代时,它总是返回true。抱歉,我将编辑该问题。还有你的下一个()方法不符合迭代器接口的规范。如果没有元素,“throw NoSuchElementException()”是,则返回null不是适当的操作。什么“工作不正常”意思是?在
hasNext
中设置某个内容是一个非常糟糕的主意-人们希望
hasNext
只提供一些信息,而不会更改内部状态。这意味着当通过包含多个元素的列表进行迭代时,它总是返回true。抱歉,我将编辑该问题。还有你的下一个()方法不符合迭代器接口的规范。如果没有元素“throw NoSuchElementException()”,则返回null不是适当的操作有效点为+1。虽然,遗憾的是,这不是唯一的问题。虽然,遗憾的是,这不是唯一的问题。你是对的,最好将其存储在迭代器中。你会怎么做?@DoraHerbert匿名类也可以有成员变量。因此,你可以将
currentNode
变量移动到您的迭代器类。您是对的,最好将其存储在迭代器中。您会怎么做?@DoraHerbert匿名类也可以有成员变量。因此您可以将
currentNode
变量移动到迭代器类中。