Hoy veremos cómo ordenar una lista de fechas utilizando el método sort de java collections, este método nos permite ordenar, comparar, insertar elementos dentro de nuestros arreglos o listas y es la forma más eficiente para ordenar una lista en lugar de utilizar otros métodos como burbuja.

Creación del proyecto y lista de objetos para trabajar

Comenzaremos creando un maven project llamado Labs y dentro crearemos 2 clases:

  • Persona.java
  • Main.java:
Creación de proyecto

En la clase Persona.java crearemos una persona con fecha de nacimientos, la cuál posteriormente nos ayudará para realizar el orden de la lista:

import java.util.Date;

public class Persona {
    private Date fechaNacimiento;
    private String nombre;
    private String apellido;

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

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public String getNombre() {
        return nombre;
    }

    public String getApellido() {
        return apellido;
    }
}

Ahora trabajaremos en nuestra clase Main.java:

  • Crearemos 3 personas con fecha de nacimiento y nombre
  • Creamos una lista de tipo Persona y la inicializamos
  • Añadimos las 3 personas creadas a la lista
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Main{
    private static List<Persona> listaPersonas;

    public static void main(String[] args) {
        listaPersonas = new LinkedList<Persona>();
        String fecha1="27/05/1996";
        String fecha2="05/12/2000";
        String fecha3="20/06/1998";
        try {
            Date date1 = new SimpleDateFormat("dd/MM/yyyy").parse(fecha1);
            Date date2 = new SimpleDateFormat("dd/MM/yyyy").parse(fecha2);
            Date date3 = new SimpleDateFormat("dd/MM/yyyy").parse(fecha3);

            Persona p1 = new Persona(date1,"Emmanuel","Guzman");
            Persona p2 = new Persona(date2,"Andrey","Martinez");
            Persona p3 = new Persona(date3,"David","Mora");
            listaPersonas.add(p1);
            listaPersonas.add(p2);
            listaPersonas.add(p3);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

Posterior a esto vamos a imprimir la lista:

System.out.println("Lista desordenada");
for (Persona n : listaPersonas){
  System.out.println("Fecha nacimiento: " + n.getFechaNacimiento() + " Nombre: " + n.getNombre()+ " " + n.getApellido());
}

Obtendremos una salida de la lista desordenada:

Impresión de lista desordenada

Ordenando la lista

Ahora implementaremos la interface Comparator<Persona> llamando al objeto Persona, esta interface permite realizar la comparativa de objetos dentro de la clase donde queremos ordenar la lista, para este caso, queremos comparar los objetos de la clase persona por lo que implementaré la interface en la clase main.

Nota: En caso de querer comparar múltiples tipos de objetos en una clase con varias listas, es mejor crear una clase intermedia que sea la que implemente la interface.

public class Main implements Comparator<Persona> {

Posterior a esto debemos implementar la función compare dentro de la clase Main, vamso a sobreescribir esta función debido a que necesitamos modificar el comportamiento de la misma y esta función se llama cuando se ordena la lista:

Si queremos la lista ordenada ascendentemente usamos la siguiente función:

@Override
    public int compare(Persona o1, Persona o2) {
        return o1.getFechaNacimiento().compareTo(o2.getFechaNacimiento());
    }

Si queremos la lista ordenada descendentemente usamos la siguiente función:

@Override
    public int compare(Persona o1, Persona o2) {
        return o2.getFechaNacimiento().compareTo(o1.getFechaNacimiento());
    }

Por último añadiremos el método sort para ordenar la lista, aquí es donde llamaremos la clase donde hayamos implementado nuestra interface y la función compare, en este caso como lo hice en la misma clase, llamo a new Main():

Collections.sort(listaPersonas, new Main());

Y por último imprimimos la lista:

System.out.println("Lista ordenada");
Collections.sort(listaPersonas, new Main());
for (Persona n : listaPersonas){
System.out.println("Fecha nacimiento: " + n.getFechaNacimiento() + " Nombre: " + n.getNombre()+ " " + n.getApellido());
}

Obtenemos la salida con la lista ordenada ascendentemente:

Impresión de la lista ordenada

Les dejo la clase Main.java completa:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Main implements Comparator<Persona> {
    private static List<Persona> listaPersonas;

    public static void main(String[] args) {
        listaPersonas = new LinkedList<Persona>();
        String fecha1="27/05/1996";
        String fecha2="05/12/2000";
        String fecha3="20/06/1998";
        try {
            Date date1 = new SimpleDateFormat("dd/MM/yyyy").parse(fecha1);
            Date date2 = new SimpleDateFormat("dd/MM/yyyy").parse(fecha2);
            Date date3 = new SimpleDateFormat("dd/MM/yyyy").parse(fecha3);

            Persona p1 = new Persona(date1,"Emmanuel","Guzman");
            Persona p2 = new Persona(date2,"Andrey","Martinez");
            Persona p3 = new Persona(date3,"David","Mora");
            listaPersonas.add(p1);
            listaPersonas.add(p2);
            listaPersonas.add(p3);

            System.out.println("Lista desordenada");
            for (Persona n : listaPersonas){
                System.out.println("Fecha nacimiento: " + n.getFechaNacimiento() + " Nombre: " + n.getNombre()+ " " + n.getApellido());
            }

            System.out.println("Lista ordenada");
            Collections.sort(listaPersonas, new Main());
            for (Persona n : listaPersonas){
                System.out.println("Fecha nacimiento: " + n.getFechaNacimiento() + " Nombre: " + n.getNombre()+ " " + n.getApellido());
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    @Override
    public int compare(Persona o1, Persona o2) {
        return o1.getFechaNacimiento().compareTo(o2.getFechaNacimiento());
    }
}

De esta manera podemos ordenar cualquier lista utilizando la función compare, así mismo, esta función también se puede usar para comparar números o letras, es cuestión de modificarle el comportamiento ya sea llamando datos de tipo integer o string.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.