Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: @dib_vz en 11 de Diciembre 2014, 14:08

Título: (CU00667B) Ejercicios con ArrayList en Java y recorrer ArrayList con iterador
Publicado por: @dib_vz en 11 de Diciembre 2014, 14:08
Alguien puede echarme una mano con este ejercicio? No entiendo muy bien como sacar por pantalla una lista de una clase propia que he creado y que tiene varios parametros.

Gracias

Crea una clase denominada ListaCantantesFamosos que disponga de un atributo ArrayList listaCantantesFamosos que contenga objetos de tipo CantanteFamoso. La clase debe tener un método que permita añadir objetos de tipo CantanteFamoso a la lista. Un objeto de tipo CantanteFamoso tendrá como atributos nombre (String) y discoConMasVentas (String), y los métodos para obtener y establecer los atributos. Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos y añade manualmente dos objetos de tipo CantanteFamoso a la la lista. Usando iterator muestra los nombres de cada cantante y su disco con más ventas por pantalla. 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 (se podrán introducir tantos datos de cantantes como se desee. Para ello usa un bucle while que dé opción a elegir al usuario). Puedes comprobar si tu código es correcto consultando en los foros aprenderaprogramar.com.

Ejemplo de lo que podría ser la ejecución del programa:

La lista inicial contiene los siguientes datos:
Cantante: Madonna.    Disco con más ventas: All I want is you.
Cantante: Jorge Negrete    Disco con más ventas: Jalisco.

Por favor introduzca los datos de otro cantante.
Nombre: Michael Jackson
Disco con más ventas: Thriller
La lista actualizada contiene los siguientes datos:
Cantante: Madonna.    Disco con más ventas: All I want is you.
Cantante: Jorge Negrete    Disco con más ventas: Jalisco.
Cantante: Michael Jackson    Disco con más ventas: Thriller.
¿Desea introducir los datos de otro cantante (s/n)?
s
Por favor introduzca los datos de otro cantante.
Nombre: Luis Miguel
Disco con más ventas: Mi jardín oculto
La lista actualizada contiene los siguientes datos:
Cantante: Madonna.    Disco con más ventas: All I want is you.
Cantante: Jorge Negrete    Disco con más ventas: Jalisco.
Cantante: Michael Jackson    Disco con más ventas: Thriller.
Cantante: Luis Miguel        Disco con más ventas: Mi jardín oculto.
¿Desea introducir los datos de otro cantante (s/n)?
n
Título: Re:(CU00667B) Ejercicios con ArrayList
Publicado por: Jorge lopez en 13 de Diciembre 2014, 17:28
 Hola @dib_vz!

Al parecer tienes dificultad para trabajar con listas (ArrayList) y funciones básicas como mostrar su contenido por pantalla, si estoy en lo correcto intentare aclararte algunos puntos para que puedas realizar este ejercicio.

Un objeto de tipo ArrayList es a su vez también de tipo List (lista) cuya funcion es almacenar algo,
(objetos, tipos primitivos, ext..) Para agregar un elemento a un ArrayList disponemos del método add(Element e); una vez el objeto ArrayList contiene algún elemento disponemos de varias opciones para consultar su contenido e interactuar con este. (mostrarlo por pantalla, borrarlo, editarlo, sustituirlo, ext..) Por ejemplo, podríamos tener una lista de colores y mostrar los colores de esa lista usando un for each como en el siguiente codigo:
Código: [Seleccionar]
import java.util.List;//Importamos las clases necesarias
import java.util.ArrayList;
public class TestArrayList
{
    public static void main(String[] args)
    {
       List<String> lista = new ArrayList<String>();/*Declaramos la lista del tipo dinámico "List" y creamos el objeto que contendrá la variable lista
       (un ArrayList de String)*/
       lista.add("Azul");//Agregamos elementos (objetos tipo String) a la lista
       lista.add("Rojo");
       lista.add("Blanco");
       lista.add("Amarillo");
       lista.add("Negro");
       System.out.println("Estos son los " + lista.size() + " colores que contiene la lista:\n");//Mensaje opcional
       for(String color: lista)//Usamos un for each (for extendido) para recorrer la lista y analizar su contenido
        {
          System.out.println("\t\t " + color);//Cada elemento que se encuentre durante la ejecución del for each sera mostrado por pantalla
        }
    }
}
O bien podríamos usar el método iterator(); de la clase Iterator para realizar la misma tarea, como se muestra en el siguiente codigo:
Código: [Seleccionar]
import java.util.List;//Importamos las clases necesarias
import java.util.ArrayList;
import java.util.Iterator;
public class TestArrayList
{
    public static void main(String[] args)
    {
       List<String> lista = new ArrayList<String>();/*Declaramos la lista del tipo dinámico "List" y creamos el objeto que contendrá la variable lista
       (un ArrayList de String)*/
       lista.add("Azul");//Agregamos elementos (objetos tipo String) a la lista
       lista.add("Rojo");
       lista.add("Blanco");
       lista.add("Amarillo");
       lista.add("Negro");
       System.out.println("Estos son los " + lista.size() + " colores que contiene la lista:\n");//Mensaje opcional
       Iterator<String> it = lista.iterator();//Creamos un objeto tipo Iterator que contendrá una especie de copia de cada elemento que contenga la lista
       while(it.hasNext())/*Usamos un ciclo while combinado con métodos propios de la clase Iterator invocados sobre el objeto it previamente creado, para recorrer la lista
       y analizar su contenido*/
        {
          System.out.println("\t\t " + it.next());//Cada elemento que se encuentre durante cada ciclo del bucle while sera mostrado por pantalla
        }
    }
}

Usar una u otra forma tiene sus ventajas y desventajas como ya fue explicado en las entregas CU00666B y CU00667B así que podríamos concluir que su provechoso uso es circunstancial.

Para realizar el ejercicio de la entrega CU00667B debes de crear una clase ListaCantantesFamosos que contendría una lista tipo ArrayList y esta lista contendría objetos de tipo CantantesFamoso, inicialmente la lista debe de contener 2 objetos CantanteFamoso los cuales debes de mostrar por pantalla y luego pedir al usuario que introduzca otro cantante mas a la lista, el cual debes de agregar a la lista usando el método add(); luego usando iterator(); debes de mostrar el nombre y el disco con mas ventas de cada objeto CantanteFamoso y posteriormente dar la opción al usuario de agregar mas cantantes a la lista o finalizar, al finalizar se debe de mostrar la lista actualizada.

Aquí te dejo una pista sobre como podrías mostrar por pantalla el nombre y disco con mas ventas de cada objeto CantanteFamoso: que contenga la lista
Código: [Seleccionar]
Iterator<CantanteFamoso> it = lista.iterator();
      CantanteFamoso tmpObjetoCantante;
      while(it.hasNext())
      {
        tmpObjetoCantante = it.next();
        System.out.println("Nombre: " + tmpObjetoCantante.getNombre() + ". Disco con mas ventas: " + tmpObjetoCantante.getDiscoConMasVentas() + ".");
      }

Espero que encuentres algo java.util; en este comentario ;)

Cualquier duda no dudes en preguntar.

Saludos!!
Título: Re:(CU00667B) Ejercicios con ArrayList en Java
Publicado por: @dib_vz en 18 de Diciembre 2014, 01:48
Gracias Jorge Lopez por tus consejos y recomendaciones. Despues de mucho trabajo y darle muchas vueltas he conseguido realizar la tarea tal como tenia en mi cabeza. No se hacerlo mejor, espero que este a la altura.

En primer lugar la clase Famoso que contiene los objetos de cantantes famosos y sus discos

Código: [Seleccionar]
/**
 * Esta clase describe objetos de tipo Famoso que esta compuesto por:
 * - objetos de tipo String que describen el nombre del cantante.
 * - objetos de tipo String que describen el disco más vendido del cantante.
 * @div_vz
 */

public class Famoso
{
    String nombre;
    String discoMasVendido;
   
    /**
     * constructor:
     * pide la entrada de dos objetos de tipo String;
     * vNombre que registra el valor nombre.
     * vDisco que registra el valor discoMasVendido.
     */
    public Famoso(String vNombre, String vDisco) {
        nombre = vNombre;
        discoMasVendido = vDisco;
    }
   
    //Método para introducir el valor nombre
    public void setNombre(String vNombre) {
        nombre = vNombre;
    }
   
    //Método para introducir el valor discoMasVendido
    public void setDiscoMasVendido(String vDisco) {
        discoMasVendido = vDisco;
    }
   
    //dos métodos que nos devuelven el valor de los objetos nombre y discoMasVendido
    public String getNombre() {
        return nombre;
    }
   
    public String getDiscoMasVendido() {
        return discoMasVendido;
    }
}

En segundo lugar la clase ListaCantantesFamosos que contiene la lista con los objetos de tipo Famoso, asi como los métodos para añadir cantantes, devolver el tamaño, etc. Tambien he utilizado la clase Iterator para crear un método que me permita imprimir todas las referencias a objetos Famoso y sus atributos que hay en la lista, siguiente tu idea.

Código: [Seleccionar]
/**
 * Esta clase describe un objeto ArrayList;
 * compuesto por objetos de la clase Famoso
 * @div_vz
 */
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class ListaCantantesFamosos
{
    private ArrayList<Famoso> listaCantantesFamosos;
    private String nombreLista;

    /**
     * constructor:
     * Crea un nuevo objeto de tipo ArrayList;
     * contiene dos objetos Famoso
     */
    public ListaCantantesFamosos() {
        nombreLista = "------- CANTANTES FAMOSOS -------";
        listaCantantesFamosos = new ArrayList<Famoso>();
        listaCantantesFamosos.add(new Famoso("Michael Jackson", "Thriller"));
        listaCantantesFamosos.add(new Famoso("Madonna", "All I want is you"));
    }

    //Método para añadir un objeto de tipo famoso al objeto listaCantantesFamosos
    public void addFamoso() {
        System.out.println("\nPor favor! Introduzca el nombre del cantante: ");
        EntradaPalabras entradaNombre = new EntradaPalabras();
        System.out.println("\nPor favor! Introduzca el nombre del disco del cantante: ");
        EntradaPalabras entradaDisco = new EntradaPalabras();
        listaCantantesFamosos.add(new Famoso(entradaNombre.getPalabra(), entradaDisco.getPalabra()));
    }

    //Método para imprimir los objetos de la lista usando Iterator
    public void imprimirLista() {
        System.out.println("\n" + getNombreLista());
        Iterator<Famoso> it = listaCantantesFamosos.iterator();
        Famoso tmpCantante;
        while (it.hasNext()) { //usamos while para recorrer todos los elmentos de la lista
            int i;
            for (i = 0; i < getTamaño(); i++) { //Aprovecho el metodo getTamaño para poder imprimir el orden numerado
                tmpCantante = it.next();
                System.out.println("\n" + (i+1) + " - Nombre:            " + tmpCantante.getNombre() +
                    "\n    Disco más vendido: " + tmpCantante.getDiscoMasVendido());
            }
        }
    }

    //Método que devuelve el tamaño del objeto listaCantantesFamosos
    public int getTamaño() {
        return listaCantantesFamosos.size();
    }

    //Método que devuelve el nombre de la lista
    public String getNombreLista() {       
        return nombreLista;
    }
}

En tercer lugar la clase Test que contiene el método main y que dirige el programa y relaciones de las clases:

Código: [Seleccionar]
/**
 * Esta clase describe el metodo main;
 * dirige el programa que relaciona las clases:
 * Famoso y ListaCantantesFamoso
 * @div_vz
 */

public class TestCantantesFamosos
{
    public static void main(String[] args)  {

        System.out.println("Esta es una relación de cantantes famosos y sus superventas");
        ListaCantantesFamosos lista = new ListaCantantesFamosos();
        lista.imprimirLista();
        //utilizo while para crear un bucle que me permita añadir todas las referencias que se deseen
        boolean lanzador = true;
        while (lanzador == true) {
            System.out.println("\n¿Desea añadir un nuevo cantante a la lista?(y/n)");
            EntradaPalabras confirmador = new EntradaPalabras();
            if (confirmador.getPalabra().equalsIgnoreCase("y")) {
                lista.addFamoso();
                System.out.println("\nEsta es su lista actualizada compuesta por " + (lista.getTamaño()) + " cantantes");
                lista.imprimirLista();
            } else {
                lanzador = false;
                System.out.println("\nEspero que haya disfrutado del programa.\n\nDesarrollado por @dib_vz");
            }
        }
    }
}

Y para terminar dejo aqui la clase que cree para utlizar la clase scanner de java:

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

public class EntradaPalabras
{
    private String palabra;

    //constructor
    public EntradaPalabras() {
        palabra = "";
        pedirPalabra();
    }

    //metodo para pedir una entrada de teclado
    public void pedirPalabra() {
        Scanner entradaEscaner = new Scanner(System.in);
        palabra = entradaEscaner.nextLine();
    }

      public String getPalabra() {
        return palabra;
    }

    public int getLongitud() {
        return palabra.length();
    }
}

Espero que os guste! ;D
Título: Re:(CU00667B) Ejercicios con ArrayList en Java
Publicado por: Jorge lopez en 24 de Diciembre 2014, 00:39
 Hola nuevamente @dib_vz!

Disculpa la tardanza, estos días ando corto de tiempo, pero en fin, aquí estamos para ayudar.

Te comento por clase:

Famoso: Casi perfecta, solo que has olvidado incluir un modificador de acceso para las variables de clase. (preferiblemente private)

ListaCantantesFamosos: En esta clase tienes la variable nombreLista, esta variable pienso que no es muy útil, eso aparte de que dicho mensaje (nombre de la lista) quien debe de manejarlo es la clase con el método main
(mas comentarios en el código de la clase) .

Tu clase ListaCantantesFamosos quedaría similar a esta:
Código: [Seleccionar]
/**
 * Esta clase describe un objeto ArrayList;
 * compuesto por objetos de la clase Famoso
 * @div_vz
 */
import java.util.List;//No has usado este import, su correcto uso se hace declarando la variable listaCantantesFamosos del tipo dinámico "List" (polimorfismo CU00688B,91B)
import java.util.ArrayList;
import java.util.Iterator;

public class ListaCantantesFamosos
{
    private List<Famoso> listaCantantesFamosos;//Declaramos la variable listaCantantesFamosos del tipo dinamico "List"
    //private String nombreLista; esta variable la eliminamos

    /**
     * constructor:
     * Crea un nuevo objeto de tipo ArrayList;
     * contiene dos objetos Famoso
     */
    public ListaCantantesFamosos() {
        listaCantantesFamosos = new ArrayList<Famoso>();//Le asignamos como valor a la variable listaCantantesFamosos un objeto tipo ArrayList (que a su vez es tipo List)
        listaCantantesFamosos.add(new Famoso("Michael Jackson", "Thriller"));
        listaCantantesFamosos.add(new Famoso("Madonna", "All I want is you"));
    }

    //Método para añadir un objeto de tipo Famoso al objeto listaCantantesFamosos
    public void addFamoso()
    {
        Famoso cantante = new Famoso();//Objeto Famoso
        EntradaPalabras entrada = new EntradaPalabras();//Instancia manejadora de entradas de datos por teclado.
        System.out.println("\nPor favor! Introduzca el nombre del cantante: ");
        cantante.setNombre(entrada.pedirPalabra());//Le pasamos como parámetro un método de la clase EntradaPalabras que pide una entrada por teclado y devuelve un String
        System.out.println("\nPor favor! Introduzca el nombre del disco del cantante: ");
        cantante.setDiscoMasVendido(entrada.pedirPalabra());
        listaCantantesFamosos.add(cantante);//Agregamos el objeto Famoso a la lista, con sus atributos por defecto previamente modificados por métodos setters.
    }

    //Método para imprimir los objetos de la lista usando Iterator
    public void imprimirLista() {
        Iterator<Famoso> it = listaCantantesFamosos.iterator();
        Famoso tmpCantante;
        int i = 0;
        while (it.hasNext()) { //usamos while para recorrer todos los elementos de la lista
            //Aprovecho el metodo getTamaño para poder imprimir el orden numerado//No es necesario usar el bucle for aquí, el mismo while cumple la tarea que necesitas
            tmpCantante = it.next();
            System.out.println("\n" + (i+1) + " - Nombre:            " + tmpCantante.getNombre() +
            "\n    Disco más vendido: " + tmpCantante.getDiscoMasVendido());
            i++;
        }
    }

    //Método que devuelve el tamaño del objeto listaCantantesFamosos
    public int getTamaño() {//Este metodo es opcional, yo en su lugar usaría directamente el metodo size();
        return listaCantantesFamosos.size();
    }
}

TestCantantesFamosos: Esta clase debe de encargarse de manejar el programa, casi todos los mensajes a mostrar por pantalla debe de manejarlos esta clase, y solo si es necesario otra clase (por ejemp: ListaCantantesFamosos) puede mostrar mensajes directos por pantalla
(ejemp: System.out.println("\nPor favor! Introduzca el nombre del cantante: "); )

Otro punto en esta clase es que el tercer cantante según el enunciado del ejercicio no es opcional, tu das opción a finalizar el programa solo con los dos cantantes por defecto en la lista.

Tu clase TestCantantesFamosos: quedaría similar a esta:
Código: [Seleccionar]
/**
 * Esta clase describe el metodo main;
 * dirige el programa que relaciona las clases:
 * Famoso y ListaCantantesFamoso
 * @div_vz
 */

public class TestCantantesFamosos
{
    public static void main(String[] args)  {
        ListaCantantesFamosos lista = new ListaCantantesFamosos();
        EntradaPalabras entrada = new EntradaPalabras();
        System.out.println("________________________________________________________\nEsta es una lista de cantantes famosos y sus superventas\nLa lista inicial esta compuesta por " +
        lista.getTamaño() +  " cantantes famosos.\n________________________________________________________\n\n------- CANTANTES FAMOSOS -------\n");
        String confirmador = "";
        lista.imprimirLista();
        System.out.println("\n\n________________________________________________________\nAgregue otro cantante mas a nuestra lista.\n________________________________________________________");
        lista.addFamoso();
        System.out.println("\fEsta es su lista actualizada compuesta por " + (lista.getTamaño()) + " cantantes");
        lista.imprimirLista();
        //utilizo while para crear un bucle que me permita añadir todas las referencias que se deseen
        boolean lanzador = true;
        while (lanzador) { //No es necesaria la sentencia: lanzador == true, como se muestra ahora es igual y es mas apropiado, donde lanzador siempre sera evaluado como true
            System.out.println("\n¿Desea añadir un nuevo cantante a la lista?(y/n)");
            confirmador = entrada.pedirPalabra();
            if (confirmador.equalsIgnoreCase("y")) {
                lista.addFamoso();
                System.out.println("\f________________________________________________________\nEsta es su lista actualizada compuesta por " + (lista.getTamaño()) +
                " cantantes\n________________________________________________________");
                lista.imprimirLista();
            } else {
                lanzador = false;
                System.out.println("\nEspero que haya disfrutado del programa.\n\nDesarrollado por @dib_vz");
            }
        }
    }
}

Y por ultimo, tambien edite tu clase EntradaPalabras:
Código: [Seleccionar]
import java.util.Scanner;

public class EntradaPalabras
{
    //Eliminamos la variable: private String palabra, una clase que sirve como entrada de teclado no necesariamente debe de guardar lo que se escriba,
    //el String ingresado por teclado puede ser guardado directamente en la variable tipo string deseada, incluso si esta variable es de otra clase.
    //constructor general
    public EntradaPalabras()
    {
        //Constructor vació, no llamamos al método pedirPalabra en el constructor para evitar tener que crear un nuevo objeto para cada entrada de datos.
    }

    //método para pedir una entrada de teclado, modificamos de tipo procedimiento (void) a tipo funcion (String);
    public String pedirPalabra() {
        Scanner entradaEscaner = new Scanner(System.in);
        return entradaEscaner.nextLine();
    }
}

Comentario en general: El objetivo de este ejercicio es que el programador entienda e implemente la clase Iterator, me parece que has manejado esa parte muy bien.

Te sugiero que tengas presentes los puntos ya comentados en tus futuros ejercicios.

Saludos!