A veces nos podemos encontrar con la necesidad de tener que ordenar listas en Java. Para realizar esta tarea Java nos proporciona el método sort de la clase estática Collections.
En este tutorial aprenderemos a realizar esta tarea con varios ejemplos sobre números, palabras y objetos de nuestro dominio.
Ejemplos de ordenar listas en Java
Vamos a comenzar con un ejemplo sencillo, donde tenemos una lista con cuatro números a la que queremos ordenar de menor a mayor. Esto lo podríamos hacer de la siguiente manera:
/*Ordenando una lista de enteros de menor a mayor*/ List<Integer> enteros = new LinkedList<Integer>(); enteros.add(2); enteros.add(1); enteros.add(4); enteros.add(3); Collections.sort(enteros); System.out.println(enteros);
Si necesitamos ordenarla de mayor a menor tenemos que utilizar un objeto Comparator. Estos objetos nos permiten definir la condición de orden:
/*Ordenando la misma lista de mayor a menor con un comparator*/ Comparator<Integer> comparador = Collections.reverseOrder(); Collections.sort(enteros, comparador); System.out.println(enteros);
Esta funcionalidad no solo nos permite ordenar listas de números, también nos permite ordenar cualquier objeto. En el siguiente ejemplo vamos a ver cómo ordenar una lista de palabras en orden alfabético:
/*Ordenando palabras en orden alfabético*/ List<String> palabras = new LinkedList<String>(); palabras.add("Hola"); palabras.add("Chau"); palabras.add("Banana"); palabras.add("Arbol"); Collections.sort(palabras); System.out.println(palabras);
Ahora si tenemos nuestro propio objeto y queremos ordenar una lista de ese mismo nos vemos obligados a implementar nuestra propia clase comparator. Con el siguiente ejemplo vamos a ver que realizar esto es muy fácil. Supongamos que tenemos nuestra clase «Persona» con las variables de instancia edad y nombre:
public class Persona { private String nombre; private int edad; public Persona(String nombre, int edad) { this.nombre = nombre; this.edad = edad; } public int getEdad() { return this.edad; } public String getNombre() { return this.nombre; } @Override public String toString() { return "Mi nombre es " + this.getNombre() + " y tengo " + this.getEdad() + " años.\n"; } }
Si queremos ordenar una lista de personas de mayor a menor por edad tenemos que hacer lo siguiente:
public static void main(String[] args) { /* Ordenando una lista de personas de mayor a menor por edad */ List<Persona> personas = new LinkedList<Persona>(); personas.add(new Persona("Juan", 20)); personas.add(new Persona("Mario", 15)); personas.add(new Persona("Lucio", 35)); personas.add(new Persona("Facundo", 17)); Collections.sort(personas, new Comparator<Persona>() { @Override public int compare(Persona p1, Persona p2) { return p2.getEdad() - p1.getEdad(); } }); System.out.println(personas); }
En este caso estamos definiendo un comparator con su método compare que recibe 2 personas y retorna el resultado de comparar su edades para que la lista de personas pueda ser ordenada por el método sort.
Bueno hemos llegado al final de este tutorial, ante cualquier problema no duden en dejar un comentario.
Tengo una duda si la clase persona del ejemplo tiene un atributo más por ejemplo apellido, como sería el método collections.sort para ordenarlo por nombres o por apellidos
Hola José Luis, lo podes hacer utilizando un Comparator como el del ejemplo. Lo único que tenes que cambiar es la función compare:
Lo que hace ese código simplemente es chequear si los nombres no son iguales, en ese caso los ordena por apellido. Espero que ahora hayas entendido como ordenar una lista que tiene objetos con dos atributos en java. Saludos.
Hola José Gerardo, me gustaría preguntarte si ¿el método sort de la clase estática collections, solo sirve para Arrays o también funciona para cualquier tipo de listas simples, dobles o circulares? Agradecería tu pronta respuesta, gracias
Hola Lizeth, se puede utilizar con cualquier tipo de listas. Un saludo.