Envío ejercicio para practicar con Iterator
Envío 4 clases: TestListaCantantesFamosos clase con main
import java.util.Iterator;
/**
* Detalles de la clase.
*
* @author (Toni)
* @version (0)
*/
public class TestListaCantantesFamosos {
// Atributos de la clase TestListaCantantesFamosos
//Constructor para objetos de la clase TestListaCantantesFamosos
public TestListaCantantesFamosos() {
// Inicializa atributos
} // Fin del constructor TestListaCantantesFamosos
// Siguen los setters para los atributos de la clase TestListaCantantesFamosos
// Ahora los getters para los atributos de la clase TestListaCantantesFamosos
// Y seguidamente, procedimientos y funciones varios.
public static void main (String [] args) {
ListaCantantesFamosos listaCF = new ListaCantantesFamosos();
// Añadiendo dos cantantes famosos nada más entrar
CantanteFamoso cantanteF = new CantanteFamoso("Madonna","All I want is you");
listaCF.addCantanteNuevo(cantanteF);
cantanteF = new CantanteFamoso("Jorge Negrete","Jalisco");
listaCF.addCantanteNuevo(cantanteF);
// Muestra elementos ArrayList usando un iterator
muestraElementos ("\tLa lista inicial contiene los siguientes elementos:",listaCF);
// A continuación bucle while para añadir cantantes.
boolean masCantantes = true;
String cantante = "", disco = "", lectura = "";
Mensaje mensaje = new Mensaje("",0); // Declaración objeto mensaje. No hace nada en pantalla.
do {
mensaje.muestra ("\tPor favor, introduzca los datos de otro cantante.");
// Crea nuevo cantante famoso
cantanteF = new CantanteFamoso();
// Rellena atributos cantante famoso
cantanteF.setNombre (mensaje.responde ("Cantante:",0));
cantanteF.setDiscoConMasVentas(mensaje.responde (" Disco:",0));
// Añade cantante famoso al ArrayList
listaCF.addCantanteNuevo(cantanteF);
// Muestra elementos ArrayList usando un iterator
muestraElementos ("\tLa lista actualizada contiene los siguientes datos:",listaCF);
// Aquí se decide si añadir más cantantes, o no.
lectura = mensaje.responde ("\t¿Desea introducir los datos de otro cantante (s/n)?",0);
if (lectura.length() == 0) { masCantantes = false; // Se ha pulsado INTRO solamente
} else if (lectura.substring(0,1).
toUpperCase().equals("S")) { // Se ha pulsado "S/s", se pedirá otro cantanteF
} else { masCantantes = false; // Se ha pulsado cualquier otra cosa
} // fin del if
} while (masCantantes);
System.out.println ("\tFinalizada la gestión de la lista de cantantes con sus canciones.");
}// fin del main
// Método que usa iterator para mostrar elementos de un ArrayList
private static void muestraElementos(String msgParam, ListaCantantesFamosos listaParam) {
Iterator <CantanteFamoso> it = listaParam.getArrayList().iterator();
CantanteFamoso tmpCF = new CantanteFamoso();
Mensaje mensaje = new Mensaje (msgParam); // Muestra mensaje recibido
int contador = 0, largoNombre = 0;
String msg = "";
while (it.hasNext()) { // Bucle recorriendo Iterator
tmpCF = it.next();
msg = (++contador + "º Cantante: " + tmpCF.getNombre());
largoNombre = msg.length();
mensaje.muestra (msg + rellenaEspacios(40 - largoNombre) +
" Disco con más ventas: " + tmpCF.getDiscoConMasVentas());
} // fin del while
} // fin de muestraElementos
// Método para alinear texto en pantalla añadiendo caracteres
private static String rellenaEspacios (int numero) {
String respuesta = "";
for (int i = 0; i < numero; i++) { respuesta = respuesta + "."; }
return respuesta;
} // fin de espaciosEnBlanco
} // Fin de la clase TestListaCantantesFamosos
Clase ListaCantantesFamosos, gestiona un ArrayList de objetos
import java.util.ArrayList;
/**
* Detalles de la clase.
* Único atributo, ArrayList listaCantantesFamosos que gestiona lista de objetos CantanteFamoso.
* @author (Toni)
* @version (0)
*/
public class ListaCantantesFamosos {
// Atributos de la clase ListaCantantesFamosos
// CantanteFamoso cantanteAGestionar;
private ArrayList <CantanteFamoso> listaCantantesFamosos;
/**
* Constructor para objetos de la clase ListaCantantesFamosos
*/
public ListaCantantesFamosos() { //(CantanteFamoso miCantante) {
// Inicializa atributos
// cantanteAGestionar = miCantante;
listaCantantesFamosos = new ArrayList <CantanteFamoso>();
} // Fin del constructor ListaCantantesFamosos
// Siguen los setters para los atributos de la clase ListaCantantesFamosos
public void addCantanteNuevo (CantanteFamoso cantanteF) {
listaCantantesFamosos.add (cantanteF);
}
// Ahora los getters para los atributos de la clase ListaCantantesFamosos
public CantanteFamoso getCantanteDeLaLista (int posicion) {
if (posicion >= 0 && posicion < listaCantantesFamosos.size()) {
return listaCantantesFamosos.get(posicion);
} else {
return null;
}
}
public ArrayList<CantanteFamoso> getArrayList () { return listaCantantesFamosos; }
// Y seguidamente, procedimientos y funciones varios.
public int getTamañoLista () { return listaCantantesFamosos.size(); }
public CantanteFamoso removeCantanteDeLaLista (int posicion) {
if (posicion >= 0 && posicion < listaCantantesFamosos.size()) {
return listaCantantesFamosos.remove(posicion); //remove OK
} else {
return null; // remove KO
}// fin del if
}// fin del remove...
} // Fin de la clase ListaCantantesFamosos
Clase CantanteFamoso, crea objetos con dos atributos String.
/**
* Detalles de la clase.
* El objeto de tipo CantanteFamoso tiene dos atributos de tipo String: nombre y discoConMasVentas.
* @author (Toni)
* @version (0)
*/
public class CantanteFamoso {
// Atributos de la clase CantanteFamoso
private String nombre;
private String discoConMasVentas;
//Constructor para objetos de la clase CantanteFamoso
public CantanteFamoso() { // Constructor sin parámetros
nombre = "";
discoConMasVentas = "";
}
public CantanteFamoso(String nombre, String discoConMasVentas) {// Constructor con parámetros
// Inicializa atributos
this.nombre = nombre;
this.discoConMasVentas = discoConMasVentas;
} // Fin del constructor CantanteFamoso
// Siguen los setters para los atributos de la clase CantanteFamoso
public void setNombre (String nombre) { this.nombre = nombre; }
public void setDiscoConMasVentas (String discoConMasVentas) { this.discoConMasVentas = discoConMasVentas; }
// Ahora los getters para los atributos de la clase CantanteFamoso
public String getNombre () { return nombre; }
public String getDiscoConMasVentas () { return discoConMasVentas; }
// Y seguidamente, procedimientos y funciones varios.
} // Fin de la clase CantanteFamoso
Clase Mensaje, envia mensajes a pantalla y devuelve entradas de teclado.
import java.util.Scanner;
/**
* Detalles de la clase. El método presenta mensajes por pantalla... y devuelve entradas de teclado.
* @author (Toni)
* @version (0)
*/
public class Mensaje { // Atributos de la clase Mensaje
private String texto;
private int valor;
/**
* Mostrará el texto con salto de línea final.
*/
public Mensaje (String frase) { //Constructor 1 parámetro para objetos de la clase Mensaje. Inicializa atributos
texto = frase;
valor = 1;
muestra (texto, valor);
}
/**
* Valores param:
* 0 = Sin salto de línea.
* 1, u otro valor = Con salto de línea.
*/
public Mensaje (String frase, int param) {
texto = frase;
valor = param;
muestra (texto, valor);
}
// Siguen los setters para los atributos de la clase Mensaje
public void setTexto (String texto) { this.texto = texto; }
public void setValor (int valor) { this.valor = valor; }
// Ahora los getters para los atributos de la clase Mensaje
public String getTexto () { return texto; }
public int getValor () { return valor; }
// Y seguidamente, procedimientos y funciones varios.
/**
* Mostrar el texto con salto de línea (sin segundo parámetro)
*/
public void muestra (String frase) {
muestra (frase, 1);
}// fin de muestra 1 parámetro
/**
* Valores param:
* 0 = Sin salto de línea.
* 1, u otro valor = Con salto de línea.
*/
public void muestra (String frase, int param) {
texto = frase;
valor = param;
if (valor == 0) { System.out.print (texto + " ");
} else { System.out.println (texto); }
}// fin de muestra 2 parámetros
/**
* Sin segundo parámetro el mensaje incluirá salto de línea. Devuelve entrada de teclado
*/
public String responde (String frase) {
return responde (frase, 1);
}// fin de responde 1 parámetro
/**
* Valores param:
* 0 = Sin salto de línea + entrada por teclado.
* 1, u otro valor = Con salto de línea + entrada por teclado.
*/
public String responde (String frase, int param) {
texto = frase;
valor = param;
muestra (texto, valor);
Scanner entradaEscaner = new Scanner(System.in);
return entradaEscaner.nextLine();
}// fin de responde 2 parámetros
} // Fin de la clase Mensaje
En este ejercicio, me he dado de bruces varias veces con Iterator.
En una clase me iba bien, y en otra no. No entendía porque.
Al final caí en la cuenta, al final me ha entrado en la cabeza.
Yo intentaba ligar el objeto que crea la clase ListaCantantesFamosos con iterator(), cuando debía ligar el atributo de la clase (un ArrayList) con el iterator().
Me costó, pero ahora creo que no se me olvida.
Espero vuestros comentarios.
Saludos.