¡Hola maxplanck!
El ejercicio funciona correctamente, pero hay algunas cosas que puedes cambiar para mejorarlo.
Has hecho una cosa que yo también hacía al principio: cada vez que quieres leer un mensaje de teclado, creas un objeto Scanner; esto no es necesario, basta con crear uno. Lo he puesto en la parte de arriba, donde se declaran los atributos de la clase, para que puedas usarlo en todos los métodos.
En segundo lugar, no necesitas escribir while (it.hasNext()==true) cuando usas un iterador porque it.hasNext() ya te devuelve un booleano. Es decir, bastaría con poner while (it.hasNext()). Para hacerlo más sencillo, he cambiado un poco el código del método preguntar() y he puesto que la condición sea while (ent.equalsIgnoreCase("S")) (así te ahorras la variable booleana si).
He borrado el null del iterador, porque no es necesario. También he eliminado la palabra static de los métodos.
ListaCantantesFamosos
import java.util.*;
public class ListaCantantesFamosos {
private static ArrayList<CantanteFamoso> lista1;
private Scanner tec;
public ListaCantantesFamosos () {
lista1 = new ArrayList<CantanteFamoso>();
tec = new Scanner (System.in);
}
public void listaInicial () {
CantanteFamoso cantorA = new CantanteFamoso ("Siniestro Total" , "¿Cuándo se come aquí?");
lista1.add(cantorA);
CantanteFamoso cantorb = new CantanteFamoso ("The Smiths" , "¿The Queen is dead?");
lista1.add(cantorb);
}
//public static String getDisc1 (int poss2) {return (lista1.get(poss2)).getDisco();}
public void listar() {
CantanteFamoso cantorX;
Iterator<CantanteFamoso> it = lista1.iterator();
while (it.hasNext()) {
cantorX = it.next();
System.out.println ("Nombre del cantante/grupo: " + cantorX.getNombre() + "; Nombre del disco: " + cantorX.getDisco());
}
}
public void preguntar(){
String ent = "S";
while (ent.equalsIgnoreCase("S")){
System.out.println ("¿Desea añadir otra entrada?: S/N");
ent = tec.nextLine();
while (!ent.equalsIgnoreCase("N")&&!ent.equalsIgnoreCase("S")) {
System.out.println ("Entrada no válida.");
ent = tec.nextLine();
}
if (ent.equalsIgnoreCase ("S")) {
nuevo();
}
else if (ent.equalsIgnoreCase ("n")) {
System.out.println ("Fin del programa, gracias por colaborar.");
System.out.println ("La lista definitiva es:");
listar();
}
}
}
public void nuevo () {
CantanteFamoso cantorX;
String ent1 = "";
System.out.println ("Introduzca nuevo nombre de cantante/grupo.");
ent1 = tec.nextLine();
String ent2 = "";
System.out.println ("Introduzca nuevo nombre disco.");
ent2 = tec.nextLine();
cantorX = new CantanteFamoso(ent1,ent2);
lista1.add(cantorX);
System.out.println ("La nueva lista es:");
listar();
}
}
En la clase main, has hecho una cosa un poco rara, y creo que por eso te has visto obligado luego a poner static en los métodos de ListaCantantesFamosos. Has creado un objeto de tipo ListaCantantesFamosos al que has llamado listaT, pero luego, en vez de aplicar los métodos a este objeto, has escrito ListaCantantesFamosos.listar(), etc. Yo lo haría así:
TestLista
import java.util.*;
public class TestLista {
public static void main (String[] args) {
ListaCantantesFamosos listaT = new ListaCantantesFamosos ();
listaT.listaInicial();
System.out.println ("La lista actual contiene las siguientes entradas:");
listaT.listar();
listaT.preguntar();
}
}
Espero que te sirva. ¡Un saludo!