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