Como Ordenar um ArrayList em Java
Ordene um ArrayList em Java usando Collections.sort, List.sort, Comparable e Comparator.
Ordenar um ArrayList reordena seus elementos in-place. O JDK oferece dois pontos de entrada — Collections.sort e o método de instância List.sort — além de Comparator para qualquer ordenação personalizada ou invertida. Este capítulo mostra as formas idiomáticas de fazer isso, explica por que strings com letras maiúsculas e minúsculas misturas ordenam da forma que ordenam, e termina com um exemplo executável que você pode comparar lado a lado.
Ordenar em Ordem Natural
Para elementos que implementam Comparable (como String, Integer ou LocalDate), Collections.sort os ordena em sua ordem natural.
List<String> names = new ArrayList<>(List.of("Charlie", "Bob", "Alice"));
Collections.sort(names);
System.out.println(names); // [Alice, Bob, Charlie]O mesmo resultado vem do método de instância names.sort(null) — passar null como comparador significa "usar a ordem natural." A ordenação ocorre in-place, então a lista original é reordenada em vez de copiada.
Ordenar com List.sort e um Comparator
Desde o Java 8, List tem seu próprio método sort(Comparator). Ele é mais fluente de ler e combina naturalmente com os 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 caseComparator também compõe. Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()) ordena por comprimento primeiro e desempata alfabeticamente. Para objetos, Comparator.comparing(Person::lastName) utiliza qualquer campo como chave.
| Abordagem | Usar quando |
|---|---|
Collections.sort(list) | Ordem natural, bases de código mais antigas |
list.sort(Comparator) | Moderno, legível, ordens personalizadas |
Comparator.reverseOrder() | Ordem natural decrescente |
Comparator.comparing(...) | Ordenar objetos por um campo |
Atenção à Ordem Padrão de Strings
A ordem natural de String é baseada em pontos de código Unicode, então cada letra maiúscula (A–Z) ordena antes de cada letra minúscula (a–z). "Bob" fica antes de "alice".
List<String> mixed = new ArrayList<>(List.of("alice", "Bob"));
mixed.sort(Comparator.naturalOrder());
System.out.println(mixed); // [Bob, alice]Se você quiser ordenação sem distinção entre maiúsculas e minúsculas, use String.CASE_INSENSITIVE_ORDER. Para ordenação com reconhecimento de idioma (acentos, regras de localidade), use um java.text.Collator.
Um Exemplo Executável
Este exemplo começa com uma lista e depois ordena cópias dela de quatro maneiras diferentes para que você possa comparar os resultados lado a lado. A lista original permanece intacta.
O que observar na execução:
- A ordem natural imprime
[Bob, Charlie, alice]porque os pontos de código maiúsculos ordenam antes dos minúsculos. Comparator.reverseOrder()inverte essa ordem natural para[alice, Charlie, Bob].String.CASE_INSENSITIVE_ORDERignora maiúsculas/minúsculas e produz[alice, Bob, Charlie].- O comparador por comprimento produz
[Bob, alice, Charlie]— 3, depois 5, depois 7 letras. - A lista
originalainda imprime[Charlie, alice, Bob]em sua ordem de inserção, provando que cada ordenação foi executada em uma cópia, não na fonte.