Autor Tema: Ejercicio CU00667B recorrer colecciones con iterator java  (Leído 3848 veces)

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Envío ejercicio para practicar con Iterator

Envío 4 clases: TestListaCantantesFamosos clase con main
Código: [Seleccionar]
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
Código: [Seleccionar]
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.
Código: [Seleccionar]
/**
 * 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.
Código: [Seleccionar]
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.
« Última modificación: 31 de Agosto 2014, 19:04 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio CU00667B
« Respuesta #1 en: 10 de Julio 2014, 22:17 »
Hola toni, bienvenido al club de los que nos damos de bruces ;) Tal como dices iterator va ligado a una colección de datos, como por ejemplo un ArrayList, un LinkedList o cualquier otra colección.

El código en general se ve bien construido y usando correctamente los elementos de la programación Java.

Hay un pasaje del código en el que nos podemos fijar:

        CantanteFamoso cantanteF = new CantanteFamoso("Madonna","All I want is you");
        listaCF.addCantanteNuevo(cantanteF);
        cantanteF = new CantanteFamoso("Jorge Negrete","Jalisco");
        listaCF.addCantanteNuevo(cantanteF);


En realidad el código que pongo a continuación corresponde a lo que se explica en la entrega CU00668B, que te recomiendo que leas antes. Lo que quería decirte es que pruebes esto a ver si funciona, y si logras que funcione, que reflexiones sobre qué ventajas e inconvenientes puede tener hacerlo de una forma u otra:

        listaCF.addCantanteNuevo(new CantanteFamoso("Madonna","All I want is you"));
        listaCF.addCantanteNuevo(new CantanteFamoso("Jorge Negrete","Jalisco"));


Finalmente hay una cosa con la que no estoy muy de acuerdo, aunque quizás si me explicaras por qué lo has hecho así cambiaría de opinión. ¿Por qué el método muestraElementos está en la clase con el main y no en la clase ListaCantantesFamosos? Te lo digo porque a priori parece más un método que debería estar asociado a la clase, porque su trabajo es principalmente hacer algo relacionado o propio de objetos de la clase, no de conducción del programa.

Saludos,

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00667B
« Respuesta #2 en: 11 de Julio 2014, 07:55 »
Hola Alex. Gracias por tus observaciones.

Comparo mi código:
Citar
CantanteFamoso cantanteF = new CantanteFamoso("Madonna","All I want is you");
        listaCF.addCantanteNuevo(cantanteF);
        cantanteF = new CantanteFamoso("Jorge Negrete","Jalisco");
        listaCF.addCantanteNuevo(cantanteF);

Con el que propones:
Citar
listaCF.addCantanteNuevo(new CantanteFamoso("Madonna","All I want is you"));
        listaCF.addCantanteNuevo(new CantanteFamoso("Jorge Negrete","Jalisco"));

Y veo lo siguiente:
Yo.  1) Creo un cantanteF. 2) Lo añado a la lista.
Tu.  1) Añades a la lista un cantanteF creado "in situ"

Comentarios: Yo. Desmenuzo los pasos para no atragantarme, pudiendo seguir los pasos uno a uno. ::)
Tu. Das una zancada y llegas a destino en un tiro. :o

Resumen: Tu código es, compacto, directo, sin intermediarios. 10 puntos.
El mio, es fácil de leer y entender para un principiante. 5 puntos.

Conclusión: La abstracción es una cualidad envidiable de la mente. Cualidad que necesita neuronas bien conectadas y práctica.
Espero que con la práctica, se me conecten bien las neuronas, y pueda comprender la  evidencia de lo que tengo delante sin tener que dar vueltas alrededor para comprenderlo.

Respecto al método "muestraElementos". No intentes buscarle una razón al hecho colocarlo en la clase del main en lugar de la clase nativa del ArrayList.
Lo que ha ocurrido, es que simplemente quería sacar ese código del main, y lo puse a continuación, sin pensar que el mejor lugar era la clase que gestionaba el ArrayList.

Por otra parte, recurriendo al refranero (No hay mal que por bien no venga) el hecho de querer manipular el ArrayList fuera de su clase, me he hecho ver la diferencia entre ligar un ArrayList con un iterator e intentar hacer lo mismo con un objeto que contiene un ArrayList.

Gracias por todo. Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".