Hola Susana83!
Mirando tu codigo se nota que has estudiado sobre la clase Iterator, también puedo ver que has sustituido el bucle for each por un bucle while en conjunto con Iterator y algunos de sus métodos.
Aunque hasta este punto aun el código no funciona como se espera, por el hecho de a ver sustituido el bucle for-each por un bucle while, y haciendo uso de algunos métodos de la clase Iterator en este bucle, se puede decir que tu código a evolucionado en la dirección correcta.
Ahora te are algunas aclaraciones para que seas capas de comprender el porque del error (
java.util.ConcurrentModificationException) en tiempo de ejecución que nos continua saltando al ejecutar el programa, y para que una vez lo asimiles puedas corregirlo.
Cuando recorremos una coleccion digamos que con un bucle for-each y mientras la recoremos intentamos manipular la lista nos salta el error
java.util.ConcurrentModificationException, para corregir esto usamos el método iterator de la clase Iterator sobre la coleccion que queramos recorrer y manipular al mismo tiempo, pero los métodos de manipulación los provee la clase Iterator y se invocan desde el Iterator creado, en este caso "recorrer". Por tanto una sintaxis como:
if (nombre.equals("Barney")) {
list.remove("Barney");
}
dara lugar a que salte el error
java.util.ConcurrentModificationException, la sintaxis correcta seria:
if (nombre.equals("Barney")) {
recorrer.remove();
}
Donde lo que se indica es, que si el ultimo objeto analizado en el Iterator "recorrer" es igual (igualdad, parentesco) al objeto "Barney" pues que se ejecute el metodo.remove(); y elimine este objeto, dicha eliminación se refleja en el ArrayList "list".
Si ahora utilizas un bucle for-each para recorrer y mostrar por pantalla los elementos (objetos) que contiene la colección "list" comprobaras que ahora "Barney" ha sido expulsado (removido, eliminado
) de la familia Simpson, y que ahora esta lista contiene solo 5 objetos.
A continuación te dejo una forma que podría ser una solución a este ejercicio:
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class Ejecutar{
public static void main(String args[]) {
List<String> list = new ArrayList<String>();
list.add("Bart");
list.add("Lisa");
list.add("Marge");
list.add("Barney");
list.add("Homer");
list.add("Maggie");
Iterator<String> recorrer = list.iterator();
while (recorrer.hasNext())
{
String nombre = recorrer.next();
if (nombre.equals("Barney")) {
recorrer.remove();
}else
if(nombre != "Barney"){System.out.println(nombre);}/* Si no se incluye esta condición, pues también se imprimirá "Barney" puesto que la variable (nombre) hasta que
no se inicie el siguiente ciclo, luego de la eliminación de "Barney" en la colección "list" mediante el Iterator "recorrer" tiene como valor "Barney"
Esto es una solución alternativa para mostrar por pantalla los elementos de la colección, así que podrían considerarse otras opciones.*/
}
System.out.println("\nEsta colección ahora contiene: " + list.size() + " objetos." );
}
}
Te recomiendo que lo analices y que realices diferentes pruebas, para que domines mas el tema.
Saludos!