36

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

私の問題は、リストを反復しながら新しい要素でリストを拡張したいことと、追加したばかりの要素を反復子に続行させたいことです。

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

4

3 に答える 3

36

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

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

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

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

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

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

于 2011-09-13T23:42:35.830 に答える
13

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
}
于 2011-09-13T23:53:35.783 に答える
8

どうですか

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);
于 2011-09-13T23:41:33.637 に答える