Una parte del enunciado del ejercicio dice:
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
lo que hace al tercer cantante famoso obligatorio en la lista, en tu ejercicio el tercer cantante famoso es opcional, dando la opción de salir del programa solo con los dos cantantes famosos que están en la lista por defecto. El verdadero objetivo en este ejercicio es dominar el uso de la clase Iterator y sus métodos, así como también dominar el uso de bucles, por lo tanto, que el agregar un tercer cantante a la lista sea una opción no es tan relevante, pero te lo comento porque es parte de lo que pide el enunciado.
Comentarios por clase:
public class EntradaTexto: Una variable de clase siempre ha de ser declarada con el modificador de acceso
private a menos que en una situación especial se requiera lo contrario. Teniendo esto presente cambiamos tu linea de codigo:
public Scanner lector;
por
private Scanner lector;
En este curso en lecciones mas avanzadas encontraras detalles sobre los diferentes modificadores de acceso
(public, protected y private) en java y detalles sobre cuando usar uno u otro.
public class CantanteFamoso: Lo mismo sobre las variables de clase y su tipo de modificador de acceso
(Especificar su tipo de modificador de acceso como
private)
El nombre de los métodos setDiscoVentas(); y getDiscoVentas(); no son apropiados, el nombre de un método set o get debe de ser una combinación de el prefijo set/get + exactamente el mismo nombre de la variable al que tal método este relacionado, debido a que la variable relacionada en este caso es "discoConMasVentas" un nombre correcto para estos métodos podría ser: setDiscoConMasVentas(); y getDiscoConMasVentas();
tu clase CantanteFamoso quedaría mas o menos así:
public class CantanteFamoso {
private String nombre;
private String discoConMasVentas;
public CantanteFamoso() {
nombre = "";
discoConMasVentas = "";
}
public CantanteFamoso(String nombre, String disco) {
this.nombre = nombre;
discoConMasVentas = disco;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setDiscoConMasVentas(String disco) {
discoConMasVentas = disco;
}
public String getNombre() {
return nombre;
}
public String getDiscoConMasVentas(){
return discoConMasVentas;
}
public void verDatosDelCantante()/*Este método nos evita el tener que repetir código en la clase con main, cada vez que deseemos conocer el nombre y disco con mas
ventas de un cantante famoso solo con invocar este método desde la clase con main.*/
{
System.out.println("Nombre: " + nombre + "\nDisco con mas ventas: " + discoConMasVentas + "\n");
}
}
public class ListaCantantesFamosos: Lo mismo sobre las variables de clase y su tipo de modificador de acceso
(Especificar su tipo de modificador de acceso como
private)
En esta clase seria recomendable crear un método "get" para la variable general "listaCantantesFamosos" puesto que al declararla como
private nos generara un error en la clase con main ya que haces uso directo de esta variable en la clase Test, y el modificador de acceso
private priva a otras clases de poder acceder a variables propias de su clase de origen. Tu clase ListaCantantesFamosos quedaría mas o menos así:
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantantesFamosos {
private List<CantanteFamoso> listaCantantesFamosos;//private en vez de public
public ListaCantantesFamosos() {
listaCantantesFamosos = new ArrayList<CantanteFamoso>();
}
public void addCantantes(CantanteFamoso nombre) {
listaCantantesFamosos.add(nombre);
}
public void verCantantesEnLaLista()/*Es preferible que cada clase realice tareas propias de ella misma, por tal motivo creamos este método que usa la clase Iterator
para recorrer la lista de cantantes famosos y ofrecer detalles de cada cantante famoso en la lista, esto ademas nos evita tener que usar varios ciclos (bucles) while
en la clase con main, construyendo así un código mas corto claro y limpio.*/
{
Iterator it = listaCantantesFamosos.iterator();
while(it.hasNext())
{
CantanteFamoso cantante = (CantanteFamoso)it.next();
cantante.verDatosDelCantante();
}
}
public List<CantanteFamoso> getListaCantantesFamosos()/*Este método nos devuelve un ArrayList sobre el cual podremos invocar algunos métodos que nos serán
de utilidad en la clase con main, como por ejemplo, el método size(); ext..*/
{
return listaCantantesFamosos;
}
}
public class Test: Un buen programador tratara de evitar siempre la duplicidad de código, en una clase con main, el no duplicar código es un "reto" que aumenta, puesto que esta clase se encarga de dirigir el programa, por tal motivo a la hora de diseñar un código, debemos de dejar todos los procesos y tareas en su sitio (clase) donde mayor se correspondan, para evitar tener un método main sobrecargado.
Tu clase Test no es que este mal, pero si se puede mejorar, te sugiero analizar el siguiente codigo, editado a partir de tu clase Test:
public class Test {
public Test() {
}
public static void main(String[] args) {
ListaCantantesFamosos lista1 = new ListaCantantesFamosos();
CantanteFamoso Cantante1 = new CantanteFamoso("Michael Jackson", "Thriller");
CantanteFamoso Cantante2 = new CantanteFamoso("Luis Miguel", "Mi jardín oculto");
lista1.addCantantes(Cantante1);
lista1.addCantantes(Cantante2);
EntradaTexto texto = new EntradaTexto();
System.out.println("Tenemos una lista con los siguientes " + lista1.getListaCantantesFamosos().size() + " cantantes famosos:\n");
lista1.verCantantesEnLaLista();
System.out.println("Por favor agrega otro cantante famoso mas a nuestra lista.\n\nIntroduzca nombre del cantante: ");
String cantante, disco;
cantante = texto.leerTexto();
System.out.println("\nIntroduzca nombre del disco mas vendido: ");
disco = texto.leerTexto();
lista1.addCantantes(new CantanteFamoso(cantante, disco));
System.out.println("\nEsta es la lista actualizada:\n ");
lista1.verCantantesEnLaLista();
String volver;
do {
System.out.println("¿Desea añadir algún otro cantante famoso a la lista?(y/n) ");
volver = texto.leerTexto();
if (volver.equals("y")) {
System.out.println("Introduzca nombre del cantante: ");
cantante = texto.leerTexto();
System.out.println("Introduzca nombre del disco mas vendido: ");
disco = texto.leerTexto();
lista1.addCantantes(new CantanteFamoso(cantante, disco));
System.out.println("\nEsta es la lista actualizada:\n");
lista1.verCantantesEnLaLista();
}
else {
System.out.println("\fAsi a quedado nuestra lista de " + lista1.getListaCantantesFamosos().size() + " cantantes famosos:\n");
lista1.verCantantesEnLaLista();
System.out.println("Gracias por ayudarnos con nuestra lista de cantantes famosos\n\nHasta luego!");
}
}while (volver.equalsIgnoreCase("y"));
}
}
Cualquier duda no dudes en preguntar.
Saludos!