the questions interview framework example collection colecciones java collections

questions - java list



bucle en la lista con eliminar (7)

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?


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

List<String> toRemove = new ArrayList<String>(); 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. :)


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 codificación, 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); } }


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

for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) { String fruit = iterator.next(); if ("banane".equals(fruit)) { iterator.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<String> temp = new ArrayList<String>(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.


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.


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

es el mejor enfoque ...


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