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.