重複の可能性:
Java: 反復中にコレクションに要素を追加する
私の問題は、リストを反復しながら新しい要素でリストを拡張したいことと、追加したばかりの要素を反復子に続行させたいことです。
私の理解でListIterator.add()
は、リスト内の現在の要素の後ではなく、その前に要素を追加します。他の方法でこれを達成することは可能ですか?
重複の可能性:
Java: 反復中にコレクションに要素を追加する
私の問題は、リストを反復しながら新しい要素でリストを拡張したいことと、追加したばかりの要素を反復子に続行させたいことです。
私の理解でListIterator.add()
は、リスト内の現在の要素の後ではなく、その前に要素を追加します。他の方法でこれを達成することは可能ですか?
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
これは、リストが空の反復を開始する場合を除いて機能します。その場合、前の要素はありません。それが問題である場合は、このエッジケースを示すために何らかのフラグを維持する必要があります。
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
}
どうですか
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);