Autor Tema: Ejercicio CU00667B Uso de tipo Iterator, metodo iterator y bucle while en java.  (Leído 3570 veces)

yaymalaga

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Aquí está el código que finalmente he conseguido hacer que funcione y cumpla con las condiciones del ejercicio, por lo tanto me gustaría saber si alguien podría comentarme si está bien y si se podría cambiar o mejorar algo. Gracias de antemano.

CantanteFamoso
Código: [Seleccionar]
public class CantanteFamoso {
    String nombre;
    String discoConMasVentas;
   
    public CantanteFamoso() {
        nombre = "";
        discoConMasVentas = "";
    }
   
    public CantanteFamoso(String nombre, String disco) {
        this.nombre = nombre;
        discoConMasVentas = disco;
    }
   
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
   
    public void setDiscoVentas(String disco) {
        discoConMasVentas = disco;
    }
   
    public String getNombre() {
        return nombre;
    }
   
    public String getDiscoVentas() {
       return discoConMasVentas;
    }
}


EntradaTexto
Código: [Seleccionar]
import java.util.Scanner;

public class EntradaTexto {
    public Scanner lector;
   
    public EntradaTexto() {
        lector = new Scanner(System.in);
    }
   
    public String leerTexto() {
        return lector.nextLine();
    }
}


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

public class ListaCantantesFamosos {
    public ArrayList<CantanteFamoso> listaCantantesFamosos;
   
    public ListaCantantesFamosos() {
        listaCantantesFamosos = new ArrayList<CantanteFamoso>();
    }
   
    public void addCantantes(CantanteFamoso nombre) {
        listaCantantesFamosos.add(nombre);
    }
}


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

public class Test {   
    public Test() {
    }
   
    public static void main(String[] args) {
        ListaCantantesFamosos lista1 = new ListaCantantesFamosos();
       
        CantanteFamoso Cantante1 = new CantanteFamoso("Michael Jackson", "Thriller");
        lista1.addCantantes(Cantante1);
        CantanteFamoso Cantante2 = new CantanteFamoso("Luis Miguel", "Mi jardín oculto");
        lista1.addCantantes(Cantante2);
       
        EntradaTexto texto = new EntradaTexto();

        while (true) {
            Iterator<CantanteFamoso> it = lista1.listaCantantesFamosos.iterator();
            System.out.println("Esta es la lista actualizada: ");
            while (it.hasNext()) {
            CantanteFamoso objeto = it.next();
            System.out.println("Nombre: " + objeto.getNombre() + "    " + "Disco: " + objeto.getDiscoVentas());
            }
            System.out.println("¿Desea añadir algún dato?(y/n) ");
            if (texto.leerTexto().equals("y")) {
                System.out.println("Introduzca nombre del autor: ");
                String cantante = texto.leerTexto();
                System.out.println("Introduzca nombre del disco mas vendido: ");
                String disco = texto.leerTexto();
                lista1.addCantantes(new CantanteFamoso(cantante, disco));
            }
            else {
                break;
            }
        }
    }
}
« Última modificación: 03 de Noviembre 2014, 16:35 por Jorge lopez »

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
 Hola yaymalaga!

Estoy verificando tu ejercicio, en breve lo comento.
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
  Una parte del enunciado del ejercicio dice:
Citar
Se debe pedir al
usuario un nombre y disco con más ventas de otro cantante famoso, y una vez introducidos los datos
mostrar la lista actualizada usando iterator. Una vez mostrada la lista actualizada, se debe dar opción a
elegir entre volver a introducir los datos de otro cantante o salir del programa
lo que hace al tercer cantante famoso obligatorio en la lista, en tu ejercicio el tercer cantante famoso es opcional, dando la opción de salir del programa solo con los dos cantantes famosos que están en la lista por defecto.  El verdadero objetivo en este ejercicio es dominar el uso de la clase Iterator y sus métodos, así como también dominar el uso de bucles, por lo tanto, que el agregar un tercer cantante a la lista sea una opción no es tan relevante, pero te lo comento porque es parte de lo que pide el enunciado.

Comentarios por clase:

public class EntradaTexto: Una variable de clase siempre ha de ser declarada con el modificador de acceso private a menos que en una situación especial se requiera lo contrario. Teniendo esto presente cambiamos tu linea de codigo:
Código: [Seleccionar]
public Scanner lector; por
Código: [Seleccionar]
private Scanner lector;En este curso en lecciones mas avanzadas encontraras detalles sobre los diferentes modificadores de acceso
(public, protected y private) en java y detalles sobre cuando usar uno u otro.

public class CantanteFamoso: Lo mismo sobre las variables de clase y su tipo de modificador de acceso
(Especificar su tipo de modificador de acceso como private)

El nombre de los métodos setDiscoVentas(); y getDiscoVentas(); no son apropiados, el nombre de un método set o get debe de ser una combinación de el prefijo set/get + exactamente el mismo nombre de la variable al que tal método este relacionado, debido a que la variable relacionada en este caso es "discoConMasVentas" un nombre correcto para estos métodos podría ser: setDiscoConMasVentas(); y getDiscoConMasVentas();

tu clase CantanteFamoso quedaría mas o menos así:
Código: [Seleccionar]

public class CantanteFamoso {
    private String nombre;
    private String discoConMasVentas;
   
    public CantanteFamoso() {
        nombre = "";
        discoConMasVentas = "";
    }
   
    public CantanteFamoso(String nombre, String disco) {
        this.nombre = nombre;
        discoConMasVentas = disco;
    }
   
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
   
    public void setDiscoConMasVentas(String disco) {
        discoConMasVentas = disco;
    }
   
    public String getNombre() {
        return nombre;
    }
   
    public String getDiscoConMasVentas(){
       return discoConMasVentas;
    }
   
    public void verDatosDelCantante()/*Este método nos evita el tener que repetir código en la clase con main, cada vez que deseemos conocer el nombre y disco con mas
    ventas de un cantante famoso solo con invocar este método desde la clase con main.*/
    {
      System.out.println("Nombre: " + nombre + "\nDisco con mas ventas: " + discoConMasVentas + "\n");
    }
}


public class ListaCantantesFamosos: Lo mismo sobre las variables de clase y su tipo de modificador de acceso
(Especificar su tipo de modificador de acceso como private)

En esta clase seria recomendable crear un método "get" para la variable general "listaCantantesFamosos" puesto que al declararla como  private nos generara un error en la clase con main ya que haces uso directo de esta variable en la clase Test, y el modificador de acceso private priva a otras clases de poder acceder a variables propias de su clase de origen. Tu clase ListaCantantesFamosos quedaría mas o menos así:
Código: [Seleccionar]

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantantesFamosos {
    private List<CantanteFamoso> listaCantantesFamosos;//private en vez de public
   
    public ListaCantantesFamosos() {
        listaCantantesFamosos = new ArrayList<CantanteFamoso>();
    }
   
    public void addCantantes(CantanteFamoso nombre) {
        listaCantantesFamosos.add(nombre);
    }
   
    public void verCantantesEnLaLista()/*Es preferible que cada clase realice tareas propias de ella misma, por tal motivo creamos este método que usa la clase Iterator
    para recorrer la lista de cantantes famosos y ofrecer detalles de cada cantante famoso en la lista, esto ademas nos evita tener que usar varios ciclos (bucles) while
    en la clase con main, construyendo así un código mas corto claro y limpio.*/
    {
      Iterator it = listaCantantesFamosos.iterator();
      while(it.hasNext())
      {
        CantanteFamoso cantante = (CantanteFamoso)it.next();
        cantante.verDatosDelCantante();
      }
    }
   
    public List<CantanteFamoso> getListaCantantesFamosos()/*Este método nos devuelve un ArrayList sobre el cual podremos invocar algunos métodos que nos serán
    de utilidad en la clase con main, como por ejemplo, el método size(); ext..*/
    {
      return listaCantantesFamosos;
    }
}

public class Test: Un buen programador tratara de evitar siempre la duplicidad de código, en una clase con main, el no duplicar código es un "reto" que aumenta, puesto que esta clase se encarga de dirigir el programa, por tal motivo a la hora de diseñar un código, debemos de dejar todos los procesos y tareas en su sitio (clase) donde mayor se correspondan, para evitar tener un método main sobrecargado.

Tu clase Test no es que este mal, pero si se puede mejorar, te sugiero analizar el siguiente codigo, editado a partir de tu clase Test:
Código: [Seleccionar]
public class Test {   
    public Test() {
    }
   
    public static void main(String[] args) {
        ListaCantantesFamosos lista1 = new ListaCantantesFamosos();
       
        CantanteFamoso Cantante1 = new CantanteFamoso("Michael Jackson", "Thriller");
        CantanteFamoso Cantante2 = new CantanteFamoso("Luis Miguel", "Mi jardín oculto");
        lista1.addCantantes(Cantante1);
        lista1.addCantantes(Cantante2);
       
        EntradaTexto texto = new EntradaTexto();
        System.out.println("Tenemos una lista con los siguientes " + lista1.getListaCantantesFamosos().size() + " cantantes famosos:\n");       
        lista1.verCantantesEnLaLista();       
        System.out.println("Por favor agrega otro cantante famoso mas a nuestra lista.\n\nIntroduzca nombre del cantante: ");
        String cantante, disco;
        cantante = texto.leerTexto();
        System.out.println("\nIntroduzca nombre del disco mas vendido: ");
        disco = texto.leerTexto();
        lista1.addCantantes(new CantanteFamoso(cantante, disco));
        System.out.println("\nEsta es la lista actualizada:\n ");       
        lista1.verCantantesEnLaLista();
        String volver;
        do {           
            System.out.println("¿Desea añadir algún otro cantante famoso  a la lista?(y/n) ");
            volver = texto.leerTexto();
            if (volver.equals("y")) {
                System.out.println("Introduzca nombre del cantante: ");
                cantante = texto.leerTexto();
                System.out.println("Introduzca nombre del disco mas vendido: ");
                disco = texto.leerTexto();
                lista1.addCantantes(new CantanteFamoso(cantante, disco));
                System.out.println("\nEsta es la lista actualizada:\n");
                lista1.verCantantesEnLaLista();
            }
            else {
                System.out.println("\fAsi a quedado nuestra lista de " + lista1.getListaCantantesFamosos().size() + " cantantes famosos:\n");
                lista1.verCantantesEnLaLista();
                System.out.println("Gracias por ayudarnos con nuestra lista de cantantes famosos\n\nHasta luego!");
            }
        }while (volver.equalsIgnoreCase("y"));
    }
}

Cualquier duda no dudes en preguntar.

Saludos!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

 

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