398 Stimmen

Wie vermeidet man die "ConcurrentModificationException", während man Elemente aus einem `ArrayList` entfernt, während man sie durchläuft?

Ich versuche, einige Elemente aus einem ArrayList zu entfernen, während ich es wie folgt durchlaufe:

for (String str : myArrayList) {
    if (someCondition) {
        myArrayList.remove(str);
    }
}

Natürlich erhalte ich eine ConcurrentModificationException, wenn ich versuche, Elemente aus der Liste zu entfernen, während ich gleichzeitig myArrayList durchlaufe. Gibt es eine einfache Lösung für dieses Problem?

9voto

Prashant Bhate Punkte 10508

Während andere vorgeschlagene Lösungen funktionieren, wenn Sie wirklich möchten, dass die Lösung thread-sicher ist, sollten Sie ArrayList durch CopyOnWriteArrayList ersetzen

    //List s = new ArrayList<>(); //Werfen eine Ausnahme
    List s = new CopyOnWriteArrayList<>();
    s.add("B");
    Iterator it = s.iterator();
    s.add("A");

    //Entfernt nur "B" aus der Liste
    while (it.hasNext()) {
        s.remove(it.next());
    }
    System.out.println(s);

8voto

Juned Ahsan Punkte 67561

Wenn Sie Ihre Liste während der Traversierung ändern möchten, müssen Sie den Iterator verwenden. Und dann können Sie iterator.remove() verwenden, um die Elemente während der Traversierung zu entfernen.

7voto

Liste myArrayList  = Collections.synchronizedList(new ArrayList());

//fügen Sie Ihre Elemente hinzu
 myArrayList.add();
 myArrayList.add();
 myArrayList.add();

synchronized(myArrayList) {
    Iterator i = myArrayList.iterator(); 
     while (i.hasNext()){
         Object  object = i.next();
     }
 }

7voto

CarlJohn Punkte 727

Eine alternative Methode besteht darin, Ihre Liste in ein Array umzuwandeln, sie zu durchlaufen und sie basierend auf Ihrer Logik direkt aus der Liste zu entfernen.

List myList = new ArrayList(); // Sie können entweder eine Liste oder eine Menge verwenden

myList.add("abc");
myList.add("abcd");
myList.add("abcde");
myList.add("abcdef");
myList.add("abcdefg");

Object[] obj = myList.toArray();

for(Object o:obj)  {
    if(Bedingung)
        myList.remove(o.toString());
}

2voto

Gilo Punkte 524

Sie können die Iterator remove() Funktion verwenden, um das Objekt aus dem zugrunde liegenden Collection-Objekt zu entfernen. In diesem Fall können Sie jedoch nur das gleiche Objekt aus der Liste entfernen und kein anderes.

aus hier

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X