Come Ordinare un ArrayList in Java
Ordina un ArrayList Java con Collections.sort, List.sort, Comparable e Comparator.
Ordinare un ArrayList riordina i suoi elementi in-place. Il JDK offre due punti di ingresso — Collections.sort e il metodo di istanza List.sort — oltre a Comparator per qualsiasi ordinamento personalizzato o inverso. Questo capitolo mostra i modi idiomatici per farlo, spiega perché le stringhe con maiuscole e minuscole miste si ordinano nel modo in cui lo fanno, e termina con un esempio eseguibile che puoi confrontare fianco a fianco.
Ordinamento in Ordine Naturale
Per gli elementi che implementano Comparable (come String, Integer o LocalDate), Collections.sort li ordina nel loro ordine naturale.
List<String> names = new ArrayList<>(List.of("Charlie", "Bob", "Alice"));
Collections.sort(names);
System.out.println(names); // [Alice, Bob, Charlie]Lo stesso risultato si ottiene con il metodo di istanza names.sort(null) — passare null come comparatore significa "usa l'ordine naturale". L'ordinamento avviene in-place, quindi la lista originale viene riordinata anziché copiata.
Ordinamento con List.sort e un Comparator
Da Java 8, List dispone di un proprio metodo sort(Comparator). È più leggibile e si abbina naturalmente ai metodi factory di 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 supporta anche la composizione. Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()) ordina prima per lunghezza e risolve i pareggi alfabeticamente. Per gli oggetti, Comparator.comparing(Person::lastName) chiave su qualsiasi campo.
| Approccio | Quando usarlo |
|---|---|
Collections.sort(list) | Ordine naturale, codebase più vecchi |
list.sort(Comparator) | Moderno, leggibile, ordini personalizzati |
Comparator.reverseOrder() | Ordine naturale discendente |
Comparator.comparing(...) | Ordina oggetti per un campo |
Attenzione all'Ordine Predefinito delle Stringhe
L'ordine naturale di String si basa sui code point Unicode, quindi ogni lettera maiuscola (A–Z) viene ordinata prima di ogni lettera minuscola (a–z). "Bob" viene prima di "alice".
List<String> mixed = new ArrayList<>(List.of("alice", "Bob"));
mixed.sort(Comparator.naturalOrder());
System.out.println(mixed); // [Bob, alice]Se si desidera un ordinamento case-insensitive, usare String.CASE_INSENSITIVE_ORDER. Per un ordinamento sensibile alla lingua (accenti, regole locali), usare invece un java.text.Collator.
Un Esempio Eseguibile
Questo esempio parte da una lista, poi ordina copie di essa in quattro modi diversi così da poter confrontare i risultati fianco a fianco. La lista originale rimane invariata.
Cosa trarre dall'esecuzione:
- L'ordine naturale stampa
[Bob, Charlie, alice]perché i code point maiuscoli vengono ordinati prima di quelli minuscoli. Comparator.reverseOrder()inverte quell'ordine naturale a[alice, Charlie, Bob].String.CASE_INSENSITIVE_ORDERignora le maiuscole e restituisce[alice, Bob, Charlie].- Il comparatore per lunghezza dà
[Bob, alice, Charlie]— 3, poi 5, poi 7 lettere. - La lista
originalstampa ancora[Charlie, alice, Bob]nel suo ordine di inserimento, dimostrando che ogni ordinamento è stato eseguito su una copia, non sulla sorgente.