¿Cómo evitar la "ConcurrentModificationException" al eliminar elementos de `ArrayList` mientras se itera? [duplicar]
Estoy intentando eliminar algunos elementos de un ArrayList
mientras lo itero de esta manera:
for (String str : myArrayList) {
if (someCondition) {
myArrayList.remove(str);
}
}
Por supuesto, obtengo un mensaje ConcurrentModificationException
cuando intento eliminar elementos de la lista al mismo tiempo al iterar myArrayList
. ¿Existe alguna solución sencilla para resolver este problema?
Utilice un Iterator
y llame a remove()
:
Iterator<String> iter = myArrayList.iterator();
while (iter.hasNext()) {
String str = iter.next();
if (someCondition)
iter.remove();
}
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.
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.
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();
}
}