Ordenar Listas en Java

Ordenar Listas en JavaSi eres programador seguramente te has encontrado con el problema de Ordenar Listas, pero ¿Estamos utilizando la solución correcta o estamos reinventando la rueda? Pues en este artículo hablaremos de las formas estándares que ofrece Java para ordenar listas sin tener que programar más de lo requerido.

 

Básicamente Java ofrece dos interfaces que serán claves para realizar un ordenamiento simple, las cuales son Comparator  y Comparable, estas dos interfaces atienden contextos diferentes en el ordenamiento de las listas, pues existen dos escenarios concretos (Si ya conoces la teoría puedes brincarte a la última sección):

Objetos preparados para ser Ordenados

 

El escenario más simple para ordenar un Lista, es cuando sus elementos están preparados para ser ordenados, esto implica que los elementos de la lista implementan la interface Comparable. Al implementar esta interface, las clases deberá implementar el método public interface Comparable<T>, el cual sirve para comprar un objeto contra otro, este método recibe como parámetro otro objeto, el cual utilizaremos para comprarlo contra el actual para responder con un entero, el cual deberá ser:

 

  • < 0 (Menor que cero): cuando el objeto actual es menor que el otro
  • = 0 (Igual a cero): cuando los objetos son iguales
  • > 0 (Mayor que cero): cuando el otro objeto es mayor.

 

Cuando una clase implementa Comparable entonces podemos decir que está preparada para ser Ordenada y ordenarla será tan simple como hacer lo siguiente:

Collections.sort(lstSortEmployees);

Asumiendo que la variable lstSortEmployees es una lista de objetos que implementan Comparable.

 

Objetos que no están preparados para ser Ordenados

 

Por otra parte, las clases que no implementan Comparable no podrán ser ordenadas de forma natural, por lo que tendremos que recurrir a la interface Comparator, la cual sirve para crear una clase externa que ayude al ordenamiento de los Objetos sin modificar la estructura de las clases existentes. Para lo cual será necesario crear una nueva clase que implementa la interface Comparator y con ello el método int compare(T o1, T o2), el cual funciona exactamente igual que el de la interface Comparable, solo que este recibe como parámetros los dos objetos que será comparados.

Ahora bien, si queremos ordenar una lista mediante este método podríamos hacerlo de la siguiente manera:

 

Donde lstEmployees es la lista de objetos a ordenar y EmployeeComparator es una clase que implementa Comparator. Aunque también podríamos ahorrarnos la creación de una nueva clase y crear una clase anónima, como podemos ver a continuación:

 

 

Veamos que este último ejemplo instanciamos la interface Comparator al vuelo y definimos el método compare para determinar cuál empleado es mayor que cual.

 

Finalmente, Java 8 ofrece una forma muchos más simple de ordenar los objetos utilizado Lamba Expresión, por lo cual en lugar de crear un Comparator, solo definimos la estrategia para comparar los objetos, veamos cómo quedaría:

 

Mediante lamba expresión definimos solamente como los objetos deberán ser comparados.

 

 

Un ejemplo práctico:

 

Muy bonita la explicación, pero pasemos mejor a un ejemplo práctico. Vamos a ver un ejemplo rápido para realizar los 3 tipos de ordenamientos que vimos anteriormente. Todo el código fuente lo puedes encontrar el GiHub: https://github.com/oscarjb1/SortList.git

 

 

La siguiente clase representa un empleado que no está preparado para ser ordenado:

 

Este otro empleado si está preparado para ser ordenado:

 

 

El resultado de la ejecución del proyecto nos da el siguiente resultado:

 

 

Como puedes ver, estamos realizando tres ordenamientos, el primero es con una lista de SortEmployee, el segundo ordenamiento es con una lista de Employee, y la tercera es utilizando lamba expresión.

Espero que esta explicación sea lo suficientemente clara como para aclarar cualquier duda que tuvieras, pero si no es así, recuerda que puedes escribirme en los comentarios y con gusto te responderé.

Artículos relacionados

Java Message Service (JMS) En este Post se habla hacer de la especificación de JMS, los patronos de entrega de manejes que soporta como lo son Punto a Punto(P2P) y Publicador/Su...
Estructuras de datos – Listas ligadas Sin duda una de las partes mas emocionantes cuando programamos es la parte de la algoritmia donde tenemos que usar la mente para resolver problemas qu...
Java 8 – Métodos referenciados Los métodos referenciados son una de las nuevas características de Java 8 que nos permite hacer referencia a los métodos y constructores por medio de ...

Oscar Blancarte

Ideológico, Innovador y emprendedor, Padre, Tecnólogo y Autor, amante de la ciencia y la tecnología en todos sus colores y sabores. Arquitecto de software & Full Stack Developer con experiencia en la industria del desarrollo de software y la consultoría. Amante de la programación y el Ajedrez.

4 comentarios en “Ordenar Listas en Java

  1. Buen artículo!!
    Ahora que estoy a tope con la certificación de java 8, añadir que todas las Wrapper classes implementan Comparable y Serializable, y que por tanto al crear una List de una wrapper class nos permitirá por tanto hacer el sort para ordenarla.
    Un saludo.

    1. Hola Silvia, tu comentario es absolutamente cierto y te felicito, porque veo que vas muy bien con tu certificación. Recuerdo cuando yo me certifique en Java… pffff!!!, hace muchos años, verás que cuando tengas tu certificación te sentirás muy bien.
      Te invito a que te suscribas a mi blog y así poderte mandar más actualizaciones de mi blog, también puedes ver más artículos de Java 8 en: https://www.oscarblancarteblog.com/tag/java8/
      Saludos.

      1. jejeje gracias!!! la verdad es que estoy de los nervios porque me examino el próximo mes!!! que ganas tengo ya de hacer el examen y tener la certificación.

        Pues me viene genial ese enlace a los artículos de java 8 🙂 muchas gracias! les hiré mirando poco a poco para repasar los conceptos.

        Un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *