¿Cómo evitar la "ConcurrentModificationException" al eliminar elementos de `ArrayList` mientras se itera? [duplicar]

Resuelto Ernestas Gruodis asked hace 11 años • 10 respuestas

Estoy intentando eliminar algunos elementos de un ArrayListmientras lo itero de esta manera:

for (String str : myArrayList) {
    if (someCondition) {
        myArrayList.remove(str);
    }
}

Por supuesto, obtengo un mensaje ConcurrentModificationExceptioncuando intento eliminar elementos de la lista al mismo tiempo al iterar myArrayList. ¿Existe alguna solución sencilla para resolver este problema?

Ernestas Gruodis avatar Aug 26 '13 23:08 Ernestas Gruodis
Aceptado

Utilice un Iteratory llame a remove():

Iterator<String> iter = myArrayList.iterator();

while (iter.hasNext()) {
    String str = iter.next();

    if (someCondition)
        iter.remove();
}
arshajii avatar Aug 26 '2013 16:08 arshajii

Como alternativa a las respuestas de todos los demás, siempre he hecho algo como esto:

List<String> toRemove = new ArrayList<String>();
for (String str : myArrayList) {
    if (someCondition) {
        toRemove.add(str);
    }
}
myArrayList.removeAll(toRemove);

Esto evitará que tenga que tratar directamente con el iterador, pero requiere otra lista. Siempre he preferido esta ruta por alguna razón.

Kevin DiTraglia avatar Aug 26 '2013 16:08 Kevin DiTraglia

El usuario de Java 8 puede hacer eso:list.removeIf(...)

    List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
    list.removeIf(e -> (someCondition));

Eliminará elementos de la lista para los que se cumpla alguna condición.

Mikhail Boyarsky avatar Apr 22 '2014 17:04 Mikhail Boyarsky

Tienes que usar el método remove() del iterador, lo que significa que no hay bucle for mejorado:

for (final Iterator iterator = myArrayList.iterator(); iterator.hasNext(); ) {
    iterator.next();
    if (someCondition) {
        iterator.remove();
    }
}
Eric Stein avatar Aug 26 '2013 16:08 Eric Stein