反復処理したい ArrayList があります。反復処理中に、同時に要素を削除する必要があります。明らかに、これは をスローしますjava.util.ConcurrentModificationException
。
この問題に対処するためのベストプラクティスは何ですか? 最初にリストを複製する必要がありますか?
ループ自体ではなく、コードの別の部分の要素を削除します。
私のコードは次のようになります:
public class Test() {
private ArrayList<A> abc = new ArrayList<A>();
public void doStuff() {
for (A a : abc)
a.doSomething();
}
public void removeA(A a) {
abc.remove(a);
}
}
a.doSomething
呼び出すかもしれないTest.removeA()
;
ベストアンサー1
2 つのオプション:
- 削除したい値のリストを作成し、ループ内でそのリストに追加し
originalList.removeAll(valuesToRemove)
、最後に呼び出します。 remove()
イテレータ自体のメソッドを使用します。これは、拡張 for ループを使用できないことを意味することに注意してください。
2 番目のオプションの例として、長さが 5 を超える文字列をリストから削除します。
List<String> list = new ArrayList<String>();
...
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
String value = iterator.next();
if (value.length() > 5) {
iterator.remove();
}
}