簡體   English   中英

自制的迭代器錯誤

[英]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不應該存在

加成:

將變量currentNodefirstNode移到Iterator類中。 currentNode為非最終形式。 currentNode應該初始化為null Iterator唯一需要修改的是它自己的currentNode

您應該刪除該行

list.setIteratorNode(currentNode.nextNode);

從您的hasNext()方法中。 您只想在next()方法中更新迭代器的位置。

順便說一句,我不喜歡您似乎將迭代器的位置存儲在列表中的事實。 這使得不可能在同一列表中有兩個位置不同的迭代器。 您應該將位置存儲在迭代器本身中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM