W3docs

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 case

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

AbordagemUsar 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 (AZ) ordena antes de cada letra minúscula (az). "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.

java— editable, runs on the server

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_ORDER ignora 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 original ainda 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.

Prática

Prática
Qual chamada ordena um ArrayList de Strings em ordem decrescente?
Qual chamada ordena um ArrayList de Strings em ordem decrescente?
Was this page helpful?