CodeGym /Blog Java /Random-ES /Clasificación de colecciones de Java ()
Autor
Vasyl Malik
Senior Java Developer at CodeGym

Clasificación de colecciones de Java ()

Publicado en el grupo Random-ES
Una de las funciones más comunes que necesitamos como desarrolladores que manejan datos es la clasificación: al poder clasificar nuestros datos, podemos optimizar nuestros algoritmos para que se ejecuten mucho más rápido y encontrar los datos que necesitan en una fracción del tiempo que necesitan. tomaría de otra manera. En la lección de hoy, hablaremos sobre la ordenación de colecciones de Java (). Como experimento mental rápido: imagine que está buscando un nombre en la lista de una universidad. Puede haber decenas de miles de estudiantes en esta escuela. Si la lista que le dieron no estaba en orden alfabético, tendría que hojear cada página y mirar con mucho cuidado para asegurarse de no omitir un solo nombre en ninguna parte, hasta que finalmente encuentre el nombre que está buscando. Por otro lado, si la lista estaba alfabéticamente, no solo tienes que ser menos riguroso en tu búsqueda, pero podría saltar fácilmente a la sección en la lista con la misma primera letra y continuar saltando páginas a grandes saltos hasta que llegue a la persona que estaba buscando. Cuantos más datos trabaje, más importante es que los utilice de la manera más eficaz y eficiente posible. En este artículo, repasaremos cómo ordenar cualquier implementación de Lista en Java (incluido ArrayList) usando el método de ordenación de Colecciones.

Cómo ordenar una ArrayList en Java usando el método de ordenación Java Collections

Hablemos del método Java Collections.sort. El paquete java.util contiene muchas utilidades y paquetes útiles que los desarrolladores suelen utilizar, incluido ArrayList. Suponga que tiene el siguiente programa simple:

import java.util.*;
import java.io.*;
class Main{
     public static void main(String[] args){
          List<String> colors = new ArrayList<String>();
          colors.add("Red    ");
          colors.add("Orange");
          colors.add("Green");
          colors.add("Blue");
    }
}
Desea poder imprimir la lista de colores, pero en orden alfabético. ¿Cómo podrías hacer esto? Usando java.util.Collections, la clasificación es tan fácil como una sola línea:

Collections.sort(colors);
Ta-da! Su lista de colores ahora se ha ordenado en el lugar. Si tuviera que imprimir la lista, como tal:

System.out.println(colors);
Entonces obtendrías el siguiente resultado:

[Blue, Green, Orange, Red]
¡¿Qué tan fácil fue eso?! Sería igual de fácil usar Collections.sort() para clasificar en orden ascendente una lista de enteros, flotantes o cualquier otro tipo de datos simple. Pero, ¿y si quisiera ordenar en orden descendente? Definitivamente, hay casos en los que esto tiene sentido: imagine que tiene una lista de puntajes de exámenes para una clase determinada y desea averiguar quiénes son los estudiantes con puntajes más altos. Tendría mucho más sentido ordenar la lista en orden descendente (las puntuaciones más altas primero), de modo que las respuestas que busca estén en la parte superior. Afortunadamente, Collections.sort() se sobrescribe con un segundo parámetro opcional, que le permite hacer precisamente esto:

sort(List l, Comparator c)
Pero, ¿qué es un comparador? Bueno, un comparador es simplemente una función que compara dos entradas y devuelve un número que representa qué entrada viene primero. Si está ordenando una ArrayList de tipos de datos primitivos, Java Collections ya le proporciona un comparador reverseOrder(). Se puede llamar así:

Collections.sort(colors, Collections.reverseOrder());
Ahora, los colores se ordenaron de manera inversa en el lugar, de modo que si los imprimiera, obtendría el siguiente resultado:

[Red, Orange, Green, Blue]

Cómo usar Colecciones para ordenar tipos de datos no primitivos en Java

Hasta ahora, ha visto que ordenar ArrayLists de cadenas o enteros en Java usando el método Collections.sort() es tan fácil como una línea de código. Pero a menudo, sus ArrayLists almacenarán tipos de datos no primitivos. Cuando trabaje con datos que tienen atributos más complejos, querrá escribir clases para representar estos objetos y cómo se compararán entre sí usando sus atributos. Para explorar un ejemplo de esto, revisemos el ejemplo de ordenar una lista de colores, pero esta vez, en lugar de ordenar cadenas, ordenaremos objetos de color. Nuestra clase Color básica podría verse así:

public class Color{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(String name, int red, int green, int blue){
   	this.name = name;
    	this.r = red;
   	this.g = green;
   	this.b = blue;
	}
}
Para hacer que nuestra clase Color sea compatible con Collections.sort(), para que Collections pueda entender cómo comparar y ordenar objetos Color, necesitamos hacer dos pequeñas modificaciones:
  1. hacer que Color sea un objeto Comparable (agregar implementos Comparable<Object>)
  2. anular el método compareTo en la clase (anular public int compareTo(Object o))
Con estas modificaciones, nuestra clase ahora se ve así:

public class Color implements Comparable<Object>{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(int red int green, int blue, String name){
    	this.r = red;
   	this.g = green;
   	this.b = blue;
   	this.name = name;
	}

	@Override
	public int compareTo(Object o) {
    	Color c = (Color) o;
    	return this.name.compareTo(c.name);
	}
}
Observe que el método compareTo de Color simplemente llama al método compareTo de String; la clasificación se hará en orden alfabético. Si quisiéramos ordenar por valor rojo en orden ascendente, por ejemplo, podríamos reemplazar la instrucción return con return this.r - cr; (si quisiéramos ordenar por valor verde en orden descendente, sería return cg - this.g;). Ahora bien, si llamamos

Collections.sort(colors);
en un ArrayList of Colors en lugar de solo Strings, funcionaría porque Collections entiende cómo comparar objetos Color. Si no desea que su objeto implemente Comparable<Object>, alternativamente puede escribir un comparador para su clase y pasarlo al método Collections.sort() de 2 parámetros. Un comparador anula un método public int compare (Objeto uno, Objeto dos), y el método Collections.sort() lo usa para comparar objetos mientras los ordena. Un ejemplo de los comparadores SortByName y SortByRed se implementan a continuación:

class SortByName implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.name.compareTo(b.name);
	}
}

class SortByRGB implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.r - b.r;
	}
}
Con esto ya puedes llamar

Collections.sort(colors, new SortByName());
sin que la clase Color realmente implemente Comparable, y seguirá funcionando. A veces, verá que esto se hace en línea, usando funciones lambda. Una función lambda es esencialmente una función sin nombre que puede definir dentro de la línea de código que la llama. Son útiles cuando solo necesita llamar a una función para una instancia específica y no desea definir una función completamente separada en otro lugar. El comparador SortByName podría definirse en línea, usando una función lambda, como esta:

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
Como habrás adivinado, (a, b) representa los parámetros de las funciones lambda (los dos objetos a comparar). El -> significa que lo que sigue es una definición de función lambda. ¡Eso es todo! Ahora ha visto los métodos más populares para ordenar ArrayLists en Java utilizando el paquete Collections.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION