2012-06-24 20 views
22

は、私のようなリストを持っていると言います。しかし、リストの最初のサイズまで反復したいという新しく追加された要素を反復したくありません。Javaで反復処理中にListに要素を追加する方法は?私は、リストの末尾に要素を追加したい、このリストを反復しながら</p> <pre><code>List<String> list = new ArrayList<>(); list.add("a"); list.add("h"); list.add("f"); list.add("s"); </code></pre> <p>:

for (String s : list) 
    /* Here I want to add new element if needed while iterating */ 

どのようにすればいいですか?

答えて

32

foreach文を使用することはできません。 foreachのは内部イテレータを使用している:

このクラスの反復子によって返さイテレータと反復子 方法フェイルファスト:反復子が作成された後、リストは、構造を除き、どのような方法で、任意の 時点で変更された場合 イテレータ自身のremoveメソッドまたはaddメソッドを使用すると、イテレータは ConcurrentModificationExceptionをスローします。

(のArrayListのjavadocから)

それはで追加されませんので、あなたがイテレータのaddメソッドに、まだしたいアドオンの種類ではありませんいずれの場合のアクセスを持っていないforeach文で終わり。リストを手動でトラバースする必要があります。

int listSize = list.size(); 
for(int i = 0; i < listSize; ++i) 
    list.add("whatever"); 

これは、ランダムアクセスを許可するリストに対してのみ有効であることに注意してください。リストがRandomAccessマーカーインターフェイスを実装しているかどうかをチェックすることで、この機能をチェックできます。 ArrayListにはランダムアクセスがあります。リンクリストはありません。

1

あなたがあなたの元のリストのコピー(クローン)に繰り返すことができます:それを反復しながら、それがになりますので、リストに新しい要素を追加することも可能ではないことを

List<String> copy = new ArrayList<String>(list); 
for (String s : copy) { 
    // And if you have to add an element to the list, add it to the original one: 
    list.add("some element"); 
} 

注意a ConcurrentModificationException

6

リストのコピーを繰り返し、新しい要素を元のリストに追加します。

for (String s : new ArrayList<String>(list))  
{ 
    list.add("u"); 
} 

明示的なインデックス処理を必要とするのでジャスト、昔ながらの方法を反復 How to make a copy of ArrayList object which is type of List?

8

を参照してください:

List myList = ... 
... 
int length = myList.size(); 
for(int i = 0; i < length; i++) { 
    String s = myList.get(i); 
    // add items here, if you want to 
} 
+1

いいえ、そうではありません。イテレータを使用し、反復処理中にalementsを追加するときには使用されますが、ここで反復処理を実行するときは使用できません。 –

+0

OPsは、 "初期サイズまで反復する"ことを望んでいます。 –

+0

Doh!私の読書が悪い –

0

を私はこれを行う、新しい空のtmpリストに要素を追加することにより、 addAll()を使用して元のリストにtmpリストを追加します。これにより、大きなソースリストを不必要にコピーすることを防ぎます。

OPの元のリストに数百万個のアイテムがあるとどうなるか想像してください。しばらくあなたはメモリを2倍吸うでしょう。

リソースを節約することに加えて、この手法では、80sスタイルのループに頼らずに、場合によっては魅力的でない配列インデックスを使用することを防ぐこともできます。

関連する問題