Autor Tema: Error con el ejercicio CU00667B Java iterator java  (Leído 4685 veces)

Dimebag94

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Error con el ejercicio CU00667B Java iterator java
« en: 26 de Julio 2014, 01:00 »
Buenas!!
Bueno he estado haciendo los ejercicios de Java y me tope con una cuestion extraña. Aqui dejo el codigo:
Código: [Seleccionar]
import java.util.Scanner;
import java.util.Iterator;
public class Main
{
    public static void main(String [ ] args)
    {
        ListaCantantesFamosos objeto=new ListaCantantesFamosos();
        Scanner ingresoTeclado=new Scanner(System.in);
        CantanteFamoso cantante=new CantanteFamoso();
       
        System.out.print("Ingrese primer cantante extra: ");
        System.out.print("\nNombre: ");
        cantante.setNombre(ingresoTeclado.nextLine());
        System.out.print("Disco con mas ventas: ");
        cantante.setDiscoConMasVentas(ingresoTeclado.nextLine());
        objeto.añadirObjetoLista(cantante);
       
        System.out.print("Ingrese segundo cantante extra: ");
        System.out.print("\nNombre: ");
        cantante.setNombre(ingresoTeclado.nextLine());
        System.out.print("Disco con mas ventas: ");
        cantante.setDiscoConMasVentas(ingresoTeclado.nextLine());
        objeto.añadirObjetoLista(cantante);
       
        objeto.leerLista();
    }
}

Cuando utilizo este codigo e ingreso los nombres de los cantantes y sus discos, lo que ocurre es que al mostrarlos me muestra ambos objetos iguales al segundo. Pero si modifico el codigo asi:

Código: [Seleccionar]
import java.util.Scanner;
import java.util.Iterator;
public class Main
{
    public static void main(String [ ] args)
    {
        ListaCantantesFamosos objeto=new ListaCantantesFamosos();
        Scanner ingresoTeclado=new Scanner(System.in);
        CantanteFamoso cantante=new CantanteFamoso();
       
        System.out.print("Ingrese primer cantante extra: ");
        System.out.print("\nNombre: ");
        cantante.setNombre(ingresoTeclado.nextLine());
        System.out.print("Disco con mas ventas: ");
        cantante.setDiscoConMasVentas(ingresoTeclado.nextLine());
        objeto.añadirObjetoLista(cantante);
       
        [b]cantante=new CantanteFamoso();[/b]
       
        System.out.print("Ingrese segundo cantante extra: ");
        System.out.print("\nNombre: ");
        cantante.setNombre(ingresoTeclado.nextLine());
        System.out.print("Disco con mas ventas: ");
        cantante.setDiscoConMasVentas(ingresoTeclado.nextLine());
        objeto.añadirObjetoLista(cantante);
       
        objeto.leerLista();
    }
}

En negritas coloque la linea que agregue. Hacer esto me parece algo extraño y a mi entender esta mal, pero aun asi funciona bien y no como en el primer ejemplo.

En sintesis en el primer caso uso la misma variable para ambos ingresos, ingreso el primer nombre y el primer disco y los agrego a la lista y luego uso la misma variable e ingreso el segundo nombre y segundo disco y los agrego a la lista, pero al mostrar la lista me muestra ambos objetos iguales al segundo objeto que cargue.
« Última modificación: 31 de Agosto 2014, 11:31 por Alex Rodríguez »

solidsnake

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Re:Error con el ejercicio CU00667B Java
« Respuesta #1 en: 26 de Julio 2014, 04:38 »
Ola como estas, el problema que estas teniendo en el primer caso , que es el de usar el mismo objeto de CantanteFamoso , es que esa variable cantante referencia una direccion de memoria , al insertarle los valores con el Scanner quedan los valores como los insertaste y lo añades al arreglo, entonces al añadir en el espacio 0 del arreglo lo que guarda es la direccion de memoria que referencia "cantante" es por eso que cuando vuelves a hacerle set a esa variable estas haciendo cambio en la direccion de memoria de este y como el arreglo en su primer espacio tiene tambien referenciado a esa misma lo modifica , despues tu le indicas en tu algoritmo que lo añada al arreglo esa misma direccion de memoria, teniendo asi en tu arreglo el espacio 0 y el 1 referenciado a la misma direccion de memoria .

En tu segundo caso lo que haces al darle "new CantanteFamoso()" es creando otro objeto que tendra otra direccion de memoria; lo que has hecho es valido pero no es una buena tecnica de programacion porque usas el mismo alias para el objeto. seria mejor darle CantanteFamoso otrocantante = new CantanteFamoso(); y alli darle los valores. Espero haberte ayudado =)  te recomiendo leer otra vez la clase numero 44 del curso aqui el link :

https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=523:la-sentencia-new-invocacion-de-un-constructor-para-crear-objetos-en-java-concepto-y-ejemplos-cu00643b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

Alli nos explican que el realidad el nombre solo es un alias para el objeto lo importante es el codigo de memoria que se crea al hacerle new y crear asi un objeto =) , byee

Dimebag94

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:Error con el ejercicio CU00667B Java
« Respuesta #2 en: 26 de Julio 2014, 10:30 »
Gracias solidsnake ahora comprendi mi error.
Lo que aun no termino de comprender es como hacer esta cuestion generica para llevar a cabo el ejercicio. Porque el mismo pide que permita al usuario elegir entre agregar otro cantante o salir del programa, si el usuario decidiera agregar muchos cantantes como podria hacer que el codigo creara tantos objetos del tipo CantanteFamoso que sean diferentes unos de otros?

Dimebag94

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:Error con el ejercicio CU00667B Java
« Respuesta #3 en: 26 de Julio 2014, 10:50 »
Código: [Seleccionar]
import java.util.Scanner;
import java.util.Iterator;
public class Main
{
    public static void main(String [ ] args)
    {
        ListaCantantesFamosos objeto=new ListaCantantesFamosos();
        cargarCantante(objeto);
        cargarCantante(objeto);
       
        objeto.leerLista();
    }
    public static void cargarCantante(ListaCantantesFamosos objeto)
    {
        CantanteFamoso cantante1=new CantanteFamoso();
        Scanner ingresoTeclado=new Scanner(System.in);
       
        System.out.print("Ingrese cantante extra: ");
        System.out.print("\nNombre: ");
        cantante1.setNombre(ingresoTeclado.nextLine());
        System.out.print("Disco con mas ventas: ");
        cantante1.setDiscoConMasVentas(ingresoTeclado.nextLine());
        objeto.añadirObjetoLista(cantante1);
    }
}

Esto fue lo que se me ocurrio para intentar solucionarlo, funciona pero no se si es valido o correcto hacerlo de esta forma.

solidsnake

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Re:Error con el ejercicio CU00667B Java
« Respuesta #4 en: 27 de Julio 2014, 06:54 »
Bueno eso lo que yo hise fue crear una entrada de teclado y mediante un while si el usuario decia s o n , si es si desde un metodo de mi arreglo le daba añadirCantante(Cantante cantante) , en mi caso tengo otro metodo añadirCantante pero sin parametros el cual es un procedimiento que adentro se crea un objeto cantante y lo metia al arreglo =) , en pocas palabras sobrecargaba el medotod añadirCantate uno en el que le paso el cantante y otro en el que lo crea desde el metodo, de esta manera:

Código: [Seleccionar]
    public void añadir(CantanteFamoso cantante){
       
        arreglo.add(cantante);
               
    }
   
    public void añadir(){
       
        CantanteFamoso temp = new CantanteFamoso();
        Scanner e = new Scanner(System.in);
        System.out.println("Ingrese el nombre del cantante : ");
        temp.setNombre(e.nextLine());
        System.out.println("Ingrese el nombre del disco con mas ventas : ");
        temp.setDiscoConMasVentas(e.nextLine());
       
        arreglo.add(temp);
               
    }

 

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