Saltar al contenido

Cómo evitar java.util.ConcurrentModificationException al iterar y eliminar elementos de una ArrayList

Solución:

Dos opciones:

  • Cree una lista de valores que desea eliminar, agregando a esa lista dentro del bucle, luego llame originalList.removeAll(valuesToRemove) al final
  • Utilizar el remove() método en el propio iterador. Tenga en cuenta que esto significa que no puede usar el bucle for mejorado.

Como ejemplo de la segunda opción, eliminar cualquier cadena con una longitud superior a 5 de una lista:

List<String> list = new ArrayList<String>();
...
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
    String value = iterator.next();
    if (value.length() > 5) {
        iterator.remove();
    }
}

Desde JavaDocs de ArrayList

Los iteradores devueltos por los métodos de iterador y listIterator de esta clase son rápidos: si la lista se modifica estructuralmente en cualquier momento después de que se crea el iterador, de cualquier manera, excepto a través de los métodos de eliminación o adición del iterador, el iterador lanzará una ConcurrentModificationException.

Está intentando eliminar un valor de la lista en el “bucle for” avanzado, lo cual no es posible, incluso si aplica algún truco (lo que hizo en su código). La mejor manera es codificar el nivel de iterador como se recomienda aquí.

Me pregunto cómo la gente no ha sugerido el enfoque tradicional de bucle for.

for( int i = 0; i < lStringList.size(); i++ )
{
    String lValue = lStringList.get( i );
    if(lValue.equals("_Not_Required"))
    {
         lStringList.remove(lValue);
         i--; 
    }  
}

Esto también funciona.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *