Java Setze Iterator, sicher für die Entfernung von Elementen?

8

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%     
Peter Smit 28.09.2010, 07:29
quelle

5 Antworten

16

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 .

    
tangens 28.09.2010, 07:30
quelle
1

Die Antwort von tangens ist korrekt. Wenn Sie iterator.remove () nicht verwenden, sondern direkt aus Set entfernen, erhalten Sie einen Ausnahmeaufruf ConcurrentModificationException

    
vodkhang 28.09.2010 07:33
quelle
0

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. "

    
user85155 28.09.2010 07:35
quelle
0

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 .

    
mindas 30.11.2015 13:47
quelle
-1
  

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.

    
DerMike 28.09.2010 07:40
quelle

Tags und Links