bucle en la lista con eliminar

for (String fruit : list) { if("banane".equals(fruit)) list.remove(fruit); System.out.println(fruit); } 

Aquí un bucle con instrucciones de quitar. En el momento de la ejecución, obtengo alguna ConcurrentModificationException, debajo de la salida de la consola:

 Exception in thread "main" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449) at java.util.AbstractList$Itr.next(AbstractList.java:420) at Boucle.main(Boucle.java:14) abricot banane 

Pregunta: ¿Cómo eliminar algún elemento con un bucle?

Necesita usar el iterador directamente y eliminar el elemento a través de ese iterador.

 for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { String fruit = iterator.next(); if ("banane".equals(fruit)) { iterator.remove(); } System.out.println(fruit); } 

Esto parece un poco complicado, ¿por qué no simplemente hacer un ciclo normal? Creo que se ve más limpio y no lanzará este error. Solo defiéndeme si eliminas algo. al menos el mío funciona, de todos modos. Ese tipo de bucles automáticos son más para la conveniencia de encoding, pensé, así que si no son convenientes, entonces simplemente no los use.

 for (int i = list.size() - 1; i>=0; i--) { String fruit = list.get(i); System.out.println(fruit); if ("banane".equals(fruit)) { list.remove(fruit); } } 

Además de usar directamente el Iterator (que recomendaría) también puede almacenar elementos que desea eliminar en una lista diferente.

 List toRemove = new ArrayList(); for (String fruit : list) { if ("banane".equals(fruit)) toRemove.add(fruit); System.out.println(fruit); } for (String fruit : toRemove) { list.remove(fruit); } 

Eso sí, no lo recomiendo, es solo una alternativa. 🙂

Use un ciclo for, y recorra la colección en orden inverso. (Esto significa, comience con el último elemento y bucle con el primer elemento. Al hacerlo, no obtendrá problemas por los índices que cambian debido a la eliminación de elementos de la colección.

Obtiene la excepción en el ejemplo que publica, porque la lista sobre la que itera su iterador ha cambiado, lo que significa que el iterador no es válido.

 for(Iterator iter = list.iterator(); iter.hasNext(); ) { String fruit = iter.next(); if("banana".equals(fruit)) iter.remove(); System.out.println(fruit); } 

Similar a lo que sugirió Bombe, pero en menos líneas de código al iterar en la lista de copias, pero eliminando de la lista original;

 List temp = new ArrayList(list); for (String fruit : temp) { if("banane".equals(fruit)) list.remove(fruit); System.out.println(fruit); } 

Personalmente creo que esto se ve mejor que iterar con un iterador.

 ArrayList list = new ArrayList(Arrays.asList("a", "b", "c", "d")); Iterator iter = list.iterator(); while (iter.hasNext()) { String s = iter.next(); if (s.equals("a")) { iter.remove(); } } 

es el mejor enfoque …