Autor Tema: Java diferencia entre crear un solo objeto o crear múltiples objetos CU00667B  (Leído 2930 veces)

maxplanck

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 26
    • Ver Perfil
Sin apenas resaca y recién levantado, mi primera tarea del año es mandaros las clases de este ejercicio CU00667B del tutorial de programación en Java desde cero, (que me ha costado un montón... que rayada con el iterator hasta dar con el null  :P).

Bueno, ahí va la primera.

Clase CantanteFamoso:

Código: [Seleccionar]
import java.util.*;
public class CantanteFamoso {
    private  String nombre;
    private String discoConMasVentas;
    public CantanteFamoso () {
        nombre = "";
        discoConMasVentas = "";
    }
   
    public CantanteFamoso (String name1,String disco1) {
        nombre = name1;
        discoConMasVentas = disco1;
    }
   
    public  String getNombre (){return nombre;}
   
    public  String getDisco (){return discoConMasVentas;}
   
    public  void setNombre (String nombre2) {nombre = nombre2;}
   
    public  void setDisco (String disco2 ){discoConMasVentas = disco2;}
}


Y aquí la segunda, ListaCantantesFamosos.

Código: [Seleccionar]
import java.util.*;
public class ListaCantantesFamosos {
    private static ArrayList<CantanteFamoso> lista1;

    public ListaCantantesFamosos () {
        lista1 = new ArrayList<CantanteFamoso>();

    }

    public static void listaInicial ()  {
        CantanteFamoso cantorA = new CantanteFamoso ("Siniestro Total" , "¿Cuándo se come aquí?");
        lista1.add(cantorA);
        CantanteFamoso cantorb = new CantanteFamoso ("The Smiths" , "¿The Queen is dead?");
        lista1.add(cantorb);
    }
    //public static String getDisc1 (int poss2) {return (lista1.get(poss2)).getDisco();}
    public static void listar() {
        CantanteFamoso cantorX = null;
        Iterator<CantanteFamoso> it = lista1.iterator();
        while (it.hasNext() == true) {
            cantorX = it.next();
            System.out.println ("Nombre del cantante/grupo: " + cantorX.getNombre() + ";    Nombre del disco: " + cantorX.getDisco());
        }
       
    }

    public static void preguntar(){
        String ent = "";
        boolean si = true;
        while (si == true){
            System.out.println ("¿Desea añadir otra entrada?: S/N");
            Scanner tec =new Scanner(System.in);
            ent = tec.nextLine();
            if (ent.equalsIgnoreCase ("S")) {
                nuevo();
            }
            else if (ent.equalsIgnoreCase ("n")) {
                System.out.println ("Fin del programa, gracias por colaborar.");
                System.out.println ("La lista definitiva es:");
                listar();
                si = false;
            }
            else {
                System.out.println ("Entrada no válida.");
                //evaluar();
            }
        }
    }

    public static void nuevo () {
        CantanteFamoso cantorX;
        String ent1 = "";
        System.out.println ("Introduzca nuevo nombre de cantante/grupo.");
        Scanner tec1 =new Scanner(System.in);
        ent1 = tec1.nextLine();
        String ent2 = "";
        System.out.println ("Introduzca nuevo nombre disco.");
        Scanner tec2 =new Scanner(System.in);
        ent2 = tec2.nextLine();           
        cantorX = new CantanteFamoso(ent1,ent2);
        lista1.add(cantorX);
        System.out.println ("La nueva lista  es:");
        listar();
    }


Y ahora la última, TestLista:

Código: [Seleccionar]
import java.util.*;
public class TestLista {

   public static void main (String[] args) {
       ListaCantantesFamosos listaT = new ListaCantantesFamosos ();
       ListaCantantesFamosos.listaInicial();
       System.out.println ("La lista actual contiene las siguientes entradas:");
       ListaCantantesFamosos.listar();
       ListaCantantesFamosos.preguntar();
       
    }
}

Gracias como siempre por vuestro increible apoyo, espero vuestros consejos.
« Última modificación: 02 de Marzo 2017, 19:11 por Alex Rodríguez »

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Re:Codigos para el ejercicio JAVA CU00667B y....Feliz año mundo.
« Respuesta #1 en: 01 de Enero 2017, 19:05 »
¡Hola maxplanck!

El ejercicio funciona correctamente, pero hay algunas cosas que puedes cambiar para mejorarlo.

Has hecho una cosa que yo también hacía al principio: cada vez que quieres leer un mensaje de teclado, creas un objeto Scanner; esto no es necesario, basta con crear uno. Lo he puesto en la parte de arriba, donde se declaran los atributos de la clase, para que puedas usarlo en todos los métodos.

En segundo lugar, no necesitas escribir while (it.hasNext()==true) cuando usas un iterador porque it.hasNext() ya te devuelve un booleano. Es decir, bastaría con poner while (it.hasNext()). Para hacerlo más sencillo, he cambiado un poco el código del método preguntar() y he puesto que la condición sea while (ent.equalsIgnoreCase("S")) (así te ahorras la variable booleana si).

He borrado el null del iterador, porque no es necesario. También he eliminado la palabra static de los métodos.

ListaCantantesFamosos
Código: [Seleccionar]
import java.util.*;
public class ListaCantantesFamosos {
    private static ArrayList<CantanteFamoso> lista1;
    private Scanner tec;

    public ListaCantantesFamosos () {
        lista1 = new ArrayList<CantanteFamoso>();
        tec = new Scanner (System.in);

    }

    public void listaInicial ()  {
        CantanteFamoso cantorA = new CantanteFamoso ("Siniestro Total" , "¿Cuándo se come aquí?");
        lista1.add(cantorA);
        CantanteFamoso cantorb = new CantanteFamoso ("The Smiths" , "¿The Queen is dead?");
        lista1.add(cantorb);
    }
    //public static String getDisc1 (int poss2) {return (lista1.get(poss2)).getDisco();}
    public void listar() {
        CantanteFamoso cantorX;
        Iterator<CantanteFamoso> it = lista1.iterator();
        while (it.hasNext()) {
            cantorX = it.next();
            System.out.println ("Nombre del cantante/grupo: " + cantorX.getNombre() + ";    Nombre del disco: " + cantorX.getDisco());
        }
       
    }

    public void preguntar(){
        String ent = "S";
        while (ent.equalsIgnoreCase("S")){
            System.out.println ("¿Desea añadir otra entrada?: S/N");           
            ent = tec.nextLine();
            while (!ent.equalsIgnoreCase("N")&&!ent.equalsIgnoreCase("S")) {
                System.out.println ("Entrada no válida.");
                ent = tec.nextLine();
            }               
            if (ent.equalsIgnoreCase ("S")) {
                nuevo();
            }
            else if (ent.equalsIgnoreCase ("n")) {
                System.out.println ("Fin del programa, gracias por colaborar.");
                System.out.println ("La lista definitiva es:");
                listar();
            }
        }
    }

    public void nuevo () {
        CantanteFamoso cantorX;
        String ent1 = "";
        System.out.println ("Introduzca nuevo nombre de cantante/grupo.");       
        ent1 = tec.nextLine();
        String ent2 = "";
        System.out.println ("Introduzca nuevo nombre disco.");
        ent2 = tec.nextLine();           
        cantorX = new CantanteFamoso(ent1,ent2);
        lista1.add(cantorX);
        System.out.println ("La nueva lista  es:");
        listar();
    }
}

En la clase main, has hecho una cosa un poco rara, y creo que por eso te has visto obligado luego a poner static en los métodos de ListaCantantesFamosos. Has creado un objeto de tipo ListaCantantesFamosos al que has llamado listaT, pero luego, en vez de aplicar los métodos a este objeto, has escrito ListaCantantesFamosos.listar(), etc. Yo lo haría así:

TestLista
Código: [Seleccionar]
import java.util.*;
public class TestLista {

   public static void main (String[] args) {
       ListaCantantesFamosos listaT = new ListaCantantesFamosos ();
       listaT.listaInicial();
       System.out.println ("La lista actual contiene las siguientes entradas:");
       listaT.listar();
       listaT.preguntar();
       
    }
}

Espero que te sirva. ¡Un saludo!
« Última modificación: 01 de Enero 2017, 19:13 por Erik_Escriche »

ESOJ

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 143
    • Ver Perfil
Re:Codigos para el ejercicio JAVA CU00667B y....Feliz año mundo.
« Respuesta #2 en: 02 de Enero 2017, 07:23 »
Buenos días.

También podrías haberlo hecho así:
Código: [Seleccionar]
public class CantanteFamoso {
    private  String nombre;
    private String discoConMasVentas;
    public CantanteFamoso () {
        nombre = "";
        discoConMasVentas = "";
    }   
    public CantanteFamoso (String nombre,String discoConMasVentas) {
        this.nombre = nombre;
        this.discoConMasVentas = discoConMasVentas;
    }
   
    public  String getNombre (){return nombre;}
   
    public  String getDisco (){return discoConMasVentas;}
   
    public  void setNombre (String nombre) {this.nombre = nombre;}
   
    public  void setDisco (String discoConMasVentas ){this.discoConMasVentas = discoConMasVentas;}
}
Código: [Seleccionar]
import java.util.*;
public class ListaCantantesFamoso {
    private ArrayList<CantanteFamoso> lista;

    public ListaCantantesFamoso () {
        lista = new ArrayList<CantanteFamoso>();
    }

    public void setAgregarCantante(String cantante,String disco){
        lista.add(new CantanteFamoso (cantante,disco));
    }       

    public ArrayList<CantanteFamoso> getLista(){return lista;}
}
Código: [Seleccionar]
import java.util.*;
public class TestLista {

    public static void main (String[] args) {
        Scanner tec =new Scanner(System.in);
        String respuesta,ent1,ent2;
        CantanteFamoso cantorX=new CantanteFamoso ();
       
        ListaCantantesFamoso lista=new ListaCantantesFamoso();     
       
        lista.setAgregarCantante("Siniestro Total" , "¿Cuándo se come aquí?");
        lista.setAgregarCantante("The Smiths" , "¿The Queen is dead?");
         
        System.out.println ("La lista actual contiene las siguientes entradas:");       
        do {respuesta="N";
            Iterator<CantanteFamoso> it = lista.getLista().iterator();
            while (it.hasNext()) {
                cantorX = it.next();
                System.out.println ("Nombre del cantante/grupo: " + cantorX.getNombre() + ";    Nombre del disco: " + cantorX.getDisco());
            }
            System.out.println ("¿Desea añadir otra entrada?: S/N");
            if (tec.nextLine().equalsIgnoreCase ("S")) {           
                System.out.println ("Introduzca nuevo nombre de cantante/grupo.");               
                ent1=tec.nextLine();               
                System.out.println ("Introduzca nuevo nombre disco.");
                ent2=tec.nextLine();                 
                lista.setAgregarCantante(ent1,ent2);                               
                respuesta="S";}
        }while(respuesta=="S");
    }
}
Un saludo

maxplanck

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 26
    • Ver Perfil
Re:Codigos para el ejercicio JAVA CU00667B y....Feliz año mundo.
« Respuesta #3 en: 04 de Enero 2017, 18:43 »
Muchas gracias a ambos, estos son los tipos de consejo que busco. Ya se me había pasado por la mente que quizás con un sólo objeto Sacnner se debería poder funcionar, pero cuando hago alguno de los ejerciciós, y como me lío tanto con los otros aspectos, prefiero ir a lo seguro y eso hace mis códigos más feos. Gracias también por aclararme lo del main, que me traía loco, no sé en que fase de escribir el código me fallo lo del listaT.listar() y usé ListaCantantesFamosos.listar() (hubo momentos que todos los métodos estaban en la case Test, luego sólo algunos y así...) y ya no supe darme cuenta. Igual con el null y el == true, probé tantas cosas que al final quedó así y no me atreví a tocarlo.
También agredecerte ESOJ tu código, algo así se me pasó por la mente en algún momento pero no supe desarrollarlo, lo de "lista.add(new CantanteFamoso (cantante,disco))" es justo de la siguiente lección y yo soy cartesiano (quiero decir "cuadriculao" :)) )... no continúo sin haber acabado el ejercicio de la última lección. Con el uso del this todavía me falla algún concepto y cuando intento usarlo a veces me da errores, viendo vuestros ejemplos se me hace más claro. El problema siempre es el mismo en el fondo...EL **** TIEMPO, que siempre me falta  :'( . Está claro que no basta con hacer los ejercios y que hay que documentarse bien y estudiar las cosas con detalle para tener una buena base, pacienza y un saludo a todos.

« Última modificación: 04 de Enero 2017, 19:12 por maxplanck »

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Re:Codigos para el ejercicio JAVA CU00667B y....Feliz año mundo.
« Respuesta #4 en: 04 de Enero 2017, 21:16 »
Buah, yo cuando tuve que hacer este ejercicio también me hice un lío enorme. Luego, al ir avanzando, parece que las cosas van encontrando ellas solas su lugar en la mente y es más sencillo.

 

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