2010-09-28 14 views
8

Chciałbym iterować przez zestaw i usunąć elementy z zestawu, które pasują do niektórych warunków. documentation of iterator nic nie mówi o modyfikacji listy podczas jej iteracji.Java Set iterator, bezpieczny do usuwania elementów?

Czy to możliwe? Jeśli nie, jaki byłby najlepszy sposób na zrobienie tego? Zauważ, że chcę tylko usunąć elementy z zestawu, które są dostarczane przez Iterator.

Edytuj: Szybko pokazano, że jest to możliwe. Czy mogę to zrobić również z następującą składnią?

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

"Czy mogę to zrobić również z następującą składnią?". No. – Thilo

Odpowiedz

16

Tak, można użyć iteracyjnej usunąć bieżący element bezpiecznie:

iterator.remove(); 

javadoc z remove() mówi:

Usuwa określony element z tego zestawu, jeżeli jest obecny (operacja opcjonalna). Bardziej formalnie usuwa element e taki, że (o == null? E == null: o.equals (e)), jeśli ten zestaw zawiera taki element. Zwraca wartość true, jeśli ten zestaw zawierał element (lub równoważny, jeśli zestaw ten zmienił się w wyniku wywołania). (Ten zestaw nie zawiera elementu po powrocie połączeń.)


odpowiedź na twoje następne pytanie: Nie, nie można. Modyfikowanie zestawu podczas iteracji nad nim za pomocą ulepszonej pętli for spowoduje ConcurrentModificationException.

+1

I to jest jedyny sposób, w jaki można modyfikować kolekcję podczas iteracji. Coś innego da ci wyjątek ConcurrentModificationException. – Thilo

+0

Dzięki !!!!!!!!! –

1

Odpowiedź tangens jest poprawna. Jeśli nie używać iterator.remove(), ale usunąć bezpośrednio z zestawu, otrzymasz połączenie wyjątku ConcurrentModificationException

-1

dla (Węzeł n: mySet) { mySet.remove (n); }

nie będzie działać, ponieważ modyfikujesz ustawiony zestaw. Można to jednak zrobić tylko za pomocą iteratora, co nie ma miejsca w ten sposób.

Jest to jedna z wad stosowania ulepszonych pętli.

0

To rzeczywiście poprawić w Javie 8. Teraz można po prostu

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

Powyższy realizowany jest jako metoda default w java.util.Collection i należy zapisać każdy z pisania nudnych pętle. Powiedział, że to powinno działać dla każdego rodzaju kolekcji, a nie tylko Set.

Powiązane problemy