W3docs

Comment trier un ArrayList en Java

Triez un ArrayList Java avec Collections.sort, List.sort, Comparable et Comparator.

Trier un ArrayList réordonne ses éléments sur place. Le JDK vous offre deux points d'entrée — Collections.sort et la méthode d'instance List.sort — ainsi que Comparator pour tout ordre personnalisé ou inversé. Ce chapitre présente les approches idiomatiques, explique pourquoi les chaînes en casse mixte se trient de cette façon, et se termine par un exemple exécutable que vous pouvez comparer côte à côte.

Trier dans l'ordre naturel

Pour les éléments qui implémentent Comparable (tels que String, Integer ou LocalDate), Collections.sort les trie dans leur ordre naturel.

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

Le même résultat s'obtient avec la méthode d'instance names.sort(null) — passer null comme comparateur signifie « utiliser l'ordre naturel ». Le tri s'effectue sur place, donc la liste originale est réordonnée plutôt que copiée.

Trier avec List.sort et un Comparator

Depuis Java 8, List dispose de sa propre méthode sort(Comparator). Elle se lit plus fluidement et s'associe naturellement aux méthodes de fabrique 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 se compose également. Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()) trie d'abord par longueur et départage les égalités alphabétiquement. Pour les objets, Comparator.comparing(Person::lastName) s'appuie sur n'importe quel champ.

ApprocheÀ utiliser quand
Collections.sort(list)Ordre naturel, bases de code plus anciennes
list.sort(Comparator)Moderne, lisible, ordres personnalisés
Comparator.reverseOrder()Ordre naturel décroissant
Comparator.comparing(...)Trier des objets par un champ

Attention à l'ordre des chaînes par défaut

L'ordre naturel des String est basé sur les points de code Unicode, donc chaque lettre majuscule (AZ) se trie avant chaque lettre minuscule (az). "Bob" arrive avant "alice".

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

Si vous souhaitez un ordre insensible à la casse, utilisez String.CASE_INSENSITIVE_ORDER. Pour un ordre tenant compte de la langue (accents, règles de locale), utilisez plutôt un java.text.Collator.

Un exemple exécutable

Cet exemple part d'une liste, puis trie des copies de celle-ci de quatre façons différentes afin de pouvoir comparer les résultats côte à côte. La liste originale reste intacte.

java— editable, runs on the server

Ce que l'on retient de l'exécution :

  • L'ordre naturel affiche [Bob, Charlie, alice] car les points de code majuscules se trient avant les minuscules.
  • Comparator.reverseOrder() inverse cet ordre naturel en [alice, Charlie, Bob].
  • String.CASE_INSENSITIVE_ORDER ignore la casse et donne [alice, Bob, Charlie].
  • Le comparateur de longueur donne [Bob, alice, Charlie] — 3, puis 5, puis 7 lettres.
  • La liste original affiche toujours [Charlie, alice, Bob] dans son ordre d'insertion, prouvant que chaque tri s'est effectué sur une copie, pas sur la source.

Pratique

Pratique
Quel appel trie un ArrayList de Strings par ordre décroissant ?
Quel appel trie un ArrayList de Strings par ordre décroissant ?
Was this page helpful?