ここには2つの問題があります。
最初の問題は、が返されたCollection後に追加することIteratorです。前述のCollectionように、以下のドキュメントに記載されているように、基礎が変更された場合の動作は定義されていませんIterator.remove。
...このメソッドを呼び出す以外の方法で反復の進行中に基になるコレクションが変更された場合、イテレータの動作は指定されません。
2番目の問題は、Iteratorが取得できた後、同じ要素に戻ったIteratorとしても、Collection.iteratorメソッドのドキュメントに記載されているように、反復の順序について保証がないことです。
...要素が返される順序に関する保証はありません(このコレクションが保証を提供するクラスのインスタンスでない限り)。
たとえば、リストがあるとします[1, 2, 3, 4]。
レッツ・発言は5時に追加されたIterator時だった3、と何とか、我々が得ますIteratorから繰り返しを再開できることを4。ただし、5後に来る保証はありません4。反復順序は次のようになり[5, 1, 2, 3, 4]ます5。その場合、イテレータは要素を見逃します。
振る舞いは保証されていないため、特定の方法で物事が起こるとは限りません。
代替案の1つは、別の Collection、新しく作成された要素を追加できる要素を用意し、それらの要素を反復処理することです。
Collection<String> list = Arrays.asList(new String[]{"Hello", "World!"});
Collection<String> additionalList = new ArrayList<String>();
for (String s : list) {
additionalList.add(s);
}
for (String s : additionalList) {
System.out.println(s);
}
編集
で詳しく説明する アビの答え、我々がキューに反復処理したいという要素をキュー、キューは、要素を有している要素を削除することが可能です。これにより、元の要素に加えて、新しい要素に対する「反復」が可能になります。
それがどのように機能するかを見てみましょう。
概念的には、キューに次の要素がある場合:
[1, 2, 3, 4]
そして、を削除すると1、を追加すること42にします。キューは次のようになります。
[2, 3, 4, 42]
キューはFIFO(先入れ先出し)データ構造であるため、この順序は一般的です。(Queueインターフェースのドキュメントに記載されているように、これは必要ではありませんQueue。PriorityQueueありません。FIFOではないため、要素を自然な順序で順序付け考えてみてください。)
以下は、LinkedList(であるQueue)を使用して、デキュー中に追加された追加の要素とともにすべての要素を処理する例です。上記の例と同様42に、要素2が削除されると要素が追加されます。
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登場。