ArrayList de Objetos en Java

En esta entrada vamos a escribir un programa Java que crea un ArrayList de Objetos de tipo Coche. El programa pide por teclado los datos de los coches y los guarda en el array. A continuación utilizará el ArrayList para mostrar por pantalla lo siguiente:
-         Todos los coches introducidos.
-         Todos los coches de una marca determinada.
-         Todos los coches con menos de un número determinado de Kilómetros.
-         El coche con mayor número de Kilómetros.
-         Todos los coches ordenados por número de kilómetros de menor a mayor.
Primero creamos la clase Coche:
//Clase Coche
public class Coche {
    private String matricula;
    private String marca;
    private String modelo;
    private int Km;

    public int getKm() {
        return Km;
    }

    public void setKm(int Km) {
        this.Km = Km;
    }
 
    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getMatricula() {
        return matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("\nMatrícula: ");
        sb.append(matricula);
        sb.append("\nMarca: ");
        sb.append(marca);
        sb.append("\nModelo: ");
        sb.append(modelo);
        sb.append("\nKm: ");
        sb.append(Km);    
        return sb.toString();
    }   
}

A continuación creamos la clase principal del proyecto:

//clase principal
public class Basico1 {

    //Se crea un ArrayList para guardar objetos de tipo Coche.
    static ArrayList<Coche> coches = new ArrayList<Coche>();
    static Scanner sc = new Scanner(System.in);
    //método main
    public static void main(String[] args) {
        leerCoches();
        System.out.println("\nCoches introducidos:");
        mostrarCoches();
        mostrarPorMarca();
        mostrarPorKm();
        System.out.println("\nCoche con mayor número de Km: " + mostrarMayorKm());
        System.out.println("\nCoches ordenados de menor a mayor número de Km");
        mostrarOrdenadosPorKm();
    } //fin método main
   
//Método para leer coches e introducirlos en el array
public static void leerCoches(){
        //Declaración de variables para leer los datos de los coches
        String matricula;
        String marca;
        String modelo;
        int Km;
        //Variable auxiliar que contendrá la referencia a cada coche nuevo.
        Coche aux;
        int i, N;
        //se pide por teclado el número de coches a leer
        do {
            System.out.print("Número de coches? ");
            N = sc.nextInt();
        } while (N < 0);
        sc.nextLine(); //limpiar el intro
        //lectura de N coches
        for (i = 1; i <= N; i++) {
            //leer datos de cada coche
            System.out.println("Coche " + i);
            System.out.print("Matrícula: ");
            matricula = sc.nextLine();          
            System.out.print("Marca: ");
            marca = sc.nextLine();
            System.out.print("Modelo: ");
            modelo = sc.nextLine();
            System.out.print("Número de Kilómetros: ");
            Km = sc.nextInt();
            sc.nextLine(); //limpiar el intro
            aux = new Coche(); //Se crea un objeto Coche y se asigna su referencia a aux
            //se asignan valores a los atributos del nuevo objeto
            aux.setMatricula(matricula);
            aux.setMarca(marca);
            aux.setModelo(modelo);
            aux.setKm(Km);
                      
           //se añade el objeto al final del array
            coches.add(aux);
        }
    } //fin método leerCoches()

Podemos representar de forma gráfica el contenido del ArrayList según se van introduciendo los objetos:





    //Método para mostrar todos los coches   
    public static void mostrarCoches(){      
        for(int i = 0; i< coches.size(); i++)
            System.out.println(coches.get(i));  //se invoca el método toString de la clase Coche
    }
   
    //Método para mostrar todos los coches de una marca que se pide por teclado
    public static void mostrarPorMarca(){
        String marca;
        System.out.print("Introduce marca: ");
        marca = sc.nextLine();
        System.out.println("Coches de la marca " + marca);
        for(int i = 0; i<coches.size(); i++){
            if(coches.get(i).getMarca().equalsIgnoreCase(marca))
                System.out.println(coches.get(i));
        }
    }
  
    //Método para mostrar todos los coches con un número de Km inferior
    //al número de Km que se pide por teclado
    public static void mostrarPorKm(){
        int Km;
        System.out.print("Introduce número de kilómetros: ");
        Km = sc.nextInt();
        System.out.println("Coches con menos de " + Km + " Km");
        for(int i = 0; i<coches.size(); i++){
            if(coches.get(i).getKm() < Km)
                System.out.println(coches.get(i));
        }
    }
   
   //Método que devuelve el Coche con mayor número de Km
    public static Coche mostrarMayorKm(){
        Coche mayor = coches.get(0);
        for(int i = 0; i < coches.size(); i++){
            if(coches.get(i).getKm() > mayor.getKm())
                mayor = coches.get(i);
        }
        return mayor;
    }
   
  
    //Método que muestra los coches ordenados por número de Km de menor a mayor
    public static void mostrarOrdenadosPorKm(){
        int i, j;
        Coche aux;
        for(i = 0; i< coches.size()-1; i++)
            for(j=0;j<coches.size()-i-1; j++)
                if(coches.get(j+1).getKm() < coches.get(j).getKm()){
                    aux = coches.get(j+1);
                    coches.set(j+1, coches.get(j));
                    coches.set(j, aux);                
                }
        mostrarCoches();
    }
} //fin de la clase principal

36 comentarios:

  1. Al transcribir las lineas de este código me aparecen muchas alertas que no logro arreglar. He desarrollado todos los ejercicios hasta aquí y ninguno me ha arrojado tantas inconsistencias de código. No se si es la instalación de NetBeans o no he importado las librerías correctas. Requiero una respuesta por favor.

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. evastos, el código esta completo, lo que llamas inconsistencias es por la falta de las librerías adecuadas, pon algo de tu parte, conchudo

      Eliminar
    3. seguro que no as importado la libreria del arraylist , de equals y algunos mas. buen día.

      Eliminar
  2. Hola, me encuentro con el mismo problema que evastos, supongo que es cosa de mis pocos conocimientos de JAVA. por ahora he ido entendiendo todos los ejercicios y realizándolos yo mismo, pero en este me he quedado encallado.
    Me gustaria a ver si alguien puede darnos un poco de ayuda. cada clase, ha de estar en un archivo diferente? o pueden estar en el mismo?

    ResponderEliminar
    Respuestas
    1. Hola, creo que a los dos os deben estar dando los mismos tipos de error. Las dos clases tal y como están escritas aquí son public y deben estar en archivos diferentes. La clase Coche en un archivo Coche.java y la principal en otro archivo Basico1.java.
      Si las habeis escrito en el mismo archivo, dentro de un archivo .java solo puede haber una clase pública que es la que da nombre al archivo por lo tanto podeis corregir el error quitando public en la clase Coche.
      Además teneis que añadir los import. En el ejemplo no aparecen. Si pinchais sobre cada error netBeans os indicará el import que falta y lo podeis añadir.

      Eliminar
  3. Una pregunta:

    cual es la diferencia entre:


    public void setModelo(String modelo) {
    this.modelo = modelo;
    }

    y

    public void setModelo(String modelo) {
    modelo = modelo;
    }

    ResponderEliminar
    Respuestas
    1. public void setModelo(String modelo) {
      this.modelo = modelo;
      }
      el THIS hace referencia a un atributo de la clase que tiene como nombre "modelo" y al cual se le esta asignando un valor que recibe en un atributo del método setModelo que tiene el mismo nombre al atributo de la clase. entonces para que al compilar se reconozca cual es el atributo de la clase y cual el que recibe se le pone el this

      public void setModelo(String modelo) {
      modelo = modelo;
      }
      en este caso el atributo que se recibe se esta asignando a el mismo, nunca he visto trabajar un metodo asi.

      Eliminar
    2. public void setModelo(String modelo) {
      this.modelo = modelo;
      }
      el THIS hace referencia a un atributo de la clase que tiene como nombre "modelo" y al cual se le esta asignando un valor que recibe en un atributo del método setModelo que tiene el mismo nombre al atributo de la clase. entonces para que al compilar se reconozca cual es el atributo de la clase y cual el que recibe se le pone el this

      public void setModelo(String modelo) {
      modelo = modelo;
      }
      en este caso el atributo que se recibe se esta asignando a el mismo, nunca he visto trabajar un metodo asi.

      Eliminar
  4. Hola,

    Estoy siguiendo todos los ejercicios y estoy aprendiendo bastante, muchas gracias por tu esfuerzo.
    Este ultimo ejerccio es ya bastante mas complicado pero casi me entero, aunque el uso del metodo con : "public static Coche mostrarMayorKm(){ "
    No me queda claro el uso de "Coche" en vez de "void".
    ¿podrias explicar con mas detalle su funcionamiento y porque?

    Gracias

    ResponderEliminar
    Respuestas
    1. Para que retorne el objeto de la clase Coche que tenga mas kilometraje.

      Eliminar
  5. Yo copiè todo tal cual està el còdigo y me dio perfecto!!! es un excelente aporte dado que me estaba volviendo loco para implementar un array de objetos! no me daba nunca y siempre me tiraba Exceptions, luego de esto creo que tengo solucionado mi problema de carga y muestra de arrays de objetos!!! Infinitas gracias!!!

    Mariano.

    ResponderEliminar
  6. De verdad esta muy bien este ejercicio, yo ando haciendo los deberes y me hacia falta ingresar numero de personas y luego pedir que tipo de persona agregar de entre varias clases pero bueno no me funciona por sc no existe y debo crearla aunque todavia me falta la segunda parte, por ejemplo podrias crear varios tipos de coches camion, auobus, encava entre otras y luego de pedir el numero de coches a ingresar pedir por opciones uno e instanciar los metodos de la clase a usar gracias seguire a ver :S

    ResponderEliminar
  7. mmmm ya no habia caido tanto codigo me tiene mal :S, ya sc es Scanner a ver si logro ajustar las opciones ahora :D

    ResponderEliminar
  8. 3. Construir un programa que permita ingresar el Código, Nombre, Sueldo, Condición (Estable, Contratado), etc. de N empleados, luego calcule el sueldo promedio por condición, sabiendo que si el empleado tiene más de 10 años de servicio tiene una bonificación del 15%, ordene los datos de acuerdo al código e imprima sus datos.
    Me pueden ayudar con estoo

    ResponderEliminar
  9. hola copie el codigo tal cual pero me da varios errores en os get y los set que se esta usando en la clase principal

    ResponderEliminar
    Respuestas
    1. Hola Clara, puedes poner que error te da?

      Eliminar
    2. volvi y copie el codigo completo ahora no hay ningun error. solo me subraya en amarillo la instancia coche y cuando compilo el programa y registro dos coches me sigue pidiendo marca y kilometraje y ahi termina el programa sin mostrarme los dos coches registrados.

      Eliminar
  10. ¿Nadie se ha dado cuenta de que el ultimo método devuelve los coches ordenados de mayor a menor kilometraje y no de menor a mayor como indica el enunciado del ejercicio?

    ResponderEliminar
    Respuestas
    1. Gracias por avisar. Ya está corregido. Solo había que cambiar > por <

      Eliminar
  11. Hola, quisiera saber si puedes ayudarme, pasa que mi profe pidio hacer un equipo de futbol, el cual ya posee ingresado datos, no hay que ingresarlos por teclado, tengo una clase llamada Futbolista, el cual tiene sus atributos correspondientes, el main en donde ya tengo ingresados todos los datos de los futbolistas y tengo otra clase llamada equipo el cual posee un arreglo por equipo, es aqui mi duda, como hago para que el arreglo que tengo en la clase Equipo guarde y muestre por pantalla los datos que ingrese en la clase Futbolista??... Espero puedas ayudar, muchas gracias

    ResponderEliminar
  12. El condicional de los metodos me da fallo me dice que no encuentra el simbolo, no se que hago mal porque si quito el condicional si que me da todos los datos. El problema parece estar en getMarca(), getKm,...¿Alguien sabe que puede ser, porque le he dado vueltass y no se me ocurre?
    if(coches.get(i).getMarca().equalsIgnoreCase(marca))

    ResponderEliminar
  13. Una pregunta haber si sabeis.

    Si cuando se quieren obtener todos los coches de una marca determinada., no hay ningun coche de esa marca, ¿como harías para que me te mandase un mensaje de que no existen coches de esa marca?

    ResponderEliminar
  14. Disculpen alguno de ustedes tendrá el método de eliminar con el arraylist ocupando dos vectores (y despues se introdujeran los datos al array original

    Ejemplo: Tengo estos datos en el vector
    1
    2
    3--> & quiero eliminar este
    4

    Tengo que pasar los primeros a otro array y me deben de quedar así
    4
    1
    2

    ResponderEliminar
  15. Gracias por este gran aporte, me aclaro una gran duda. Saludos.

    ResponderEliminar
  16. para los que le da algunos errores, les cuento que deben importar java util arraylist y tambien java util scanner.

    ResponderEliminar
  17. que hace este metodo?
    @Override
    public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("\nMatrícula: ");
    sb.append(matricula);
    sb.append("\nMarca: ");
    sb.append(marca);
    sb.append("\nModelo: ");
    sb.append(modelo);
    sb.append("\nKm: ");
    sb.append(Km);
    return sb.toString();

    ResponderEliminar
    Respuestas
    1. Este método creamos un String con el formato con el que queremos que se muestre el objeto. Puedes verlo como que se pasa el contenido del objeto a un String.
      El método toString se invoca de forma automática desde print o println cuando se quiere mostrar un objeto por pantalla:
      System.out.println(unCoche); muestra por pantalla el String devuelto pro el método toString() de la clase Coche.
      Es lo mismo que si escribimos:
      System.out.println(unCoche.toString());
      En esta entrada se explica como funciona este método:
      http://puntocomnoesunlenguaje.blogspot.com.es/2013/12/clase-object-java.html
      Saludos


      Eliminar
  18. y para eliminar un coche aprovechando el buscar poor matricula?

    ResponderEliminar
  19. Hola una pregunta que librerias agregar? me tira un error en coches.add(aux)

    ResponderEliminar
  20. me tira error en estas dos partes

    //se añade el objeto al final del array
    coche.add(aux); //the method add coche is undefined for the type coche
    }
    }

    public static void mostrarCoches(){
    for(int i = 0; i< coche.size(); i++) //the method size() is undefined for the method coche
    System.out.println(coche.get(i)); //the method get int is undefined for the method coche
    }

    }

    ResponderEliminar
  21. EL código anda perfecto muchas gracias!!!!

    ResponderEliminar
  22. buenas tardes una pregunta ese metodo main para que es
    //método main
    public static void main(String[] args) {
    leerCoches();
    System.out.println("\nCoches introducidos:");
    mostrarCoches();
    mostrarPorMarca();
    mostrarPorKm();
    System.out.println("\nCoche con mayor número de Km: " + mostrarMayorKm());
    System.out.println("\nCoches ordenados de menor a mayor número de Km");
    mostrarOrdenadosPorKm();
    } //fin método main

    ResponderEliminar