Francisco Javier Martínez Páez

Consultor tecnológico de desarrollo de proyectos informáticos.

 Ingeniero Técnico en Telecomunicaciones

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2007-07-10

Tutorial visitado 53.352 veces Descargar en PDF
Ordenar Listas en Java 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.


A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2014-07-23-14:46:01

Autor: diegodesdecolombia

Excelente aporte Francisco Javier Martínez Páez.
Miércoles 23/07/2014