2010-09-28 7 views
8

Je voudrais parcourir un ensemble et supprimer les éléments de l'ensemble qui correspondent à certaines conditions. Le documentation of iterator ne dit rien sur la modification de la liste lors de son itération.Java Set itérateur, sûr pour l'élimination des éléments?

Est-ce possible? Sinon, quelle serait la meilleure façon de le faire? Notez que je veux seulement supprimer des éléments de l'ensemble fournis par l'Iterator.

Modifier: Il a été rapidement montré que cela est possible. Puis-je aussi le faire avec la syntaxe suivante?

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

"Puis-je aussi le faire avec la syntaxe suivante?". – Thilo

Répondre

16

Oui, vous pouvez utiliser l'itérateur pour enlever l'élément courant en toute sécurité:

iterator.remove(); 

Le javadoc de remove() dit:

Supprime l'élément spécifié de cet ensemble si elle est présent (opération optionnelle). Plus formellement, supprime un élément e tel que (o == null? E == null: o.equals (e)), si cet ensemble contient un tel élément. Renvoie true si cet ensemble contient l'élément (ou, de manière équivalente, si cet ensemble a changé à la suite de l'appel). (Cet ensemble ne contient pas l'élément une fois l'appel retourne.)


réponse à la question suivante: Non, vous ne pouvez pas. La modification d'un ensemble en l'itérant avec une boucle for améliorée provoquera un ConcurrentModificationException.

+1

Et c'est la seule façon de modifier la collection pendant l'itération. Tout le reste vous donnera une exception ConcurrentModificationException. – Thilo

+0

Merci !!!!!!!!! –

1

La réponse de tangens est correcte. Si vous n'utilisez pas Iterator.remove() mais supprimer directement de Set, vous recevrez un appel d'exception ConcurrentModificationException

0

Ce ist ce .remove() fait:

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

« Enlève de la collection sous-jacente le dernier élément retourné par l'itérateur (opération optionnelle) Cette méthode ne peut être appelée qu'une seule fois par appel à next Le comportement d'un itérateur est non spécifié si la collection sous-jacente est modifiée alors que l'itération est en cours en appelant cette méthode. "

-1

pour (Node n: mySet) { mySet.remove (n); }

ne fonctionne pas puisque vous modifiez l'ensemble que vous itérez. Cela ne peut toutefois être fait qu'en utilisant l'itérateur, ce qui n'est pas le cas de cette manière.

Ceci est un inconvénient de l'utilisation de boucles améliorées.

0

Cela a effectivement amélioré en Java 8. Maintenant, vous pouvez juste

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

ci-dessus est utilisé comme une méthode default dans java.util.Collection et doit sauver tout le monde d'écrire des boucles ennuyeuses. Cela dit, cela devrait fonctionner pour n'importe quel type de collection, et pas seulement Set.

Questions connexes