Mostrar datos de una clase LinkedList Java

publicado por: Anonymous

Buenas, tengo un problema a la hora de recoger los datos de una clase, y mostrarlos en una lista enlazada.
Cuando se ejecuta el método mostrarMiLista(LinkedList list), me devuelve una salida con el formato [email protected]d93b30
Gracias.

Biografias.java

package Ejercicio5;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

/**
 *
 * @author nando
 */
public class Biografias { 

    public static Personas cargarContactoNuevo(LinkedList list){

         Scanner entrada = new Scanner(System.in);

         System.out.println("Introduzca nombre y apellidos:");
         String nombre = entrada.nextLine();
         System.out.println("Introduzca el año de nacimiento:");
         int añoNac = entrada.nextInt();
         System.out.println("Introduzca el año de defunción:");
         int añoDef = entrada.nextInt();
         System.out.println("Introduzca área de trabajo:");
         String areaTrabajo = entrada.next();
         Personas nuevo = new Personas(nombre,añoNac,añoDef,areaTrabajo);
         list.add(nuevo);

         return nuevo;
     }

    public static void mostrarMiLista(LinkedList list){

        if(list.isEmpty()){
            System.out.println("La lista está vacia");
            return;
        }

        Iterator it = list.iterator();

         System.out.println("Los elementos de la lista son:");
         while(it.hasNext())
         {
           System.out.println(it.next().toString());
         }
}
      /**
 * Devuelve el contenido de la lista en un String
 * @return contenido de la lista
 */
@Override
public String toString(){

    String contenido="";
    Personas aux = null;

    while(aux!=null){
        contenido+=aux.getNombre()+ "n" + aux.getAñoNac()+ "n" + aux.getAñoDef()+ "n" + aux.getAreaTrabajo(); //guardamos el dato

    }

    return contenido;
}

    public static void main(String[] args){
    LinkedList miLista = new LinkedList();
    Biografias bio = new Biografias();
    Scanner entrada = new Scanner (System.in);    
    int opcion;
    do{
            do{
            System.out.println("Elegir opción");
            System.out.println("1. Crear ficha de contacto");
            System.out.println("2. Mostrar contactos");
            System.out.println("3. Salir");
            opcion = entrada.nextInt();
        }while (opcion < 1 || opcion >3);

            switch(opcion){
                case 1:
                    System.out.println("Introducir datos");
                    cargarContactoNuevo(miLista);
                    break;

                case 2:
                    mostrarMiLista(miLista);
                    break;

                case 3:
                    System.out.println("Fin de la aplicación");
            }

        }while(opcion!=3); 
    }
}

Clase Personas.java

package Ejercicio5;

/**
 *
 * @author nando
 */
public class Personas {

    private String nombre;
    private int añoNac;
    private int añoDef;
    private String areaTrabajo;  

    Personas(String nombre, int añoNac, int añoDef, String areaTrabajo){
        this.nombre = nombre;
        this.añoNac = añoNac;
        this.añoDef = añoDef;
        this.areaTrabajo = areaTrabajo;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the areaTrabajo
     */
    public String getAreaTrabajo() {
        return areaTrabajo;
    }

    /**
     * @param areaTrabajo the areaTrabajo to set
     */
    public void setAreaTrabajo(String areaTrabajo) {
        this.areaTrabajo = areaTrabajo;
    }

    /**
     * @return the añoNac
     */
    public int getAñoNac() {
        return añoNac;
    }

    /**
     * @param añoNac the añoNac to set
     */
    public void setAñoNac(int añoNac) {
        this.añoNac = añoNac;
    }

    /**
     * @return the añoDef
     */
    public int getAñoDef() {
        return añoDef;
    }

    /**
     * @param añoDef the añoDef to set
     */
    public void setAñoDef(int añoDef) {
        this.añoDef = añoDef;
    }

}

solución

Cuando pasas de leer un número a leer una cadena, antes de leerla debes de liberar el caracter n que queda en el buffer al ingresar y presionar enter. Para que lo entiendas mejor:

  1. nextInt(): 1234. Qeuda en el buffer `n
  2. nextFloat(): 9845.4. No consume el n porque lee flotantes. Queda en el buffer n
  3. nextLine(): se consume el caracter n
  4. Salta la lectura de la cadena porque ya leyó.

La solución es hacer:

scanner.nextInt();
scanner.next(); // se consume el n
scanner.nextLine();

Actualización

Ya que has actualizado tu pregunta para añadir una duda más, anexo esta parte.

Reader

public class Reader {

    private static final Scanner reader = new Scanner(System.in);

    public static Scanner get() {
        return reader;
    }

    public static void close() {
        reader.close();
    }
}

Menu

public class Menu {

    public static byte show() {
        byte opcion = 0;
        try  {
            Scanner entrada = Reader.get();
            do {
                System.out.println("[+] Elegir opciónn");
                System.out.println("1. Crear ficha de contacto");
                System.out.println("2. Mostrar contactos");
                System.out.println("3. Salirn");
                opcion = entrada.nextByte();
                entrada.nextLine(); // consume el n
                if(opcion < 1 || opcion > 3) {
                    System.out.println("Opción inválida");
                }
            } while (opcion < 1 || opcion > 3);
        } catch(NumberFormatException e) {
            System.out.println("Opción inválida");
            Menu.show();
        }
        return opcion;
    }
}

Persona

public class Persona {

    private String nombre;
    private int añoNac;
    private int añoDef;
    private String areaTrabajo;

    public Persona() {

    }

    public Persona(String nombre, int añoNac, int añoDef, String areaTrabajo) {
        this.nombre = nombre;
        this.añoNac = añoNac;
        this.añoDef = añoDef;
        this.areaTrabajo = areaTrabajo;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getAreaTrabajo() {
        return areaTrabajo;
    }

    public void setAreaTrabajo(String areaTrabajo) {
        this.areaTrabajo = areaTrabajo;
    }

    public int getAñoNac() {
        return añoNac;
    }

    public void setAñoNac(int añoNac) {
        this.añoNac = añoNac;
    }

    public int getAñoDef() {
        return añoDef;
    }

    public void setAñoDef(int añoDef) {
        this.añoDef = añoDef;
    }

    @Override
    public String toString() {
        return String.format("Nombre:t%snAño de nacimiento:t%dn"+
                        "Año de defunción:t%dnÁrea de trabajo:t%s",
                        this.nombre, this.añoNac, this.añoDef, this.areaTrabajo);
    }
}

Biografia

public class Biografia {

    private final List<Persona> contactos = new LinkedList<>();

    public void crearContacto() {

        try {
            Scanner entrada = Reader.get();
            Persona contacto = new Persona();

            System.out.print("nIntroduzca nombre y apellidos: ");
            contacto.setNombre(entrada.nextLine());
            System.out.print("nIntroduzca el año de nacimiento: ");
            contacto.setAñoNac(entrada.nextInt());
            System.out.print("nIntroduzca el año de defunción: ");
            contacto.setAñoDef(entrada.nextInt());
            System.out.print("nIntroduzca área de trabajo: ");
            entrada.nextLine(); // consume el n
            contacto.setAreaTrabajo(entrada.nextLine());

            contactos.add(contacto);
        } catch(Exception e) {
            e.printStackTrace();
        }

    }

   public void listarContactos(){
       if(contactos.isEmpty()){
           System.out.println("La lista está vacia");
           return;
       }
       contactos.forEach(System.out::println);
   }
}

Main

public class Main {

    public static void main(String[] args) {
        Biografia biografia = new Biografia();
        short opcion = Menu.show();

        do {
            switch(opcion) {
                case 1: biografia.crearContacto(); break;
                case 2: biografia.listarContactos(); break;
                case 3: Reader.close(); System.exit(0);
            }
            System.out.println();
            opcion = Menu.show();
        } while (opcion != 3);
    }

}

Conclusiones

  1. El código es el mismo pero orientado a objetos. La lectura la encapsulamos en la clase Reader ya que leeremos desde 2 clases: Main y Biografia. Si cerramos el Stream de lectura, ya no podremos leer aunque volvamos a instanciar Scanner (obtendremos un NoSuchElementException).

  2. No es necesario devolver el contacto creado porque no se usa en ninguna parte.

  3. Las clases List y LinkedList así como todas las de la familia, son genéricas; esto es, que permiten decidir qué tipo de dato almacenar, en este caso, objetos Persona. ¿Qué pasa si ingresamos un String? Obtendremos un error al compilar (ni siquiera ejecuta).

  4. Aprovecha las nuevas características de Java 8 (Lambdas, Streams, etc.). La lectura de una lista ahora se puede hacer en una sola línea sin necesidad de Iterator.

  5. No uses caracteres especiales/no ingleses en tus variables o de lo contrario, tendrás problemas de encoding.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *