Foros aprenderaprogramar.com
		Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: paramonso en 23 de Septiembre 2018, 11:39
		
			
			- 
				Hola. Dejo el Ejercicio CU00667B del tutorial pdf de programación Java. Tipo Iterator api Java. Error java.util.Concurrent ModificationException.  
 
 Enunciado del Ejercicio
 EJERCICIO
 
 Crea una clase denominada ListaCantantesFamosos que disponga de un atributo ArrayList listaCantantesFamosos que contenga objetos de tipo CantanteFamoso. La clase debe tener un método que permita añadir objetos de tipo CantanteFamoso a la lista. Un objeto de tipo CantanteFamoso tendrá como atributos nombre (String) y discoConMasVentas (String), y los métodos para obtener y establecer los atributos. Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos y añade manualmente dos objetos de tipo CantanteFamoso a la la lista. Usando iterator muestra los nombres de cada cantante y su disco con más ventas por pantalla. Se debe pedir al usuario un nombre y disco con más ventas de otro cantante famoso, y una vez introducidos los datos mostrar la lista actualizada usando iterator. Una vez mostrada la lista actualizada, se debe dar opción a elegir entre volver a introducir los datos de otro cantante o salir del programa (se podrán introducir tantos datos de cantantes como se desee. Para ello usa un bucle while que dé opción a elegir al usuario).
 
 Clase TestListaCantantesFamosos
 import java.io.*;// Para pausar salida por pantalla
 // Aquí el test con el método main ejemplo aprenderaprogramar.com
 public class TestListaCantantesFamosos {
 public static void main (String [ ] args) {
 String nombre,superVentas;// Variables String para recoger nombre y Disco superventas
 String fuera;// Cadena para comparar si es espacio vacio
 boolean fin=false;// Variable booleana si es true finaliza el programa
 
 System.out.print ("EjercicioCU00667B\n\n");
 System.out.print ("Introduzca nombres de cantantes y discos superventas.\nPara finalizar Pulse INTRO solamente\n\n");
 System.out.print ("****************Empezamos el programa**************\n");
 
 ListaCantantesFamosos lista1 = new ListaCantantesFamosos();
 lista1.addCantanteFamoso(new CantanteFamoso("Antonio Machin","Dos Gardenias"));
 lista1.addCantanteFamoso(new CantanteFamoso("Jorge Negrete","Ay Jalisco"));
 
 System.out.println ("\nLa lista esta formada por " + lista1.getTamaño() + " elementos\n");
 lista1.mostrarCantantes();
 System.out.print("\nPULSE INTRO PARA FINALIZAR \n");
 do
 {
 
 System.out.print ("Por favor introduzca Nombre del Cantante :");
 EntradaDeTeclado entrada1 = new EntradaDeTeclado();
 nombre=entrada1.getEntrada();
 fuera=entrada1.getEntrada();//Variable que de cadena para sacar la entrada por teclado
 fin=fuera.substring(0,entrada1.getLongitud ()).equals("");//Si es espacio vacio para salir del bucle
 if(!fin){
 System.out.print ("Nombre del Disco Super Ventas del Cantante :");
 EntradaDeTeclado entrada2 = new EntradaDeTeclado();
 superVentas=entrada2.getEntrada();
 //Añadir nombre y discoSuperventas a la lista
 lista1.addCantanteFamoso(new CantanteFamoso(nombre, superVentas) );
 
 System.out.println ("\nLista actualizada con :" + lista1.getTamaño() + " elementos\n");
 lista1.mostrarCantantes();
 // Pausar la salida por pantalla *******************
 System.out.print("\n******************** PULSE INTRO PARA CONTINUAR ***************\n");
 try{
 System.in.read();
 }catch (IOException ex) {  }
 // Borrar pantalla en windows, si no funciona con otros sistemas operativos comentar la linea
 System.out.print('\u000C');
 System.out.print("\nPULSE INTRO PARA FINALIZAR\n");
 }
 
 }while(!fin);
 // Borrar pantalla en windows, si no funciona con otros sistemas operativos comentar la linea
 System.out.print('\u000C');
 System.out.print ("******************* Gracias ************************\n\n");
 
 System.out.println ("La lista ha quedado formada por " + lista1.getTamaño() + " elementos");
 lista1.mostrarCantantes();
 System.out.print ("\n*****************FIN DEL PROGRAMA ************************");
 } //Cierre del main
 
 } //Cierre de la clase
 
 Clase ListaCantantesFamosos
 //Los import deben ir siempre al principio antes de declarar la clase
 import java.util.ArrayList;//Cargar biblioteca ArrayList
 import java.util.Iterator;//Cargar biblioteca Iterator
 
 public class ListaCantantesFamosos {
 private ArrayList<CantanteFamoso> listaCantantes; //Attributos de la lista
 //Constructor: crea una lista de nombres vacía
 public ListaCantantesFamosos () {
 listaCantantes = new ArrayList<CantanteFamoso>(); //Creamos el objeto de tipo ArrayList
 } //Cierre del constructor
 public void addCantanteFamoso (CantanteFamoso registroCantante) { listaCantantes.add (registroCantante); } //Cierre del método
 public CantanteFamoso getCantanteFamoso(int registroCantante) {return listaCantantes.get(registroCantante);} //Cierre del método
 
 public int getTamaño () { return listaCantantes.size(); } //Cierre del método
 
 public void removeNombre (int registroCantante) {  //Método para borrar
 if (registroCantante >= 0 && registroCantante < listaCantantes.size() ) {
 listaCantantes.remove(registroCantante); }
 else { } //else vacío. No existe nombre para la posición solicitada, no se ejecuta ninguna instrucción
 } //Cierre del método removeNombre
 
 public void mostrarCantantes(){
 Iterator<CantanteFamoso> it = listaCantantes.iterator();
 CantanteFamoso tmpCantante;
 while(it.hasNext()){
 tmpCantante = it.next();
 System.out.println("Cantante: " + tmpCantante.getNombre() + ", Disco Superventas : "+tmpCantante.getSuperVentas());
 }//cierre del while
 }
 } //Cierre de la clase
 
 Clase EntradaDeTeclado
 import java.util.Scanner; //Importación del código de la clase Scanner desde la biblioteca Java
 // Definimos una clase EntradaDeTeclado aprenderaprogramar.com
 public class EntradaDeTeclado {
 private String entradaTeclado; //Variable de instancia (campo) de la clase
 public EntradaDeTeclado ()  { //Constructor
 entradaTeclado="";
 PedirEntrada(); //Esto es una llamada a un método interno. Al crear un objeto ejecutamos el método
 } //Cierre del constructor
 
 public void PedirEntrada ()  {  //Método de la clase
 Scanner entradaEscaner = new Scanner (System.in);
 entradaTeclado = entradaEscaner.nextLine ();     } //Cierre del método pedirEntrada
 public String getEntrada () { return entradaTeclado; } //Cierre del método getEntrada
 
 public int getLongitud ()  {  //Método de la clase
 
 return entradaTeclado.length();
 
 } //Cierre del método getLongitud
 
 
 } //Cierre de la clase
 
 Clase CantanteFamoso
 
 
 public class CantanteFamoso
 {
 // instance variables - replace the example below with your own
 private String nombre;
 private String superVentas;
 // Constructor de la Clase CantanteFamoso
 
 public CantanteFamoso() // Constructor sin parametros
 {
 nombre="";
 superVentas="";
 }//Cierre contructor
 public CantanteFamoso(String nombre, String superVentas) // Constructor con parametros
 {
 this.nombre=nombre;
 this.superVentas=superVentas;
 }//CierreConstructor
 //Metodos setter
 public void setNombre(String nombre){this.nombre=nombre;}
 public void setSuperVentas(String superVentas){this.superVentas=superVentas;}
 //Metodos getter
 public String getNombre(){return nombre;}
 
 public String getSuperVentas(){return superVentas;}
 
 }//Cierre de la clase
 
 Gracias.  :D
- 
				Buenas, el ejercicio cumple con lo requerido. Algunos comentarios.
 
 En la clase ListaCantantesFamosos hay dos métodos que usan un parámetro llamado registroCantante, pero un caso con un significado y en otro caso con otro:
 
 public void addCantanteFamoso (CantanteFamoso registroCantante) { listaCantantes.add (registroCantante); } 
 public CantanteFamoso getCantanteFamoso(int registroCantante) {return listaCantantes.get(registroCantante);}
 
 En el primer caso registrocantente alude a un objeto CantanteFamoso. En el segundo alude a un entero (tipo primitivo). Esto aunque está permitido no es "muy elegante" porque puede originar algo de confusión. Mi recomendación sería usar algo como:
 
 public void addCantanteFamoso (CantanteFamoso registroCantante) { listaCantantes.add (registroCantante); } 
 public CantanteFamoso getCantanteFamoso(int numRegistroCantante) {return listaCantantes.get(numRegistroCantante);}
 
 Que básicamente es lo mismo, pero donde queda un poco más diferenciado que en un caso se alude a un objeto y en el otro a un entero.
 
 Para quien esté siguiendo el curso y consulte este ejercicio, tener en cuenta que hay algún fragmento de código fuera de los contenidos del curso, por  ejemplo:
 
 // Pausar la salida por pantalla *******************
 System.out.print("\n******************** PULSE INTRO PARA CONTINUAR ***************\n");
 try{
 System.in.read();
 }catch (IOException ex) {  }
 
 El ejercicio puede resolverse sin necesidad de este código, para ver un ejemplo consultar https://aprenderaprogramar.com/foros/index.php?topic=2889.0
 
 Salu2
- 
				Gracias por la corrección Ogramar .
 No pensé en diferenciar algo más esto (int registroCantante) ya que así hace alusión al registro no al número de registro.
 Ok. ;)
 Feliz Año 2019
- 
				Igualmente feliz año. A seguir progresando todos!  ;D