2014-10-16 117 views
0

我必須讓自己成爲一個自定義鏈表,並且Iterator有問題。 next()方法正常工作,但奇怪的是,方法沒有。
下面是代碼:自制迭代器錯誤

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()

任何幫助,將不勝感激。

+2

「不能正常工作」是什麼意思? – Yann 2014-10-16 12:22:37

+0

在'hasNext'中設置一些東西是非常糟糕的主意 - 人們期望'hasNext'只會提供一些信息,而不會改變內部狀態。 – 2014-10-16 12:24:34

+0

這意味着當迭代通過一個超過1個元素的列表時,它總是返回true。道歉,我會編輯這個問題。 – 2014-10-16 12:25:34

回答

3

你的缺陷是hasNext應該冪等。它不應該更新當前位置的位置。因此,代碼list.setIteratorNode(currentNode.nextNode);不應hasNext

加成存在:

移動變量:currentNodefirstNode到您Iterator類。使currentNode非最終。 currentNode應該初始化爲nullIterator唯一修改的是它自己的currentNode

+0

+1爲您的有效點。雖然,這不是唯一的問題,可悲的是。 – 2014-10-16 12:31:41

+0

增加了更多信息 – 2014-10-16 12:46:30

1

您應該從hasNext()方法刪除行

list.setIteratorNode(currentNode.nextNode); 

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

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

+0

你是對的,最好將它存儲在迭代器中。你會怎麼做? – 2014-10-16 12:42:12

+0

@DoraHerbert匿名類也可以有成員變量。所以你可以將'currentNode'變量移動到你的Iterator類。 – Hoopje 2014-10-16 13:04:48