2010-09-28 12 views
8

Me gustaría iterar sobre un conjunto y eliminar los elementos del conjunto que coincidan con alguna condición. El documentation of iterator no dice nada acerca de modificar la lista mientras la itera.Java Set iterator, seguro para la eliminación de elementos?

¿Esto es posible? Si no, ¿cuál sería la mejor manera de hacerlo? Tenga en cuenta que solo quiero eliminar elementos del conjunto proporcionados por el iterador.

Editar: Se demostró rápidamente que esto es posible. ¿Puedo hacerlo también con la siguiente sintaxis?

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

"¿Puedo hacerlo también con la siguiente sintaxis?". No. – Thilo

Respuesta

16

Sí, puede utilizar el iterador para retirar el elemento de corriente con seguridad:

iterator.remove(); 

El javadoc de remove() dice:

Elimina el elemento especificado de este conjunto si es presente (operación opcional). Más formalmente, elimina un elemento e tal que (o == null? E == null: o.equals (e)), si este conjunto contiene dicho elemento. Devuelve verdadero si este conjunto contenía el elemento (o de manera equivalente, si este conjunto cambió como resultado de la llamada). (Este conjunto no contendrá el elemento una vez que se devuelve la llamada.)


respuesta a la siguiente pregunta: No, no se puede. Modificar un conjunto al iterar sobre él con un bucle forzado mejorado causará un ConcurrentModificationException.

+1

Y esta es la única forma en que puede modificar la colección mientras itera. Cualquier otra cosa le dará una ConcurrentModificationException. – Thilo

+0

¡¡¡Gracias !!!!!!!!! –

1

La respuesta de tangens es correcta. Si no se utiliza Iterator.remove(), pero elimina directamente del Conjunto, recibirá una llamada de excepción ConcurrentModificationException

0

Esta ist lo .Remove() hace:

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

"elimina de la colección subyacente el último elemento devuelto por el iterador (operación opcional). Este método puede llamarse una sola vez por llamada al siguiente. El comportamiento de un iterador no se especifica si la colección subyacente se modifica mientras la iteración está en progreso de otra manera que no sea llamando a este método. "

-1

para (Nodo n: mySet) { mySet.remove (n); }

no funciona ya que está modificando el conjunto que está iterando. Sin embargo, esto solo se puede hacer utilizando el iterador, que no es el caso de esta manera.

Esto es una desventaja del uso de bucles mejorados.

0

En realidad, esto ha mejorado en Java 8. Ahora puede simplemente

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

Lo anterior se implementa como un método default en java.util.Collection y debe salvar a todos de escribir bucles aburridas. Dicho esto, debería funcionar para cualquier tipo de colección, y no solo para Set.

Cuestiones relacionadas