Ordenar listas en Java

Ordenar listas en Java

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.

Compartilo en
Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestEmail this to someone

AboutJosé Di Meglio

Apasionado de la tecnología y programación. Aportando información gratuita sobre el mundo de la informática.

2 comments

  1. 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

    1. Hola José Luis, lo podes hacer utilizando un Comparator como el del ejemplo. Lo único que tenes que cambiar es la función compare:

      public int compare(Persona p1, Persona p2) {
        int res = p2.getEdad() - p1.getEdad();
        if(res == 0){
          return p2.getApellido() - p1.getApellido();
        }else{
          return res;
        }
      }
      

      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.

Deja un comentario

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