ArrayList を反復処理して要素を削除するときに java.util.ConcurrentModificationException を回避する方法 質問する

ArrayList を反復処理して要素を削除するときに java.util.ConcurrentModificationException を回避する方法 質問する

反復処理したい 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();
    }
}

おすすめ記事