這裏有兩個問題:
,則返回的第一個問題添加到Collection
的Iterator
後。如前所述,有當底層Collection
修改沒有定義的行爲,如文檔中提到了Iterator.remove
:
...迭代器的行爲是不確定 如果標的 集合,而 修改除了通過調用此方法以外,任何方式的迭代都以 進行。
第二個問題是,即使Iterator
可以得到,然後返回到相同的元素Iterator
在,沒有對iteratation的順序保證,因爲Collection.iterator
方法文檔中指出:
...有關於 爲了不保證其中的元素是 返回(除非該集合是一些類,提供一個 擔保的 實例)。
例如,假設我們有名單[1, 2, 3, 4]
。
假設5
加入時Iterator
在3
,不知何故,我們得到了一個Iterator
可以從4
恢復迭代。但是,沒有保證5
會在4
之後。迭代順序可能是[5, 1, 2, 3, 4]
- 那麼迭代器仍然會錯過元素5
。
由於不能保證行爲,人們不能認爲事情會以某種方式發生。
一種替代可以有一個單獨的Collection
到新創建的元素可以被添加到,然後再遍歷這些元素:
Collection<String> list = Arrays.asList(new String[]{"Hello", "World!"});
Collection<String> additionalList = new ArrayList<String>();
for (String s : list) {
// Found a need to add a new element to iterate over,
// so add it to another list that will be iterated later:
additionalList.add(s);
}
for (String s : additionalList) {
// Iterate over the elements that needs to be iterated over:
System.out.println(s);
}
編輯
在闡述Avi's answer,它有可能將我們想要迭代的元素排隊到一個隊列中,並在隊列中有元素時刪除這些元素。這將允許除了原始元素之外的新元素的「迭代」。
讓我們來看看它是如何工作的。
從概念上講,如果我們在隊列中的以下內容:
[1, 2, 3, 4]
而且,當我們刪除1
,我們決定增加42
,隊列將是如下所示:
[2, 3, 4, 42]
由於隊列是一個FIFO(先進先出)數據結構,因此該排序是典型的。 (至於Queue
接口的文檔中提到的,這不是一個Queue
的必需品。取PriorityQueue
哪些訂單可以通過自然順序的元素的情況下,所以這不是FIFO。)
下面是使用一個例子一個LinkedList
(這是一個Queue
),以便通過所有元素以及在出列期間添加的其他元素。類似於上面的示例中,當元件2
除去元件42
加入:
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(1);
queue.add(2);
queue.add(3);
queue.add(4);
while (!queue.isEmpty()) {
Integer i = queue.remove();
if (i == 2)
queue.add(42);
System.out.println(i);
}
結果如下:
1
2
3
4
42
正如希望的那樣,當我們擊中其中加入元素42
出現了2
。
如果有人想詳細說明這個想法,請隨意...... – Avi 2009-06-14 15:51:09
如果它適合OP編碼的模型,這是一種很好的方法。這樣你就不用迭代器 - 只是一個while循環。當隊列中有元素時,處理第一個元素。但是,您也可以使用List來做到這一點。 – Eddie 2009-06-14 16:13:52
我不明白。 – inetphantom 2015-04-23 09:35:35