Autor Tema: Java. Uso de objeto tipo Iterator.Error java.util.Concurrent. Ejercicio CU00667B  (Leído 3907 veces)

Chompy129

  • Intermedio
  • ***
  • Mensajes: 130
  • Programar es divertido. :)
    • Ver Perfil
Tipo Iterator api Java. Ejemplo. Error java.util.Concurrent ModificationException. Resumen bucles (CU00667B)

Aquí les dejo el ejercicio:

Código Java 1 (CantanteFamoso)
Código: [Seleccionar]
/**
 * Define a un cantante famoso.
 *
 * @author Chompy129
 * @version 1.0
 */
public class CantanteFamoso{
    String nombre;
    String discoConMasVentas;

    public CantanteFamoso(){
    nombre= "desconocido";
    discoConMasVentas= "desconocido";
    }

    //Métodos set
    public void setNombre(String nombre){
    this.nombre= nombre;
    }

    public void setDiscoConMasVentas(String discoConMasVentas){
    this.discoConMasVentas= discoConMasVentas;
    }

    //Métodos get
    public String getNombre(){
    return nombre;
    }

    public String getDiscoConMasVentas(){
    return discoConMasVentas;
    }
}

Código Java 2 (ListaCantantesFamoso)
Código: [Seleccionar]
import java.util.ArrayList;
/**
 * Crea una lista con objetos de tipo CantanteFamoso.
 *
 * @author Chompy129
 * @version 1.0
 */
public class ListaCantantesFamoso{
    private ArrayList<CantanteFamoso> listaCF;

    public ListaCantantesFamoso(){
        listaCF= new ArrayList<CantanteFamoso>();
    }
   
    public ArrayList<CantanteFamoso> getLista(){
        return listaCF;
    }

    public void anadirCantante(String nombreCantante, String discoConMasVentas){
        CantanteFamoso nuevoCantante= new CantanteFamoso();
        nuevoCantante.setNombre(nombreCantante);
        nuevoCantante.setDiscoConMasVentas(discoConMasVentas);
        listaCF.add(nuevoCantante);
    }
}

Código Java 3 (TestListaCantantesFamoso)
Código: [Seleccionar]
import java.util.Iterator;
import java.util.Scanner;
/**
 * Este método main testea el funcionamiento de ListaCantantesFamoso.
 * Hace uso de variables tipo Iterator.
 * @author Chompy129
 * @version 1.0
 */

public class TestListaCantantesFamoso{
    public static void main(String[] args){
        Scanner entradaS= new Scanner(System.in);
        ListaCantantesFamoso lista= new ListaCantantesFamoso();
        lista.anadirCantante("Michael Jackson", "Thriller");
        lista.anadirCantante("Madonna", "All I want is you");

        String nombreNuevo= "";
        String discoMasVendidoNuevo= "";

        boolean inicial= true;

        Iterator<CantanteFamoso> it;
        CantanteFamoso next;

        while(true){
            String m= "";
            it= lista.getLista().iterator();
           
            if (inicial){System.out.println("La lista inicial contiene los siguientes datos:"); inicial= false;}
            else{System.out.println("La lista actualizada contiene los siguientes datos:");}

            while(it.hasNext()){
                next= it.next();
                System.out.print("Cantante: " + next.getNombre() + ".");
                System.out.println("       Disco con más ventas: " + next.getDiscoConMasVentas() + ".");
            }

            System.out.println("Añada un nuevo cantante:");
            System.out.print("- Nombre: ");
            nombreNuevo= entradaS.nextLine();
            System.out.print("- Disco con mas ventas: ");
            discoMasVendidoNuevo= entradaS.nextLine();
            lista.anadirCantante(nombreNuevo, discoMasVendidoNuevo);           

           
           
            System.out.println("¿Desea introducir un nuevo cantante (s/n)?");
            m= entradaS.nextLine();
            if(m.equalsIgnoreCase("s")){
                //Sin accion
            }
            else if(m.equalsIgnoreCase("n")){
                break;
            }
            else{
                System.out.println("Valor interpretado como \"no seguir\".");
                break;
            }
        }
    }//Cierre de método main.
}


Link de la clase: https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=633:tipo-iterator-api-java-ejemplo-error-javautilconcurrent-modificationexception-resumen-bucles-cu00667b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188


RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Hola Chompy129:

He estado analizando tu código y lo veo muy bien, felicitaciones.
Y aprovechando que está muy bien y no veo necesidad de hacer correcciones importantes, sí me gustaría aportar otra forma de codificar la clase 'TestListaCantantesFamoso'.
En esta versión alternativa, introduzco algunos cambios para que los analices y veas si te parecen bien:

1) se ahorra un campo de instancia (boolean inicial), y se resuelve de otra manera aquello para lo cual estaba pensado originalmente.
2) Se cambia la condición while(true) por una solución más elegante, sin tener que salirse del bucle utilizando 'break'.
3) Se crea el método mostrarListaCompleta, que además de ser retulizable dentro de la clase, hace más legible el método main.
4) Se muestra la lista completa por pantalla la primera vez, y cada vez que ingresamos un nuevo cantante. Esa es la manera en que debe proceder nuestro programa (fijarse en el ejemplo de la descripción del ejercicio).

Código: [Seleccionar]
import java.util.Iterator;
import java.util.Scanner;
/**
 * Este método main testea el funcionamiento de ListaCantantesFamoso.
 * Hace uso de variables tipo Iterator.
 * @author Chompy129
 * @version 1.0
 */

public class TestListaCantantesFamoso{
   
    public static void main(String[] args){
        Scanner entradaS= new Scanner(System.in);
        ListaCantantesFamoso lista= new ListaCantantesFamoso();
        lista.anadirCantante("Michael Jackson", "Thriller");
        lista.anadirCantante("Madonna", "All I want is you");

        String nombreNuevo= "";
        String discoMasVendidoNuevo= "";
       
        System.out.println("La lista inicial contiene los siguientes datos:");
        mostrarListaCompleta(lista.getLista().iterator());
        String m= "s";
       
        while(m.equalsIgnoreCase("s")){
           
            System.out.println("Añada un nuevo cantante:");
            System.out.print("- Nombre: ");
            nombreNuevo= entradaS.nextLine();
            System.out.print("- Disco con mas ventas: ");
            discoMasVendidoNuevo= entradaS.nextLine();
            lista.anadirCantante(nombreNuevo, discoMasVendidoNuevo);           

            System.out.println("La lista actualizada contiene los siguientes datos:");
            mostrarListaCompleta(lista.getLista().iterator());
 
            System.out.println("¿Desea introducir un nuevo cantante (s/n)?");
            m= entradaS.nextLine();
           
        }

        System.out.println("Hasta luego.");

    }//Cierre de método main.
   
    private static void mostrarListaCompleta(Iterator<CantanteFamoso> it){
           
        CantanteFamoso next;
     
        while(it.hasNext()){
             next= it.next();
             System.out.print("Cantante: " + next.getNombre() + ".");
             System.out.println("       Disco con más ventas: " + next.getDiscoConMasVentas() + ".");
        }
           
    }
   
} // fin de la clase.

Analízalo y cualquier duda estamos aquí para revisarlo nuevamente.

Chompy129

  • Intermedio
  • ***
  • Mensajes: 130
  • Programar es divertido. :)
    • Ver Perfil
wow, me parece genial tu versión del método main. a lo que iba creando "TestListaCantanteFamoso" tenia pensado crear un método para mostrar el contenido de la lista, pero hice otra alternativa porque en el curso no habían enseñado a crear métodos Static aun. Por cierto, tu solución para salir del bucle while me parece bien también.

Gracias por tomarte el tiempo de revisar el ejercicio, y por compartir tu versión de ello. Te envió un saludo RaGa. :D

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".