Tip Java - Cómo ordenar un array de objetos por sus atributos

Tip Java - Cómo ordenar un array de objetos por sus atributos
tutorial java ordenar array objetos en función de sus atributos implementar clase comparable

¡Hola! Hoy traigo un pequeño tip sobre programación Java en el cual aprenderemos a ordenar un Array de objetos a partir de sus atributos. Es algo bastante básico que vemos cuando programamos en Java y que seguramente os sirva de ayuda en más de una ocasión.

Si habéis programado en C, conoceréis las estructuras (struct), en las cuales podemos almacenar atributos de distintos tipos. En Java no existen las estructuras, pero podemos crear clases.

Imaginad que tenéis varios objetos de la clase Persona, cada uno con distintos atributos:

  • Nombre.
  • Altura (cm).
  • Edad.

Podríamos tener estos datos almacenados en 3 Arrays distintos, uno para cada variable, pero lo mejor sería tener varios objetos en los que guardar toda la información correspondiente a cada persona.

Vamos a empezar creando la clase princial MainClass:

import java.util.Arrays; public class MainClass { public static void main(String[] args) { } }

Hasta ahora todo bien. A continuación, vamos a crear la clase Persona, que será como una estructura en la que guardar los datos de cada entrada. Lo haremos dentro de MainClass. Además de crear la clase, he creado su constructor y he creado un array de 5 objetos Persona, cada uno con un nombre, edad y altura. Además, hemos definido y programado el método imprimeArrayPersonas:

import java.util.Arrays; public class MainClass { static class Persona { public String nombre; public int edad, altura; // Constructor de la clase public Persona(String nombre, int edad, int altura) { this.nombre = nombre; this.edad = edad; this.altura = altura; } } // Método para imprimir el array de Personas static void imprimeArrayPersonas(Persona[] array) { for (int i = 0; i < array.length; i++) { System.out.println((i+1) + ". " + array[i].nombre + " - Altura: " + array[i].altura + " - Edad: " + array[i].edad); } } public static void main(String[] args) { Persona[] arrayPersonas = new Persona[5]; arrayPersonas[0] = new Persona("Mario", 22, 187); arrayPersonas[1] = new Persona("Pepe", 52, 173); arrayPersonas[2] = new Persona("Manuel", 27, 158); arrayPersonas[3] = new Persona("David", 25, 164); arrayPersonas[4] = new Persona("Alberto", 80, 184); System.out.println("Array sin ordenar por altura"); imprimeArrayPersonas(arrayPersonas); } }

Al ejecutarlo, vemos que nos imprime los atributos de 5 objetos de la clase Persona, pero no están ordenadas por altura.

Array sin ordenar por altura 1. Mario - Altura: 187 - Edad: 22 2. Pepe - Altura: 173 - Edad: 52 3. Manuel - Altura: 158 - Edad: 27 4. David - Altura: 164 - Edad: 25 5. Alberto - Altura: 184 - Edad: 80

Bien. Pero, ¿cómo ordenamos un array de objetos en función de uno de sus atributos? Para conseguirlo, la clase personas tiene que implementar la clase Comparable y, crearemos un método llamado compareTo. A continuación lo vemos:

static class Persona implements Comparable<Persona> { public String nombre; public int edad, altura; public Persona(String nombre, int edad, int altura) { this.nombre = nombre; this.edad = edad; this.altura = altura; } @Override public int compareTo(Persona o) { if (altura < o.altura) { return -1; } if (altura > o.altura) { return 1; } return 0; } }

Como podéis ver, hemos creado el método compareTo, el cual compara dos objetos y nos devuelve un orden de menor a mayor. Para ordenar el array de objetos, vamos a utilizar el método Arrays.sort(), que recibe un array y simplemente lo ordena teniendo en cuenta las condiciones que le hayamos dicho dentro del método compareTo:

Arrays.sort(arrayPersonas);

El código completo es:

import java.util.Arrays; public class MainClass { static class Persona implements Comparable<Persona> { public String nombre; public int edad, altura; public Persona(String nombre, int edad, int altura) { this.nombre = nombre; this.edad = edad; this.altura = altura; } @Override public int compareTo(Persona o) { if (altura < o.altura) { return -1; } if (altura > o.altura) { return 1; } return 0; } } static void imprimeArrayPersonas(Persona[] array) { for (int i = 0; i < array.length; i++) { System.out.println((i+1) + ". " + array[i].nombre + " - Altura: " + array[i].altura + " - Edad: " + array[i].edad); } } public static void main(String[] args) { Persona[] arrayPersonas = new Persona[5]; arrayPersonas[0] = new Persona("Mario", 22, 187); arrayPersonas[1] = new Persona("Pepe", 52, 173); arrayPersonas[2] = new Persona("Manuel", 27, 158); arrayPersonas[3] = new Persona("David", 25, 164); arrayPersonas[4] = new Persona("Alberto", 80, 184); System.out.println("Array sin ordenar por altura"); imprimeArrayPersonas(arrayPersonas); // Ordeno el array de personas por altura (de menor a mayor). Arrays.sort(arrayPersonas); System.out.println("Array ordenado por altura"); imprimeArrayPersonas(arrayPersonas); } }

Y la salida:

Array sin ordenar por altura 1. Mario - Altura: 187 - Edad: 22 2. Pepe - Altura: 173 - Edad: 52 3. Manuel - Altura: 158 - Edad: 27 4. David - Altura: 164 - Edad: 25 5. Alberto - Altura: 184 - Edad: 80 Array ordenado por altura 1. Manuel - Altura: 158 - Edad: 27 2. David - Altura: 164 - Edad: 25 3. Pepe - Altura: 173 - Edad: 52 4. Alberto - Altura: 184 - Edad: 80 5. Mario - Altura: 187 - Edad: 22

Espero que os haya resultado útil.

Si queréis que explique algo que os pueda ser de ayuda, no dudéis en pedirlo.

¡Un saludo!