W3docs

Cómo ordenar un ArrayList en Java

Ordena un ArrayList de Java con Collections.sort, List.sort, Comparable y Comparator.

Ordenar un ArrayList reordena sus elementos en el lugar. El JDK ofrece dos puntos de entrada — Collections.sort y el método de instancia List.sort — además de Comparator para cualquier orden personalizado o inverso. Este capítulo muestra las formas idiomáticas de hacerlo, explica por qué las cadenas con mayúsculas y minúsculas mezcladas se ordenan como lo hacen, y termina con un ejemplo ejecutable que puedes comparar lado a lado.

Ordenar en orden natural

Para elementos que implementan Comparable (como String, Integer o LocalDate), Collections.sort los ordena en su orden natural.

List<String> names = new ArrayList<>(List.of("Charlie", "Bob", "Alice"));
Collections.sort(names);
System.out.println(names); // [Alice, Bob, Charlie]

El mismo resultado se obtiene con el método de instancia names.sort(null) — pasar null como comparador significa "usar el orden natural". La ordenación ocurre en el lugar, por lo que la lista original se reordena en lugar de copiarse.

Ordenar con List.sort y un Comparator

Desde Java 8, List tiene su propio método sort(Comparator). Se lee de forma más fluida y se combina de manera natural con los métodos de fábrica de Comparator.

List<String> names = new ArrayList<>(List.of("Charlie", "Bob", "Alice"));
names.sort(Comparator.naturalOrder());        // ascending
names.sort(Comparator.reverseOrder());        // descending
names.sort(String.CASE_INSENSITIVE_ORDER);    // ignore letter case

Comparator también se puede componer. Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()) ordena primero por longitud y desempata alfabéticamente. Para objetos, Comparator.comparing(Person::lastName) ordena por cualquier campo.

EnfoqueCuándo usarlo
Collections.sort(list)Orden natural, bases de código antiguas
list.sort(Comparator)Moderno, legible, órdenes personalizados
Comparator.reverseOrder()Orden natural descendente
Comparator.comparing(...)Ordenar objetos por un campo

Cuidado con el orden predeterminado de String

El orden natural de String se basa en puntos de código Unicode, por lo que todas las letras mayúsculas (AZ) se ordenan antes que todas las letras minúsculas (az). "Bob" aparece antes que "alice".

List<String> mixed = new ArrayList<>(List.of("alice", "Bob"));
mixed.sort(Comparator.naturalOrder());
System.out.println(mixed); // [Bob, alice]

Si quieres un orden sin distinción entre mayúsculas y minúsculas, usa String.CASE_INSENSITIVE_ORDER. Para un orden sensible al idioma (acentos, reglas de locale), usa un java.text.Collator en su lugar.

Un ejemplo ejecutable

Este ejemplo parte de una lista, luego ordena copias de ella de cuatro maneras distintas para que puedas comparar los resultados lado a lado. La lista original no se modifica.

java— editable, runs on the server

Lo que se puede concluir de la ejecución:

  • El orden natural imprime [Bob, Charlie, alice] porque los puntos de código en mayúsculas se ordenan antes que los de minúsculas.
  • Comparator.reverseOrder() invierte ese orden natural a [alice, Charlie, Bob].
  • String.CASE_INSENSITIVE_ORDER ignora las mayúsculas y produce [alice, Bob, Charlie].
  • El comparador por longitud da [Bob, alice, Charlie] — 3, luego 5, luego 7 letras.
  • La lista original sigue imprimiendo [Charlie, alice, Bob] en su orden de inserción, demostrando que cada ordenación se realizó sobre una copia, no sobre la fuente.

Práctica

Práctica
¿Qué llamada ordena un ArrayList de Strings en orden descendente?
¿Qué llamada ordena un ArrayList de Strings en orden descendente?
Was this page helpful?