Vamos por partes.
Tu clase
CantantesFamosos es correcta como está, aunque yo le añadiría un constructor donde se reciban los valores para los atributos.
Y ya puestos, un segundo constructor donde se pueda inicializar el objeto con unos valores "por defecto".
public class CantantesFamosos
{
private String nombre;
private String discoConMasVentas;
//Constructor que recibe valores
public CantantesFamosos(String valorNombre, String valorDiscoConMasVentas) {
nombre = valorNombre;
discoConMasVentas = valorDiscoConMasVentas;
}
//Constructor con valores "por defecto"
public CantantesFamosos() {
nombre = "";
discoConMasVentas = "";
}
public void setNombre (String valorNombre){
nombre = valorNombre;
}
public void setDiscoConMasVentas (String valorDiscoConMasVentas){
discoConMasVentas = valorDiscoConMasVentas;
}
public String getNombre () {return nombre;}
public String getDiscoConMasVentas () {return discoConMasVentas;}
}
En cambio la clase
ListaCantantesFamosos11, sí que hay que corregir cosas.
Su atributo ArrayList, no es para tipo String
public class ListaCantantesFamosos11
{
private ArrayList <String> listaCantantesFamosos;
Será para el tipo
CantantesFamosos, ya que eso es lo que queremos almacenar
public class ListaCantantesFamosos11
{
private ArrayList <CantantesFamosos> listaCantantesFamosos;
Su constructor, tan solo debe inicializar el ArrayList. Nada más.
Tú además has inicializado un objeto CantantesFamosos y un objeto ListaCantantesFamosos11 (mal escrito por cierto porque has puesto que termina en 1 y no en 11)
Esos objetos son innecesarios y no aportan nada al programa.
También has hecho que en el constructor se añadan dos cantantes a la lista. El enunciado dice que estos dos cantantes se añadan en la clase Test, pero bueno, si quieres también podemos hacerlo aquí en el constructor.
public ListaCantantesFamosos11 () {
listaCantantesFamosos = new ArrayList <CantantesFamosos>();
//Añadimos dos objetos CantantesFamosos al ArrayList
listaCantantesFamosos.add(new CantantesFamosos("Ariana Grande", "7 Rings"));
listaCantantesFamosos.add(new CantantesFamosos("Ed Sheeran", "="));
}
Fíjate que para añadir esos dos objetos, utilizo el constructor de
CantantesFamosos que recibe valores para los atributos, ya que es lo más cómodo.
Bien, ¿qué métodos vamos a necesitar para esta clase?
Para empezar, uno que permita añadir más objetos al ArrayList
public void addCantante(CantantesFamosos cantante) {
listaCantantesFamosos.add(cantante);
}
Luego, la lista de cantantes ha de ser recorrida con un Iterator. Entonces, aquí tenemos dos opciones.
Una, es usar un método que retorne el iterador para que desde otra clase distinta, pueda recogerse y recorrer la lista desde ahí. Es recomendable (no obligatorio) especificar de que clase son los objetos que contiene el Iterator que se está retornando:
public Iterator<CantantesFamosos> getIterador() {
return listaCantantesFamosos.iterator();
}
La otra opción, es usar el Iterator de forma interna, sin retornar nada. O sea, hacemos un método que se encargue el mismo de recorrer y mostrar la lista.
Podemos también añadir una comprobación extra, si se diera el caso de que la lista esta vacía que muestre un mensaje informando.
En caso contrario, pues entonces sí creamos un Iterator y recorremos los objetos de la lista.
public void mostrarListaCantantes() {
System.out.println("\n\t\tLISTA CANTANTES FAMOSOS\n");
if (listaCantantesFamosos.isEmpty())
System.out.println("La lista de cantantes esta vacía...");
else {
//Creamos iterador
Iterator<CantantesFamosos> it = listaCantantesFamosos.iterator();
while (it.hasNext()) {
//Obtenemos el siguiente objeto del iterador
CantantesFamosos cantante = it.next();
//Mostramos sus valores
System.out.println("Nombre: " + cantante.getNombre() + " -- Disco Top Ventas: " + cantante.getDiscoConMasVentas());
}
}
}
Y ya está, no se necesita nada más para esta clase. Podemos dejar escrita en ella las dos posibilidades para el Iterator, para que sirva de ejemplo.
import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantantesFamosos11
{
private ArrayList <CantantesFamosos> listaCantantesFamosos;
public ListaCantantesFamosos11 () {
listaCantantesFamosos = new ArrayList <CantantesFamosos>();
//Añadimos dos objetos CantantesFamosos al ArrayList
listaCantantesFamosos.add(new CantantesFamosos("Ariana Grande", "7 Rings"));
listaCantantesFamosos.add(new CantantesFamosos("Ed Sheeran", "="));
}
public void addCantante(CantantesFamosos cantante) {
listaCantantesFamosos.add(cantante);
}
//Retorna un Iterator para que la lista puede recorrerse de forma EXTERNA desde otra clase
public Iterator<CantantesFamosos> getIterador() {
return listaCantantesFamosos.iterator();
}
//Usa un Iterator para recorrer la lista de forma INTERNA
public void mostrarListaCantantes() {
System.out.println("\n\t\tLISTA CANTANTES FAMOSOS\n");
if (listaCantantesFamosos.isEmpty())
System.out.println("La lista de cantantes esta vacía...");
else {
//Creamos iterador
Iterator<CantantesFamosos> it = listaCantantesFamosos.iterator();
while (it.hasNext()) {
//Obtenemos el siguiente objeto del iterador
CantantesFamosos cantante = it.next();
//Mostramos sus valores
System.out.println("Nombre: " + cantante.getNombre() + " -- Disco Top Ventas: " + cantante.getDiscoConMasVentas());
}
}
}
}
Y vamos ahora con la clase Test principal.
Lo primero será crear un objeto Scanner para pedir datos y un objeto para la lista de cantantes famosos.
Como hemos hecho que su constructor añada directamente dos cantantes, una vez construido ya podemos mostrar en pantalla la lista de cantantes actual.
Y tras eso pasaríamos a preguntar al usuario si quiere añadir más cantantes o no.
Para añadir nuevos cantantes, podemos usar cualquiera de los dos constructores que le hemos puesto a la clase
CantantesFamosos.
Antes, al inicializar el ArrayList, hemos usado el constructor que recibe los valores.
Ahora, para variar, podemos usar el que NO recibe valores, y por tanto, se han de usar los
setters para establecer los valores del nuevo objeto creado.
public class TestListaCantantesFamosos11
{
public static void main (String [] args){
Scanner entradaEscaner = new Scanner (System.in);
//El constructor de este objeto, ya añade dos cantantes automáticamente
ListaCantantesFamosos11 listaCantantesFamosos = new ListaCantantesFamosos11();
listaCantantesFamosos.mostrarListaCantantes();
//A partir de aquí, el usuario decide si quiere ampliar la lista
String respuesta = "";
while (!respuesta.equals("no")) {
System.out.print("\nAgregar otro cantante a la lista?(si/no): ");
respuesta = entradaEscaner.nextLine();
if (!respuesta.equals("no")) {
//Creamos nuevo cantante
CantantesFamosos nuevo = new CantantesFamosos();
//Pedimos datos
System.out.print("Nombre del Cantante: ");
nuevo.setNombre(entradaEscaner.nextLine());
System.out.print("Disco mas vendido: ");
nuevo.setDiscoConMasVentas(entradaEscaner.nextLine());
//Añadimos a la lista
listaCantantesFamosos.addCantante(nuevo);
//Mostramos lista actualizada
listaCantantesFamosos.mostrarListaCantantes();
}
}
System.out.println("\n\n\t\tFIN DE PROGRAMA");
entradaEscaner.close();
}
}
Y con esto ya estaría completo el ejercicio.
En tu clase principal, hay algunos errores conceptuales.
Por ejemplo, pedias nombre y disco más vendido para guardarlos en un String. Esto podría estar bien.
Pero luego a esos String, le intentas aplicar los
getters que corresponde a la clase
CantantesFamosos System.out.println("Ingrese un cantante famoso: ");
String entrada1 = entradaEscaner.nextLine();
System.out.println("Ahora el disco con más venta de ese cantante: ");
String entrada2 = entradaEscaner.nextLine();
listaCantantesFamosos.addNombre(entrada1.getNombre());
listaCantantesFamosos.addNombre(entrada2.getDiscoConMasVentas());
Espero que viendo el código que he escrito, se disipen estos errores de concepto.
No dudes en preguntar cualquier cosa que no entiendas, aunque pienses que es una tontería.
Un saludo.