Autor Tema: entender el código java dificultad con iterator cómo usarlo CU00667B  (Leído 4948 veces)

Pasandav

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Mi solución al ejercicio CU00667B tipo Iterator.

Como en el ejercicio anterior: No consigo sacar el objeto muestraEnPantalla ni de la clase ListaCantantesYDiscos ni de la clase RegistroTeclado, (no se como mandar los datos si salirme del do-while).

El iterator lo he tenido que mirar por el foro. No entiendo lo de: "CantanteYDisco tmp;" y "tmp = copiaDeLista.next();", no lo hubiera sabido hacer así nunca.  :'(

Espero opinión.

Muchas gracias por todo.


Código: [Seleccionar]
/**
 * Write a description of class TestCantantes3 here.
 *
 * @author (David Martinez)
 * @version (1.0)
 */
public class TestCantantesYDiscos     // Inicio de clase.
{
    public TestCantantesYDiscos()     // Constructor sin parametros.
    {     
    }

    public static void main (String []args)     // Inicio del main.
    {
        CantanteYDisco objCantante = new CantanteYDisco();      // Creamos un objeto "objCantante" de la clase "CantanteFamoso" sin parametros (vacío)..
        ListaCantantesYDiscos listaCantantes = new ListaCantantesYDiscos ();  // Creamos un objeto "listaCantantes" de la clase ListaCantantesYDiscos.
        VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
        RegistroTeclado teclado = new RegistroTeclado();
       
        listaCantantes.addDatos(new CantanteYDisco  ("Michael Jackson","Thriller"));  // Añadimos con metodo de ArrayList, un nuevo objeto CantanteFamoso  , con parametros
        listaCantantes.addDatos(new CantanteYDisco ("El último de la fila","Astronomía razonable"));      // ¿ Porque no, (new objCantante ("El ultimo de la fila","Astonomía razonable")); ?
             
        muestraEnPantalla.encabezadoDeLista("inicial");   // Muestra en pantalla mensaje con parametro que indica si es lista "inicial" o "actualizada".
        listaCantantes.listadoCompleto();   // Metodo de ListaCantantes que recorre y muestra los datos de la lista.
       
        int repetir = 0;    // Reinicializamos variable que controlará el while (1= s, 2 = n, 0 = otra letra).
         
        while (repetir !=2) // repetir es 2 cuando se contesta n a "volver a introducir"
        {
            muestraEnPantalla.solicitudDeDatos ("los datos","cantante");   // Metodo que muestra en pantalla que introduzcamos los "dato" del "tipo".
            String nombreCantante = teclado.solicitudEntradaTeclado();  // Almacena en "nombreCantante" lo registrado en el metodo solicitudEntradaTeclado.
                 
            muestraEnPantalla.solicitudDeDisco();   
            String nombreDisco = teclado.solicitudEntradaTeclado();     // Metodo que muestra en pantalla que introduzcamos el nombre del disco.
                 
            listaCantantes.addDatos(new CantanteYDisco (nombreCantante,nombreDisco)); // Añade el nuevo cantante y disco a la lista con el metodo añadeDatos.
                 
            muestraEnPantalla.encabezadoDeLista("actualizada");   // Muestra en pantalla mensaje con parametro que indica si es lista "inicial" o "actualizada".
            listaCantantes.listadoCompleto();   // Metodo de ListaCantantes que recorre y muestra los datos de la lista.
           
            muestraEnPantalla.volverAIntoducirDatos("datos","cantante");   // Muestra en pantalla si se quieren introducir más datos.
            String siONo = teclado.solicitudEntradaTeclado();   // Almacena lo tecleado en la variable "siOno".
            repetir = teclado.seguirIntroduciendoDatos(siONo);  // Metodo que comprueba que tecla se ha introducido y devuelve un valor a "repetir".
         }
     }
}

Código: [Seleccionar]
/**
 * Clase que crea el objeto CantanteFamoso y realiza consultas en sus datos.
 *
 * @author (David Martínez)
 * @version (1.0)
 */
public class CantanteYDisco
{
    private String nombre;
    private String discoConMasVentas;

    public CantanteYDisco()
    {
        nombre = "";
        discoConMasVentas = "";
    }
   
     public CantanteYDisco(String nombre,String cancion)
     {
         this.nombre = nombre;
         this.discoConMasVentas = cancion;
    }

    public String consultaCantante() { return nombre; }
   
    public String consultaDisco() { return discoConMasVentas; }
}

Código: [Seleccionar]
/**
 * Clase que muestra los mensajes por pantalla.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class VisualizadorDeMensajes
{   
    public VisualizadorDeMensajes()
    {     
    }
   
    public void solicitudDeDatos(String dato,String tipo)   // Metodo para mostrar mensaje de introducción de datos
    {
       System.out.println("\nPor favor, introduzca " + dato + " de " + tipo +".");
    }
   
    public void solicitudDeDisco()    // Muestra la solicitud de introducir Disco.
    {
        System.out.println("Disco con más ventas:");
    }
   
    public void volverAIntoducirDatos(String dato,String tipo) // Muestra la pregunta de seguir introduciendo datos.
    {
    System.out.println("¿Desea introducir "+ dato + " de otro/a " + tipo +"? (S/N): ");
    }
   
    public void entradaIncorrecta() // Muestra que hay que introducir o S o N.
    {
        System.out.println("Por favor, responda (S/N): ");   
    }
   
    public void encabezadoDeLista(String tipo) // Muestra el encabezado de la lista.
    {
     System.out.println("La lista " + tipo + " contiene los siguientes datos:" ); 
    }
   
    public void listaPosicionYCantante (int posicion,String nombre)
    {
       System.out.println("En posicion: " + posicion + " - " + nombre ); 
   
    }
   
    public void listaCantanteYDisco(String nombre,String disco)    // Muestra el dato de ArrayList de situado en "posicion" y "nombre"
    {
      System.out.println("Cantante: " + nombre.toUpperCase() + "  Disco con más ventas: " + disco.toUpperCase() ); 
    }   
}

Código: [Seleccionar]
import java.util.Scanner;
/**
 * Write a description of class RegistroTeclado here.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class RegistroTeclado
{
    String teclado; // Variable para crear objeto Scanner.
    VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
   
    public  RegistroTeclado()   // El constructor llama al metodo que crea el objeto Scanner
    {
    }
   
    public String solicitudEntradaTeclado() // Metodo que crea el objeto Scanner.
    {
       Scanner teclado = new Scanner (System.in);
       String registroTeclado = teclado.nextLine();
       return registroTeclado;   // Devuelve el texto introducido como String
    } 
   
    public int seguirIntroduciendoDatos(String seguir) // Comprueba si se introduce "s", "n" u otra letra
    {
        int respuesta=0;
       
        do{ // Bucle que se repite, mientras "respuesta = 0".
            if (seguir.equalsIgnoreCase("s")) { respuesta = 1;}   // si se recibe "s" respuesta = 1 (Se introducen más datos.
            else if (seguir.equalsIgnoreCase("n")){ respuesta = 2;}   // Si se recibe "n" respuesta = 2 (No se introducen más datos.
            else {
                    muestraEnPantalla.entradaIncorrecta(); // Si no es ni "s" ni "n", Se muestra mensaje aclaratorio.
                    seguir = solicitudEntradaTeclado().toLowerCase();   // Se vuelve a socilitar la introdución de datos.
                 }
        } while (respuesta==0); // Fin de Do-While.
   
        return respuesta;   // Devuelve el valor de "respuesta" (1 o 2)
    }
   
}

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;

/**
 * Write a description of class ListaNombres here.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class ListaCantantesYDiscos
{   
     ArrayList <CantanteYDisco> listaDeCantantes;
     VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
     
    public ListaCantantesYDiscos () // Constructor, crea una lista y añade 3 nombres
    {
         listaDeCantantes = new ArrayList <CantanteYDisco>();
    } // Cierre del constructor.
   
    public void addDatos (CantanteYDisco datos)
    {
        listaDeCantantes.add (datos);
    }
       
    public void listadoCompleto()
    {
        Iterator <CantanteYDisco> copiaDeLista = listaDeCantantes.iterator();
        CantanteYDisco tmp;
       
        while (copiaDeLista.hasNext())
        {
            tmp = copiaDeLista.next();
            muestraEnPantalla.listaCantanteYDisco (tmp.consultaCantante(),tmp.consultaDisco());
        }
    }
} // Cierre del clase.
 
   
« Última modificación: 03 de Noviembre 2015, 09:06 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Solución: Tipo Iterator - CU00667B
« Respuesta #1 en: 26 de Octubre 2015, 12:33 »
Hola David, si no entiendes el código no te sirve como ejercicio ni como aprendizaje. Te recomiendo, aunque sea costoso, hacer lo siguiente. Empieza el ejercicio desde cero y vete escribiendo código (que entiendas bien lo que estás haciendo) hasta el momento donde no sepas resolver algo. En ese momento pega el código que tengas desarrollado y explica qué es lo que no sabes resolver o te da error. De esa manera te podremos aconsejar para que seas capaz tú mismo de completar el código y que realmente te sea útil para aprender.

Saludos

Pasandav

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:entender el código java dificultad con iterator CU00667B
« Respuesta #2 en: 26 de Octubre 2015, 14:44 »
Lo que no entiendo es:
En la clase "ListaCantantesYDiscos", el método "listadoCompleto" cuando creo el Iterator, la utilización de "CantanteYDisco tmp" y luego el poder usar ese tmp con los métodos de CantanteYDisco.
Creo que eso no lo había visto aun. (Aunque probablemente esté equivocado).

Gracias por todo.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:entender el código java dificultad con iterator CU00667B
« Respuesta #3 en: 27 de Octubre 2015, 08:55 »
Hola, una clase no es correcto que se llame CantanteYDisco. Una clase representa algo concreto, no debe representar dos cosas a la vez. La clase debe representar o bien un Cantante, o bien un Disco, pero no ambas cosas.

Importante leer estas indicaciones: https://www.aprenderaprogramar.com/foros/index.php?topic=3035.msg13698#msg13698

El código no sigue las indicaciones del ejercicio CU00667B, por ejemplo no existe una clase ListaCantantesFamosos.

Para poder validar si se cumple lo que pide el ejercicio es necesario seguir las pautas del mismo, de otra manera se hace muy complicado de revisar.

Saludos

Pasandav

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:entender el código java dificultad con iterator CU00667B
« Respuesta #4 en: 27 de Octubre 2015, 10:51 »
Hola Alex.

¿Quieres decir que la clase Cantante sólo debe de tener atributos de cantante y debo de crear una clase independiente para discos o es una cuestión de nombre de clase?

Intentaré corregirlo.

Muchas gracias

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:entender el código java dificultad con iterator CU00667B
« Respuesta #5 en: 27 de Octubre 2015, 11:08 »
Por lo que se ve en el código, esa clase representa a un Cantante, por tanto la clase debería tener un nombre como Cantante, y un cantante tendrá todos los atributos que sean necesarios como nombre, apellidos, discoConMasVentas, fechaDeNacimiento, domicilio, etc. (esto es solo un ejemplo, habría que ver lo que dice el ejercicio y seguir las indicaciones del ejercicio).

Pasandav

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:entender el código java dificultad con iterator CU00667B
« Respuesta #6 en: 28 de Octubre 2015, 02:28 »
Bueno.....
Creo que he corregido los fallos que me decías.
El iterator lo he entendido (más o menos). "CantanteFamoso tmp", es crear una variable que almacena los atributos del objeto CantanteFamoso (como "String tmp", que también es una variable de un objeto)... ¿Es así?..... ¿Verdad? ???

Cuelgo de nuevo todo, para mejor seguimiento.
Como siempre, muchas gracias.

Código: [Seleccionar]
/**
 /**
 * Write a description of class TestCantantes3 here.
 *
 * @author (David Martinez)
 * @version (1.0)
 */
public class TestCantantesYDiscos   // Inicio de clase.
{
    public TestCantantesYDiscos()     // Constructor sin parametros.
    {     
    }

    public static void main (String []args)     // Inicio del main.
    {
        CantanteFamoso objCantante = new CantanteFamoso();                          // Creamos un objeto "objCantante"    de la clase CantanteFamoso sin parametros (vacío)..
        ListaCantantesFamosos listaCantantes = new ListaCantantesFamosos ();        // Creamos un objeto "listaCantantes" de la clase ListaCantantesFamosos
        VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();    // Creamos objeto "muestraEnPantalla" de la clase VisualizadorDeMensajes.
        RegistroTeclado teclado = new RegistroTeclado();                            // Creamos objeto "teclado"           de la clase RegistroTeclado
       
        listaCantantes.addCantante (new CantanteFamoso  ("Michael Jackson","Thriller"));  // Añadimos con metodo de ArrayList, un nuevo objeto CantanteFamoso  , con parametros
        listaCantantes.addCantante (new CantanteFamoso ("El último de la fila","Astronomía razonable"));      // ¿ Porque no, (new objCantante ("El ultimo de la fila","Astonomía razonable")); ?
             
        muestraEnPantalla.encabezadoDeLista("inicial");   // Muestra en pantalla mensaje con parametro que indica si es lista "inicial" o "actualizada".
        listaCantantes.listadoCompleto();// Metodo de ListaCantantesFamosos que recorre con Iterator y muestra los datos de la lista.
        int respuesta = 0;    // Reinicializamos variable que controlará el while (1= s, 2 = n, 0 = otra letra).
         
        while (respuesta !=2) // repetir es 2 cuando se contesta n a "volver a introducir"
        {
            muestraEnPantalla.solicitudDeDatos ("los datos","cantante");   // Metodo que muestra en pantalla que introduzcamos los "dato" del "tipo".
            String nombreCantante = teclado.solicitudEntradaTeclado();  // Almacena en "nombreCantante" lo registrado en el metodo solicitudEntradaTeclado.
                 
            muestraEnPantalla.solicitudDeDisco();   
            String nombreDisco = teclado.solicitudEntradaTeclado();     // Metodo que muestra en pantalla que introduzcamos el nombre del disco.
                 
            listaCantantes.addCantante(new CantanteFamoso (nombreCantante,nombreDisco)); // Añade el nuevo cantante y disco a la lista con el metodo añadeDatos.
                 
            muestraEnPantalla.encabezadoDeLista("actualizada");   // Muestra en pantalla mensaje con parametro que indica si es lista "inicial" o "actualizada".
            listaCantantes.listadoCompleto();   // Metodo de ListaCantantes que recorre y muestra los datos de la lista.
           
            muestraEnPantalla.volverAIntoducirDatos("datos","cantante");   // Muestra en pantalla si se quieren introducir más datos.
       
            do{ // Bucle que se repite, mientras "respuesta = 0".
                String siONo = teclado.solicitudEntradaTeclado();   // Se vuelve a socilitar la introdución de datos.
                if (siONo.equalsIgnoreCase("s")) { respuesta = 1;}   // si se recibe "s" respuesta = 1 (Se introducen más datos.
                else if (siONo.equalsIgnoreCase("n")){ respuesta = 2;}   // Si se recibe "n" respuesta = 2 (No se introducen más datos.
                else {
                        muestraEnPantalla.entradaIncorrecta();  // Si no es ni "s" ni "n", Se muestra mensaje aclaratorio.
                        respuesta=0;   
                       
                     }
            } while (respuesta==0); // Fin de Do-While.
         } // Fin de While.
     } // Fin del main.
}   // Fin de la clase.
Código: [Seleccionar]
/**
 * Clase que crea el objeto CantanteFamoso y realiza consultas en sus datos.
 *
 * @author (David Martínez)
 * @version (1.0)
 */
public class CantanteFamoso // Declaramos los atributos de la clase CantanteFamoso.
{
    private String nombre;
    private String discoConMasVentas;

    public CantanteFamoso() // Constructor que inicializa los atributos a datos vacíos.
    {
        this.nombre = "";
        this.discoConMasVentas = "";
    }
   
     public CantanteFamoso(String nombre,String discoMasVendido)    // Constructor que inicializa los campos recibiendo parametros tipo Strings
     {
         this.nombre = nombre;
         this.discoConMasVentas = discoMasVendido;
    }

    public String consultaCantante() { return this.nombre; }    // Metodo que devuelve String con el atributo nombre.
   
    public String consultaDisco() { return discoConMasVentas; } // Metodo que devuelve String con el atributo discoConMasVentas.

    public void setCantante(String nombreCantante){ this.nombre = nombreCantante;}  // Método para establecer atributo nombre
   
    public void setCancion(String cancionMasVendida){   this.discoConMasVentas = cancionMasVendida;}   // Metodo para establecer atributo discoConMasVentas.
}
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;
/**
 * Write a description of class ListaNombres here.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class ListaCantantesFamosos
{
    private ArrayList <CantanteFamoso> listaCantantesFamosos;
    VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
   
    public ListaCantantesFamosos () // Constructor, Crea ArrayList con un objeto CantanteFamoso.
    {   
        listaCantantesFamosos = new ArrayList <CantanteFamoso>();
    } // Cierre del constructor.
   
    public void addCantante (CantanteFamoso datos) // Añade al ArrayList el nombre introducido.
    {
        listaCantantesFamosos.add (datos);
    } // Cierre del metodo.
   
    public void listadoCompleto()
    {
        Iterator <CantanteFamoso> copiaDeLista = listaCantantesFamosos.iterator();
        CantanteFamoso tmp;
        while (copiaDeLista.hasNext()){
           
            tmp = copiaDeLista.next();
            muestraEnPantalla.listaCompleta(tmp.consultaCantante(),tmp.consultaDisco());       
        }
    } 
}
Código: [Seleccionar]
/**
 * Clase que muestra los mensajes por pantalla.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class VisualizadorDeMensajes
{   
    public VisualizadorDeMensajes()
    {     
    }
   
    public void solicitudDeDatos(String dato,String tipo)   // Metodo para mostrar mensaje de introducción de datos
    {
       System.out.println("\nPor favor, introduzca " + dato + " de " + tipo +".");
    }
   
    public void solicitudDeDisco()    // Muestra la solicitud de introducir Disco.
    {
        System.out.println("Introduzca su disco más vendido:");
    }
   
    public void volverAIntoducirDatos(String dato,String tipo) // Muestra la pregunta de seguir introduciendo datos.
    {
    System.out.println("¿Desea introducir "+ dato + " de otro/a " + tipo +"? (S/N): ");
    }
   
    public void entradaIncorrecta() // Muestra que hay que introducir o S o N.
    {
        System.out.println("Por favor, responda (S/N): ");   
    }
   
    public void encabezadoDeLista(String tipo) // Muestra el encabezado de la lista.
    {
     System.out.println("La lista " + tipo + " contiene los siguientes datos:" ); 
    }
   
    public void listaPosicionYCantante (int posicion,String nombre) // Muestra el dato de ArrayList de situado en "posicion" y "nombre"
    {
       System.out.println("En posicion: " + posicion + " - " + nombre ); 
    }

    public void listaCompleta(String nombre,String disco)   // Muestra los atributos recibidos por Iterator de la clase ListaCantantesFamosos.   
    {
        System.out.println("Cantante: " + nombre.toUpperCase() + "  Disco con más ventas: " + disco.toUpperCase() ); 
    }   
}
Código: [Seleccionar]
import java.util.Scanner;
/**
 * Write a description of class RegistroTeclado here.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class RegistroTeclado
{
    String teclado; // Variable para crear objeto Scanner.
    VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
   
    public  RegistroTeclado()   // El constructor llama al metodo que crea el objeto Scanner
    {
    }
   
    public String solicitudEntradaTeclado() // Metodo que crea el objeto Scanner.
    {
       Scanner teclado = new Scanner (System.in);
       String registroTeclado = teclado.nextLine();
       return registroTeclado;   // Devuelve el texto introducido como String
    } 
}

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:entender el código java dificultad con iterator CU00667B
« Respuesta #7 en: 30 de Octubre 2015, 09:09 »
Hola ahora los nombres de las clases y su contenido son correctos. Hay una cosa que deberías mejorar: en la clase TestantantesYDiscos tienes un bucle do dentro de un bucle while. Esto añade complejidad y realmente no es necesario tener un bucle dentro de otro en este caso. Fíjate en otros ejercicios en el foro escribiendo CU00667B en el buscador y verás que hay distintas formas de resolverlo y que no se necesita tener un bucle dentro de otro, por ejemplo mira este hilo: https://www.aprenderaprogramar.com/foros/index.php?topic=2889.0

CantanteFamoso tmp es un objeto que temporalmente va almacenando una copia de los objetos de la lista. Imagina que la lista tiene tres cantantes (tres objetos)

En la primera pasada del bucle tmp es una copia del objeto 1 y tmp.consultaCantante() nos devuleve la información de este objeto, en la segunda pasada es una copia del objeto 2 y tmp.consultaCantante() nos devuleve la información de este objeto, en la tercera pasada es una copia del objeto 3 y tmp.consultaCantante() nos devuleve la información de este objeto.

Saludos

Pasandav

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:entender el código java dificultad con iterator CU00667B
« Respuesta #8 en: 30 de Octubre 2015, 16:03 »
Me pongo a ello.... Ufffff ("complicao" es esto)!! :P

Gracias.

 

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".