Ordenar Listas en Java

7
99574

Ordenar Listas en Java


En
este tutorial pretendo mostrar una forma sencilla de ordenar listas en
java usando dos métodos estáticos de la clase
java.util.Collections (si el lector aún no los sabe) e
implementando dos interfaces Comparable y Comparator.

Cuando nosotros creamos una clase de algún tipo, podemos
especificar el orden natural de los objetos de esa clase cuando se
encuentran en una lista, simplemente implementando el interfaz
Comparable que declara el método:
    int compareTo(Object o);

Éste método compara éste objeto  con el
objeto recibido como parámetro. Éste método ha de
devolver un valor negativo si éste objeto es menor que el
recibido, 0 si son iguales o un valor positivo si es mayor,
según el órden natural de los objetos.

Vamos a mostrar un ejemplo. Voy a crear la clase Persona con los siguientes atributos:

  • Apellidos
  • Nombre
  • DNI
  • Fecha de Nacimiento.

He decidido que para mí, la forma natural de ordenar los objetos de la clase Persona viene definido:

  • Primeramente por el orden alfabético de sus apellidos
  • Despúes por el orden alfabético de su nombre.
  • Y finalmente por su DNI.

    Definimos la clase Persona de esta manera:

public class Persona implements Comparable {
    private String nombre;
    private String apellidos;
    private String dni;
    private Date fechaNacimiento;   
   
    public String toString() {
        return this.apellidos + » » + this.nombre + » » + this.dni + » »
        + DateFormat.getDateInstance(DateFormat.DEFAULT,
              
Locale.getDefault()).format(this.fechaNacimiento);

    }
   
   public Persona(String nombre, String apellidos, String dni, Date fechaNacimiento) {
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.dni = dni;
        this.fechaNacimiento = fechaNacimiento;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    public String getNombre() {
        return nombre;
    }

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

    public int compareTo(Object o) {
        Persona persona = (Persona)o;       
       
   
   
if(this.apellidos.compareToIgnoreCase(persona.apellidos) == 0)
{           

            if(this.nombre.compareToIgnoreCase(persona.nombre) == 0) {
                return this.dni.compareTo(persona.dni);
            } else {
   
            return
this.nombre.compareToIgnoreCase(persona.nombre);

            }
        } else {
            return this.apellidos.compareToIgnoreCase(persona.apellidos);
        }       
       
    }
}

Voy a probar

    public static void pintaLista(List lista) {
        for(int i=0;i<lista.size();i++) {
            System.out.println(lista.get(i));
        }
    }
   
   
    public static void main(String[] args) {
       
        List lista = new ArrayList();
       
        Calendar cal = Calendar.getInstance();
        cal.set(1976,3,21);   
        Persona persona1 =
          new
Persona(«Francisco Javier»,»Martínez
Páez»,»11111111A»,cal.getTime());

        cal.set(1973,8,12);
       
        Persona persona2 =
            new Persona(«Roberto»,»Canales Mora»,»22222222B»,cal.getTime());

        cal.set(1975,7,23);
       
        Persona persona3 =
            new Persona(«Alejandro»,»Pérez García»,»33333333C»,cal.getTime());       

        cal.set(1980,6,14);
       
        Persona persona4 =
            new Persona(«Germán»,»Jiménez Centeno»,»44444444D»,cal.getTime());       

        cal.set(1981,5,8);
        Persona persona5 =
            new Persona(«Alfonso»,»Blanco Criado»,»55555555E»,cal.getTime());       

        cal.set(1981,9,30);
       
        Persona persona6 =
            new Persona(«Raúl»,»Expósito Díaz»,»66666666F»,cal.getTime());

               
        lista.add(persona1);
        lista.add(persona2);
        lista.add(persona3);
        lista.add(persona4);
        lista.add(persona5);
        lista.add(persona6);
       
        System.out.println(«———- SIN ORDENAR ————«);
        pintaLista(lista);       
       
        System.out.println(
                «———- ORDEN NATURAL DEFINIDO en compareTo ————«);

        Collections.sort(lista);       
        pintaLista(lista); 

    }

Ejecutamos:

Resultado


Si ahora quisieramos por ejemplo, ordenar por fecha de Nacimiento:

public class NacimientoPersonaComparator implements Comparator {

    public int compare(Object o1, Object o2) {
        Persona persona1 = (Persona)o1;
        Persona persona2 = (Persona)o2;
        return persona1.getFechaNacimiento().
                compareTo(persona2.getFechaNacimiento());
               
    }
}

Lo probamos y lo ejecutamos:


public static void main(String[] args) {

 …..

    System.out.println(«———- POR FECHAS DE NACIMIENTO ————«);
     Collections.sort(lista, new NacimientoPersonaComparator());       
     pintaLista(lista);   
}

Resultado


Ha sido sencillo.

7 Comentarios

  1. Si que lo entiendo pero, yo quiero mostrar una LISTA ENLAZADA en un formulario, exactamente en una tabla. En consola todo es más fácil ya que solo programas para que te muestre el mensaje pero, en formulario, es un poco más difícil ya que tienes que crear métodos que te retornen una lista para así en el formulario programar para colocar uno por uno de la lista en cada fila. Me podrías ayudar por favor? Tengo una lista que ordenar por Nombre y mostrarla en una tabla dentro de un formulario jframe. Buen post (Y)

    • Oye Sergio, habrias conseguido Tu ordenación? Podrias mostrarme el codigo?
      Yo tengo que ordenar por ID y llevo ya 4 dias sin dormir, lo unico que he conseguido es que ordene 1 número a la vez, nose donde implementar el for

  2. como filtrarias usando un edittext al arreglo por ejemplo:
    List lista = new ArrayList();

    Calendar cal = Calendar.getInstance();
    cal.set(1976,3,21);
    Persona persona1 =
    new Persona(“Francisco Javier”,”Martínez Páez”,”11111111A”,cal.getTime());
    cal.set(1973,8,12);

    Persona persona2 =
    new Persona(“Roberto”,”Canales Mora”,”22222222B”,cal.getTime());
    cal.set(1975,7,23);

    en el edittext digito solo apellido «canales mora»

Dejar respuesta

Please enter your comment!
Please enter your name here