2012-02-06 23 views
3

私はループしたArrayListを持っていて、あるロジックでは特定のインデックスの要素を削除します。ArrayListから複数の項目を削除してインデックスを移動する

しかし、私はArraylistをループしている途中で、ArrayListのサイズと特定の項目のインデックスも変更されているため、予期しない結果が生じます。

とにかくこれを回避するには?

+3

あなたはおそらく 'ConcurrentModificationException'を取得しています。つまり、 'Iterator'を使うことがすべてです。また、リストの途中から要素を定期的に削除する場合は、 'ArrayList'の代わりに' LinkedList'を使用することを検討してください。 –

+0

「予期しない結果」が何であったかを言えば、次に質問が明確になるでしょう。すなわち、「ConcurrentModificationExceptionが発生しました」 –

答えて

10

ここ反復子アプローチのためのコードです - 必要に応じて>独自の条件を代用し、ジェネリックタイプ<を追加します。

Iterator it = list.iterator(); 
while(it.hasNext()){ 
    Object o = it.next(); 
    if(someCondition(o)){ 
     it.remove(); 
    } 
} 

そして、JohnBはコメントで言ったようにあなたがいる場合は、ArrayListのは非常に効率的ではありません大きなリストから多くの項目を削除します。

+0

これは私のために働いた – adrian4aes

3

これを行うには、remove()メソッドを持つイテレータを使用できます。

1

ループのためにIteratorを使用してください。コレクションから要素を削除するために使用できます。

4

Iterator.remove()を使用するか、逆方向に反復処理できます。

List<String> list = ... 
for(int i= list.size()-1; i>=0; i--) 
    if(test(list.get(i))) 
     list.remove(i); // values before `i` are untouched. 

また、カウンターを減らすこともできます。

List<String> list = ... 
for(int i= 0; i < list.size(); i++) 
    if(test(list.get(i))) 
     list.remove(i--); // move i back as there is one less element. 
関連する問題