Autor Tema: CU00667B Iterator api Java. Error java.util.Concurrent Modification Exception  (Leído 2951 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas tardes, dejo mi ejercicio, he intentado ceñirme a lo solicitado, controlando las posibles malas entradas.
Utilizo un semaforo que no deja salir de la aplicación sin añadir al menos un cantante (pero no logré ver donde podia hacer un println que así lo indicara :-)  )

Ahí va :)

Clase CantanteFamoso

Código: [Seleccionar]
public class CantanteFamoso{

    private String nombre;
    private String discoConMasVentas;

    public CantanteFamoso(){ //constructor inicializando atributos con ""
        nombre = "";
        discoConMasVentas = "";
    }

    //Setters
    public void setNombre(String valorNombre){ nombre = valorNombre; }

    public void setDisco(String valorDisco){ discoConMasVentas = valorDisco; }

    //Getters

    public String getNombre(){ return nombre; }

    public String getDisco() { return discoConMasVentas; }
}


Clase ListaCantantesFamosos

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;

public class ListaCantantesFamosos{

    private ArrayList<CantanteFamoso> lista;

    public ListaCantantesFamosos(){
        lista = new ArrayList <CantanteFamoso>();
    }

    public void añadirCantante(String nombre, String disco){
        CantanteFamoso entrada = new CantanteFamoso();
        entrada.setNombre(nombre);
        entrada.setDisco(disco);
        lista.add(entrada);
    }

    public void imprimirArray(){
        CantanteFamoso cantante;
        Iterator <CantanteFamoso > it = lista.iterator();
        while(it.hasNext() ){
            cantante = it.next();
            System.out.println(" Cantante: " + cantante.getNombre() + "   Disco más vendido: " + cantante.getDisco() );
        }
    }
}

Clase EntradaDatos

Código: [Seleccionar]
import java.util.Scanner;
import java.lang.Character;

public class EntradaDatos{

    public EntradaDatos(){ /*vacio*/ }

    public String recogerString(){
      String entrada;
       
        do{
          Scanner escaner = new Scanner(System.in);
           entrada = escaner.nextLine();
        } while(entrada.length()<1);
     
      return entrada;
    }
   
   
   
    public char recogerChar(){

        String entrada;
        char respuesta;

        do{
            System.out.print(" Solo puedes introducir los carácteres (S)i / (N)o ");
            Scanner escaner = new Scanner(System.in);
            entrada = escaner.nextLine();
            respuesta = entrada.charAt(0);
        } while (!entrada.equalsIgnoreCase("s") && !entrada.equalsIgnoreCase("n"));
       
        respuesta = Character.toLowerCase(respuesta);
        return respuesta;
    }

}


Clase GestorLista (Main)

Código: [Seleccionar]
public class GestorLista{
     
   
    public static void main(String [] args){
        String nombre; String disco;
        char opcion;
        boolean semaforo = false;
        // creo nuevo objeto ListaCantantesFamosos
        ListaCantantesFamosos nuevaLista = new ListaCantantesFamosos();
       
        //añado dos cantantes manualmente a la arrayList de la nueva ListaCantantesFamosos
        nuevaLista.añadirCantante("Michael Jackson","Thriller");
        nuevaLista.añadirCantante("Iron Maiden", "The number of the beast");

        nuevaLista.imprimirArray();
       
         do{
           
              EntradaDatos entrada = new EntradaDatos();
                System.out.println(" \n\n ¿Desea introducir los datos de otro cantante ");
                opcion = entrada.recogerChar();
             
               if (opcion == 's'){
                 System.out.println("\n Introduce el nombre de un nuevo cantante ");
                 nombre = entrada.recogerString();
                 System.out.println("\n Introduce el nombre del disco más vendido ");
                 disco = entrada.recogerString();
                 
                 nuevaLista.añadirCantante(nombre,disco);
                 semaforo = true;
                 nuevaLista.imprimirArray();
                 
                }
               
            }while(opcion == 's' || semaforo == false);
           
    }
   
}
« Última modificación: 28 de Marzo 2015, 16:09 por Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola Lorenzo

Tu ejercicio está muy bien.

Aquí te pongo unos comentarios a tu código:

En la clase del main declaras la boolean semaforo que no interviene en el código excepto que le cambias el valor, pero no se usa para decidir la condición del while.

Tus programas tendrán otra vista si dan un mensaje de entrada y otro de salida, por ejemplo:
    System.out.println("Y aqui se terminó el programa");


En tu clase ListaCantantesFamosos creas el método añadirCantante que realiza dos tareas. Una crear un CantanteFamoso y luego añadirlo a su lista.
Crear un cantante es tarea de la clase CantanteFamoso no de la clase ListaCantantesFamosos
Este método en lugar de recibir dos String debería recibir un objeto de tipo CantanteFamoso para añadirlo a su lista.


En la clase EntradaDatos, sin ser un error, que no lo es. No hace falta cargar la clase Character (todo el paquete lang se carga por defecto)

Estas dos líneas tienen el mismo efecto:
    } while(entrada.length()<1);
    } while(entrada.isEmpty());


Te recomiendo recompongas el ejercicio. Adaptando el método añadirCantante de la clase ListaCantantesFamosos para que trabaje con objetos de tipo CantanteFamoso, no con  String

Saludos

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas Toni, he rehecho el ejercicio, cree un constructor para CantanteFamoso(String nombre, String disco).
No me salía ahora hacerlo usando setNombre() setDisco() y el constructor vacio. Era más lío pero hacerse supongo que se podia.

Sobre el boolean semaforo, simplemente lo pongo para que solo iniciar, no se pueda poner 'n' y salir del programa sin añadir mínimo 1 cantante, sin ese boolean podía hacerse No y terminar sin añadir.

El resto lo corregí, como siempre muchas gracias por el tiempo dedicado, enormemente agradecido.

Clase CantanteFamoso

Código: [Seleccionar]
public class CantanteFamoso{

    private String nombre;
    private String discoConMasVentas;

    public CantanteFamoso(){ //constructor inicializando atributos con ""
        nombre = "";
        discoConMasVentas = "";
    }
   
    public CantanteFamoso(String valorNombre, String valorDisco){
        nombre= valorNombre;
        discoConMasVentas = valorDisco; }
       
    //Setters
    public void setNombre(String valorNombre){ nombre = valorNombre; }

    public void setDisco(String valorDisco){ discoConMasVentas = valorDisco; }

    //Getters

    public String getNombre(){ return nombre; }

    public String getDisco() { return discoConMasVentas; }
}

Clase ListaCantantesFamosos

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;

public class ListaCantantesFamosos{

    private ArrayList<CantanteFamoso> lista;

    public ListaCantantesFamosos(){
        lista = new ArrayList <CantanteFamoso>();
    }

    public void añadirCantante(CantanteFamoso entrada){
        lista.add(entrada);
    }

    public void imprimirArray(){
        CantanteFamoso cantante;
        Iterator <CantanteFamoso > it = lista.iterator();
        while(it.hasNext() ){
            cantante = it.next();
            System.out.println(" Cantante: " + cantante.getNombre() + "   Disco más vendido: " + cantante.getDisco() );
        }
    }
}


Clase EntradaDatos

Código: [Seleccionar]
import java.util.Scanner;


public class EntradaDatos{

    public EntradaDatos(){ /*vacio*/ }

    public String recogerString(){
      String entrada;
       
        do{
          Scanner escaner = new Scanner(System.in);
           entrada = escaner.nextLine();
        } while(entrada.isEmpty());
     
      return entrada;
    }
   
   
   
    public char recogerChar(){

        String entrada;
        char respuesta;

        do{
            System.out.print(" Solo puedes introducir los carácteres (S)i / (N)o ");
            Scanner escaner = new Scanner(System.in);
            entrada = escaner.nextLine();
            respuesta = entrada.charAt(0);
        } while (!entrada.equalsIgnoreCase("s") && !entrada.equalsIgnoreCase("n"));
       
        respuesta = Character.toLowerCase(respuesta);
        return respuesta;
    }

}

Clase GestorLista (main)

Código: [Seleccionar]
public class GestorLista{

    public static void main(String [] args){
        String nombre; String disco;
        char opcion;
        boolean semaforo = false;
        // creo nuevo objeto ListaCantantesFamosos
        ListaCantantesFamosos nuevaLista = new ListaCantantesFamosos();

       
        //añado dos cantantes manualmente a la arrayList de la nueva ListaCantantesFamosos

        nuevaLista.añadirCantante(new CantanteFamoso("Michael Jackson","Thriller"));

        nuevaLista.añadirCantante(new CantanteFamoso("Marta Sanchez", "Ni idea"));
        nuevaLista.imprimirArray();

        do{

            EntradaDatos entrada = new EntradaDatos();
            System.out.println(" \n\n ¿Desea introducir los datos de otro cantante ");
            opcion = entrada.recogerChar();

            if (opcion == 's'){
                System.out.println("\n Introduce el nombre de un nuevo cantante ");
                nombre = entrada.recogerString();
                System.out.println("\n Introduce el nombre del disco más vendido ");
                disco = entrada.recogerString();

                nuevaLista.añadirCantante(new CantanteFamoso(nombre,disco));
                semaforo = true;
                nuevaLista.imprimirArray();

            }

        }while(opcion == 's' || semaforo == false);

        System.out.println("\n \n Final del programa");
    }

}

 

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".