2010-09-28 1 views
8

Ich würde gerne über ein Set iterieren und die Elemente aus dem Set entfernen, die einer Bedingung entsprechen. Die documentation of iterator sagt nichts über das Ändern der Liste beim Iterieren darüber.Java Set-Iterator, sicher für die Entfernung von Elementen?

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?

for(Node n : mySet) { 
    mySet.remove(n); 
} 
+0

"Kann ich es auch mit der folgenden Syntax tun?". – Thilo

Antwort

16

Ja, der Iterator verwenden können sicher das aktuelle Element zu entfernen:

iterator.remove(); 

Die javadoc von remove() sagt:

Entfernt das angegebene Element aus dieser Reihe, wenn es vorhanden (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 einmal der Aufruf zurückgegeben.)


Antwort auf die nächste Frage: Nein, kann man nicht. Das Ändern einer Menge beim Iterieren mit einer erweiterten for-Schleife führt zu einer ConcurrentModificationException.

+1

Und nur so können Sie die Sammlung während der Iteration ändern. Alles andere wird Ihnen eine ConcurrentModificationException geben. – Thilo

+0

Danke !!!!!!!!! –

1

Die Antwort von Tangens ist korrekt. Wenn Sie nicht iterator.remove() verwenden, sondern entfernen Sie direkt vom Set, erhalten Sie eine Ausnahme Anruf erhalten ConcurrentModificationException

0

Die Übersicht zeigt, was .remove() tut:

http://download.oracle.com/javase/6/docs/api/java/util/Iterator.html#remove%28%29

„Entfernt von der basing collection das letzte Element, das vom Iterator zurückgegeben wird (optionale Operation). Diese Methode kann nur einmal pro Aufruf von next aufgerufen werden. Das Verhalten eines Iterators ist nicht spezifiziert, wenn die zugrunde liegende Auflistung geändert wird, während die Iteration in einer anderen Weise als durch Aufrufen dieser Methode. "

-1

für (Knoten n: mySet) { mySet.remove (n); }

nicht arbeiten, da Sie die Menge ändern, die Sie iterieren. Dies kann jedoch nur unter Verwendung des Iterators erfolgen, was auf diese Weise nicht der Fall ist.

Dies ist ein Nachteil der Verwendung von erweiterten for-Schleifen.

0

Dies hat sich verbessert tatsächlich in Java 8. Jetzt können Sie nur

mySet.removeIf(element -> someConditionMatches());

Die oben als default Verfahren in java.util.Collection implementiert ist und jeder vom Schreiben langweilig Schleifen sparen sollte. Das heißt, es sollte für jede Art von Sammlung funktionieren, und nicht nur Set.