ここには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
登場。