Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Lorenzo31 en 27 de Marzo 2015, 17:21

Título: CU00667B Iterator api Java. Error java.util.Concurrent Modification Exception
Publicado por: Lorenzo31 en 27 de Marzo 2015, 17:21
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);
           
    }
   
}
Título: Re:CU00667B Tipo Iterator api Java. Ejemplo. Error java.util.Concurrent Modificatio
Publicado por: toni_apr en 27 de Marzo 2015, 21:16
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
Título: Re:CU00667B Tipo Iterator api Java. Ejemplo. Error java.util.Concurrent Modificatio
Publicado por: Lorenzo31 en 27 de Marzo 2015, 22:33
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");
    }

}