web-dev-qa-db-ja.com

リストを反復しながら要素をリストに追加します。 (Java)

可能性のある複製:
Java:反復中にコレクションに要素を追加する

私の問題は、リストを繰り返し処理しながら新しい要素でリストを拡張し、追加したばかりの要素をイテレータで続行したいということです。

私の理解から、ListIterator.add()はリストの現在の要素の後ではなく前に要素を追加します。他の方法でこれを達成することは可能ですか?

30
adamfinstorp

Iterator.remove()を除き、Iteratorを使用してコレクションを繰り返し処理している間は、コレクションを変更できません。

ただし、 listIterator() メソッドを使用すると、ListIteratorが返され、さらに変更するオプションがあることが繰り返されます。 add()のjavadocから:

新しい要素は暗黙カーソルの前に挿入されます:... previous()への後続の呼び出しは新しい要素を返します

それを考えると、このコードは、新しい要素を反復の次の要素として設定するように機能するはずです。

ListIterator<T> i;
i.add(e);
i.previous(); // returns e
i.previous(); // returns element before e, and e will be next

リストが空の反復を開始する場合を除き、これは機能します。その場合、前の要素はありません。それが問題である場合、このエッジのケースを示すために何らかのフラグを維持する必要があります。

29
Bohemian

ListIteratorにはいくつかのトリックがあるかもしれませんが、最も簡単な解決策はおそらく古いスタイルのインデックスループです。パフォーマンスが問題ではないことを確認します(リンクリストはありません-ただし、ArrayListは問題ありません)。

List<Object> myList;

for(int i = 0; i < myList.size(); i++)
{
  Object current = myList.get(i); 
  // Anything you insert after i will be discovered during next iterations
}
10
ptyx

どう?

List<Foo> fooList = getFooList();
List<Foo> tempFooList = new ArrayList<Foo>()


for(Foo f : fooList)
{
   ...
   // add items that need to be added to temp
   tempFooList.add(new Foo());
   ...
}

fooList.addAll(tempFooList);
7
Bala R