Autor Tema: CU00667B ejemplo uso de iterator para recorrer ArrayList en java  (Leído 6070 veces)

momo

  • Principiante
  • **
  • Mensajes: 64
    • Ver Perfil
Citar
Bueno aquí dejo el ejercicio creo que le faltan algunos detalles .  al ejercicio le  añadí una clase aparte que es donde va a pedir la entrada del teclado . espero a ver  cumplido con lo requerido del ejercicio.

 Si tiene Errores y Necesita Modificaciones por favor me lo dicen lo tomare en cuenta para llegar a tener un mayor aprendizaje.


Muchas Gracias...


Citar
EJERCICIO:
/* 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.

TESTLISTACANTANTEFAMOSO...
Código: [Seleccionar]
import java.util.Scanner;
import java.util.Iterator;
public class TestListaCantanteFamoso
{

    public static void main(String [] args)
    {
        Scanner entrada=new Scanner(System.in);
        ListaCantanteFamoso lista=new ListaCantanteFamoso(" Madonna","All I want is you");
        boolean otroCantante =true;
       
        while(otroCantante==true)
        {
            lista.agregar();//Este Metodo Agrega a los Cantantes con los discos mas vendidos
            lista.mostrarLista();
            System.out.println("Deceas Agregar otro Cantante :");
           
            System.out.println("Si: s o No: n");
           
            String  resp=entrada.nextLine();
            //Se Hace la condicion para saber si queremos agregar otro cantante si la letra es "s" o "S" lo agrega si la letra es "n" o "N" no lo agrega,
            //y pasa a mostrar el tamaño de la lista y lista con el nombre de todos los cantantes
            if(resp.equals("s")==true || resp.equals("S")==true)
            {
                otroCantante=true;//se iguala a True para que inicie de nuevo a agregar al cantante             

            }else if(resp.equals("n")==false || resp.equals("N")==false)
            {break;//Rompe la condicion del IF
            }//Fin If Anidado
           
       
        }
        System.out.println("Tamaño De La Lista : "+lista.tamañoLista());
        System.out.println("ADIOS....!! ");
       
       
       
       
       
    }//Fin while

}//fin main
LISTACANTANTEFAMOSO...

Código: [Seleccionar]

import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantanteFamoso
{
    private ArrayList<CantanteFamoso>listaCantanteFamoso;


    public ListaCantanteFamoso(String nombre,String disco)

    {
        listaCantanteFamoso=new ArrayList<CantanteFamoso>();

        addCantante(nombre,disco);

    }

    public void  addCantante(String valorNombre,String valorDiscoConMasVentas)
    {
        listaCantanteFamoso.add(new CantanteFamoso(valorNombre,valorDiscoConMasVentas));

    }
    public void agregar()
    {
        System.out.println("Nombre :");
        EntradaTeclado primeraEntrada=new EntradaTeclado();       
        System.out.println("Disco Con Mas Ventas :");
        EntradaTeclado segundaEntrada=new EntradaTeclado();
        listaCantanteFamoso.add(new CantanteFamoso(primeraEntrada.getEntrada(),segundaEntrada.getEntrada()));

    }
   
    public void mostrarLista()
    {
        Iterator<CantanteFamoso>it=listaCantanteFamoso.iterator();
        CantanteFamoso analizador;
       
        while(it.hasNext())
        {
            analizador=it.next();
            System.out.println("Nombre : "+analizador.getNombre()+" "+"Disco Con Mas Ventas :"+analizador.getDiscoConMasVentas());
       
        }
    }   
    public int  tamañoLista()
    { return listaCantanteFamoso.size();}

}


CANTANTEFAMOSO.
Código: [Seleccionar]
import java.util.Scanner;
public class CantanteFamoso
{
    private String nombre,discoConMasVentas;
    private String teclado;

    public CantanteFamoso(String valorNombre,String valorDiscoConMasVentas)
    {
        nombre=valorNombre;
        discoConMasVentas=valorDiscoConMasVentas;
       
   
    }
 
   
    public String getNombre(){return nombre;}
    public String getDiscoConMasVentas(){return discoConMasVentas;}
   
}

ENTRADATECLADO..
Código: [Seleccionar]
import java.util.Scanner;
public class EntradaTeclado
{
    private String entradaTeclado;

    public EntradaTeclado()
    {
        entradaTeclado="";
        solicitarEntrada();
    }

    public void  solicitarEntrada()
    {
        Scanner escanearEntrada=new Scanner(System.in);
        entradaTeclado=escanearEntrada.nextLine();
    }

    public String getEntrada(){return entradaTeclado;}
   
   
}
« Última modificación: 21 de Septiembre 2014, 19:29 por Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:CU00667B
« Respuesta #1 en: 19 de Septiembre 2014, 21:32 »
Hola momo
Tu ejercicio es operativo y funciona, pero quiero señalarte varios puntos.

Tu clase CantanteFamoso, carece de métodos set.
Continúa siendo operativa, pero está coja, no se puede aprovechar su funcionalidad al 100%
Tienes que partir de la máxima de:
Un atributo, un método set y uno get. Sin excepción. Si no, serian unos atributos inamovibles, que no se pueden modificar.

Tampoco declaras un constructor sin parámetros.
Piensa que te puede interesar crear un CantanteFamoso ahora, para más tarde rellenar sus atributos (con los métodos set)

En tu clase ListaCantanteFamoso (era más adecuado ListaCantantesFamosos, ahora parece que tu lista solo tendrá un cantante)

Tienes este método

public void  addCantante(String valorNombre,String valorDiscoConMasVentas)

Como argumentos le das al método los atributos del nuevo cantante, pero lo correcto es que le des un argumento solo, así:

public void  addCantante(CantanteFamoso nuevoCantante)

Los atributos del cantante ya se gestionarán en la clase CantanteFamoso pues es su trabajo.
Además este código tiene la ventaja de trabajar con objetos.
Piensa que si más tarde añades un nuevo atributo a la clase CantanteFamoso. Tendrías que venir aquí y añadir el parámetro al método addCantante.
En cambio si le das como parámetro un objeto (CantanteFamoso) ya vendrá con sus atributos inicializados.
Otra cosa, este método addCantante no lo usas para añadir cantantes. Está creado, pero no lo usas en ningún momento.
Para añadir cantantes usas el método 'add', tal vez sin saberlo, de la clase importada ArrayList.

El método

public void agregar()

que colocas en esta clase, debería estar en la clase con main
El método main es el que se encarga de dirigir el trabajo, da instrucciones a las otras clases usando sus métodos, los métodos de ellas para realizar el trabajo.
Además, ya tienes un método para añadir cantantes (aunque no lo hayas usado)

El método

public void mostrarLista()

Es un método apropiado en la clase  ListaCantanteFamoso  para mostrar el contenido del ArrayList

Finalmente en la clase TestListaCantanteFamoso

Citar
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).

Se pide crear dos cantantes y mostrar sus atributos por pantalla
Tu creas un cantante, que por cierto no lo creas con su clase CantanteFamoso, sino con la clase ListaCantanteFamoso (incorrecto)
Luego pides los datos para un nuevo cantante  para mostrar al fin los cantantes que tienes en la lista.
A partir de aquí el código cumple, mostrando cada vez que añades un cantante, la lista completa de cantantes hasta que escoges salir del bucle.

Te pongo un enlace para que tengas otras referencias.
https://www.aprenderaprogramar.com/foros/index.php?topic=1030.msg5823#msg5823

Saludos

momo

  • Principiante
  • **
  • Mensajes: 64
    • Ver Perfil
Re:CU00667B
« Respuesta #2 en: 19 de Septiembre 2014, 23:11 »
Hola Toni como estas  en realidad se que el ejercicio tiene muchos detalle . Me a costado un poco elaborar el ejercicio pero bueno lo termine elaborando cumpliendo con el funcionamiento mas no con el objetivo del enunciado.

Tomare en cuenta tus observaciones y lo arreglare de nuevo .
Gracias por tus Observaciones amigo .

momo

  • Principiante
  • **
  • Mensajes: 64
    • Ver Perfil
Re:CU00667B
« Respuesta #3 en: 20 de Septiembre 2014, 03:25 »
NOTA: Ejercicio Modificado
Citar
Este Ejercicio que Esta Nueva Mente Subido es por que el anterior que esta mas abajo este mal elaborado aunque funciona..

Espero que este Ejercicio si de Con lo Cumplido..

Tomare en cuenta sus observaciones  muchas gracias ...




CantanteFamoso
Código: [Seleccionar]
import java.util.Scanner;
public class CantanteFamoso
{
    private String nombre,discoConMasVentas;//Atributos de la clase
    private String entrada;//Atributo de la clase . Este es para la entrada del teclado
   

    public CantanteFamoso()//Constructor sin parametro
    {
        nombre="";
        discoConMasVentas="";
        entrada="";
        entradaTeclado();
    }
   
    public CantanteFamoso(String valorNombre,String valorDiscoConMasVentas)//Constructor con parametro
    {
        nombre=valorNombre;
        discoConMasVentas=valorDiscoConMasVentas;

    }
    public void entradaTeclado()// Metodo para pedir la entrada de teclado
    {
        Scanner entradaTeclado= new Scanner(System.in);
        entrada=entradaTeclado.nextLine();
    }
    //Comienzan los metodos Setter;
    public void setNombre(String valorNombre)
    {
        nombre=valorNombre;
    }

    public void setDiscoConMasVentas(String valorDiscoConMasVentas)
    {
        discoConMasVentas=valorDiscoConMasVentas;
    }//Fin setter
    //Comienza los Metodos getter;
    public String getNombre(){return nombre;}
    public String getDiscoConMasVentas(){return discoConMasVentas;}
    public String getEntrada(){return entrada;}
    //fin getter
}

ListaCantanteFamoso
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantanteFamoso
{
    private ArrayList<CantanteFamoso>listaCantanteFamoso;//Creamos el objeto ArrayList   
   
    public ListaCantanteFamoso()//Constructor de la Clase
    {
        listaCantanteFamoso=new ArrayList<CantanteFamoso>();//Inicializamos el objeto ArrayList
       
       
   
    }
    public void addCantante(CantanteFamoso valorCantante)//Almacenamos los Cantantes
    {
        listaCantanteFamoso.add(valorCantante);
    }
    public void mostrarLista()
    {
        Iterator<CantanteFamoso>it=listaCantanteFamoso.iterator();//Creamor el Objeto Iterador para
        //Mostrar La lista
        CantanteFamoso analizador;
        //En este WHILE Se mhace el procedimiento para que se muestre la lista
        while(it.hasNext())
        {
            analizador=it.next();
            System.out.println("Nombre : "+analizador.getNombre()+" "+"Disco Con Mas Ventas :"+analizador.getDiscoConMasVentas());
       
        }
    }   
   
    public CantanteFamoso  getCantante(int posicion)
    {
        if(posicion >= 0 && posicion < listaCantanteFamoso.size())
        {
            return listaCantanteFamoso.get(posicion);
        }else{return null;}
   
    }
    public CantanteFamoso getRemoverCantante(int posicion)
    {
        if(posicion>=0 && posicion<listaCantanteFamoso.size())
        {
            return listaCantanteFamoso.remove(posicion);
        }else {return null;}
       
   
    }
    public int  getTamaño(){ return  listaCantanteFamoso.size();}   
   
}
TestListaCantanteFamoso
Código: [Seleccionar]
import java.util.Scanner;
public class TestListaCantanteFamoso
{
    public static void main(String[] args)
    {
        ListaCantanteFamoso lista=new ListaCantanteFamoso();//Creamos un objeto ListaCantanteFamoso;
        Scanner tecladoEscaner=new Scanner(System.in);
        CantanteFamoso cantante=new CantanteFamoso("Madonna","All I want is you");//
        lista.addCantante(cantante);                                              // Se Ingresa los dos cantantes de forma automatica
        cantante=new CantanteFamoso("Jorge Negrete","Jalisco");                   //         
        lista.addCantante(cantante);// Se almacenan los dos cantantes en la lista
        System.out.println("Lista Inicial :");
        lista.mostrarLista(); //Muestra la lista inicial

        System.out.println("Deceas Agregar otro Cantante");//
        System.out.println("Si: s y No:n");                 //Condicion para entrar al WHILE
        String otroCantante=tecladoEscaner.nextLine();      //
        while (otroCantante.equals("s"))
        {                       
            System.out.println("Nombre Del Cantante :");
            CantanteFamoso entrada = new CantanteFamoso();//Creamos el objeto de Cantante Famoso --->Entrada Teclado
            System.out.println("Disco Con Mas Ventas :");
            CantanteFamoso entrada2 = new CantanteFamoso();//Creamos otro objeto de Cantante Famoso------->Entrada Teclado
            CantanteFamoso cantante2=new CantanteFamoso(entrada.getEntrada(),entrada2.getEntrada());//Creamos un objeto de Cantante Famoso             
            //con dos parametros esos dos parametros seran las entrada de teclado
            lista.addCantante(cantante2);//almacenamos el objeto. en la lista
            System.out.println("ListaActualizada :");
            lista.mostrarLista();//Muestra la lista Actualizada
            System.out.println("Deceas Agregar otro Cantante");
            System.out.println("Si: s y No:n");
            String resp=tecladoEscaner.nextLine();
            if(resp.equals("s")==true)//Condicion si deceamos ingresar de nuevo a otro Cantante
            {
                otroCantante.equals("s");//se iguala a True para que inicie de nuevo a agregar al cantante             

            }else
            {break;//Rompe la condicion del IF
            }     
                     
        }
        System.out.println("Tamaño de la lista :"+ lista.getTamaño());
       
        System.out.println("Adios...");
 
    }
}


Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:CU00667B
« Respuesta #4 en: 20 de Septiembre 2014, 06:33 »
 Hola momo!
Tu ejercicio en algunas partes cumple con lo requerido en el enunciado, y en otras partes no.
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 (se podrán introducir
tantos datos de cantantes como se desee
Con  relación a esta parte del ejercicio, cumples con la parte de dar la opción de agregar otro cantante famoso o salir del programa. Pero según lo que pide este párrafo del ejercicio, agregar un tercer cantante a la lista es un requisito y no una opción, en tu programa se puede terminar el programa solo con los 2 cantantes que tiene la lista por defecto, si así el usuario lo deseara. Si esto sucede pues incumples con lo que pide el ejercicio.

Por otra parte, en relación al diseño del código hay barios puntos a comentar.

1ro: public class CantanteFamoso

punto 1: Veo que has decidido que lo que en la versión anterior de este ejercicio fue public class EntradaTeclado pase a ser en esta nueva versión de tu ejercicio un método de la clase CantanteFamoso (mala decision). El nombre de una clase dice lo que es o lo que hace, añadir tareas como la de pedir una entrada por teclado a esta clase, no es algo apropiado, lo mas apropiado hubiese sido que el método entradaTeclado(); fuese una clase que se encargue de crear una entrada de texto para el usuario, y no un método de la clase CantanteFamoso.

2do: public class ListaCantanteFamoso

punto 1:
Código: [Seleccionar]
public CantanteFamoso  getCantante(int posicion)
    {
        if(posicion >= 0 && posicion < listaCantanteFamoso.size())
        {
            return listaCantanteFamoso.get(posicion);
        }else{return null;}   
    }
Este metodo aparte de que no es necesario y nunca lo usas, tiene un if que no tiene mucha logica.

punto 2:
Código: [Seleccionar]
public CantanteFamoso getRemoverCantante(int posicion)
    {
        if(posicion>=0 && posicion<listaCantanteFamoso.size())
        {
            return listaCantanteFamoso.remove(posicion);
        }else {return null;}   
    }
Lo primero es el nombre del método, no es apropiado, lo segundo es que este método deberia de ser tipo procedimiento y no tipo funcion, la finalidad del método
remove(int index); es realizar una tarea (eliminar un objeto en la List) No es muy lógico que el método elimine un objeto y seguido devuelva el objeto que elimino, lo tercero es al igual que el anterior método la aparición de un if que no tiene mucho sentido y que podría dar lugar a confusión posteriormente a lo largo del desarrollo del programa, lo cuarto es que este método lo creas pero no lo usas en ninguna parte, por tanto y dada su utilidad creo que esta de mas.

3ro: public class TestListaCantanteFamoso

punto 1: la declaración en cabecera de clase, import java.util.Scanner; al ver esto se entiende que tu intención es crear un o varios objetos tipo Scanner a lo largo del desarrollo de esta clase, para crear entradas de teclado. Esto es contraproducente puesto que ya tienes el metodo entradaTeclado(); de la clase CantanteFamoso que se supone usarías para manejar todas las entradas de teclado del programa, a pesar  de que esto esta mal, porque como ya te dije, debió de ser una clase y no un método en una clase que no concuerda, al tu no usar este método para pedir todas las entradas de teclado del programa (no digo que usarlo desde la clase en que esta sea correcto) estas cometiendo lo que yo llamaría un error doble. Imagínate que si as creado una clase que se encargue de crear una entrada de teclado, y que otras clases la pueden usar para pedir entradas de teclado, imagínate que en otra clase declaras en cabecera de clase:
import java.util.Scanner; con la intención de crear un objeto tipo Scanner y usarlo para pedir entradas de teclado. Para que entonces creaste la clase que se supone aria esta tarea? es algo similar lo que pasa con tu metodo entradaTeclado y la clase con main.

punto 2:
Código: [Seleccionar]
if(resp.equals("s")==true)//Condicion si deceamos ingresar de nuevo a otro Cantante
            {
                otroCantante.equals("s");//se iguala a True para que inicie de nuevo a agregar al cantante             

            }else
            {break;//Rompe la condicion del IF
            }
El ==true dentro en este if, no es necesario, el bucle seguirá dando vueltas mientras otroCantante sea igual que "s" sin la necesidad de ==true.

De mi parte esos han sido los puntos mas necesarios a comentar, otros puntos o detalles los iras puliendo con el tiempo, por ejemplo yo en lo personal cambiaría tu linea de código en la clase con main:
Citar
System.out.println("Tamaño de la lista :"+ lista.getTamaño());
por:
Citar
System.out.println("Total de cantantes en la lista :"+ lista.getTamaño() + " cantantes");
Esto no surte ninguna variación en la funcionalidad del programa, pero muestra algo mas entendible para el usuario.

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

momo

  • Principiante
  • **
  • Mensajes: 64
    • Ver Perfil
Re:CU00667B
« Respuesta #5 en: 20 de Septiembre 2014, 19:11 »
Hola Sniper Gracias Por  tus  observaciones bueno corregiré el ejercicio por tercera vez tomando en cuenta lo que me dijiste. Aunque esta vez ya no vuelvo a publicar el ejercicio

Muchas Gracias amigo poco a poco voy aprendiendo mas  y con ayuda de ustedes que le pueden decir los detalles que tienen los  ejercicio pues uno toma en cuenta eso y  se va puliendo uno poco a poco   .

 

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