Ich würde gerne über ein Set iterieren und die Elemente aus dem Set entfernen, die einer Bedingung entsprechen. Die Dokumentation des Iterators sagt nichts über das Ändern der Liste aus während ich darüber iteriere.
Ist das möglich? Wenn nicht, was wäre der beste Weg, dies zu tun? Beachten Sie, dass ich nur Elemente aus dem Set entfernen möchte, die vom Iterator bereitgestellt werden.
Bearbeiten : Schnell wurde gezeigt, dass dies möglich ist. Kann ich das auch mit folgender Syntax machen?
%Vor%Ja, Sie können den Iterator verwenden, um das aktuelle Element sicher zu entfernen:
%Vor% Das Javadoc von remove()
sagt:
Entfernt das angegebene Element aus diesem Set, wenn es vorhanden ist (optionale Operation). Formal entfernt man ein Element e so, dass (o == null? E == null: o.gleiche (e)), wenn diese Menge ein solches Element enthält. Gibt true zurück, wenn dieser Satz das Element enthält (oder äquivalent, wenn dieser Satz sich infolge des Aufrufs geändert hat). (Dieser Satz enthält das Element nicht mehr, wenn der Aufruf zurückgegeben wird.)
Beantworten Sie Ihre nächste Frage: Nein, Sie können nicht. Das Modifizieren einer Menge beim Iterieren mit einer erweiterten for-Schleife führt zu einem ConcurrentModificationException
.
Dies ist was .remove () tut:
"Entfernt das letzte vom Iterator zurückgegebene Element (optionale Operation) aus der zugrunde liegenden Auflistung. Diese Methode kann nur einmal pro Aufruf von next aufgerufen werden. Das Verhalten eines Iterators ist nicht angegeben, wenn die zugrunde liegende Auflistung während der Iteration geändert wird auf irgendeine andere Weise als durch Aufruf dieser Methode. "
Dies hat sich in Java 8 verbessert. Jetzt können Sie einfach
mySet.removeIf(element -> someConditionMatches());
Das Obige ist als default
Methode in java.util.Collection
implementiert und sollte jeden davor bewahren, langweilige Schleifen zu schreiben. Das heißt, es sollte für jede Art von Sammlung funktionieren und nicht nur für Set
.
für (Knoten n: mySet) { mySet.remove (n); }
funktioniert nicht, da Sie die Menge ändern, die Sie gerade durchlaufen. Dies kann jedoch nur mit dem Iterator erfolgen, was auf diese Weise nicht der Fall ist.
Dies ist ein Nachteil der Verwendung von erweiterten for-Schleifen.