List.sort în Java

Sortează lista pe loc după comparatorul dat; cu null sortează în ordinea naturală (numere crescător, texte alfabetic).

Sintaxă
default void sort(Comparator<? super E> c)

Ce face List.sort

lista.sort(c) rearanjează elementele chiar în listă (nu creează o listă nouă). Comparatorul c spune care element vine primul. Dacă dai null, elementele trebuie să fie Comparable și se sortează în ordinea lor naturală: numerele crescător, textele după codurile caracterelor.

Sortarea este stabilă: elementele egale își păstrează ordinea relativă. De aceea poți sorta întâi după un criteriu secundar și apoi după cel principal, dar e mai clar să folosești Comparator.comparing(...).thenComparing(...).

Ordinea „naturală” a textelor nu ține cont de alfabetul românesc: literele cu diacritice (ă, ș, ț) ajung după z, iar literele mari înaintea celor mici. Pentru ordine românească corectă folosește java.text.Collator.getInstance(Locale.of("ro")) ca comparator.

Parametri

Parametru Descriere
c Comparatorul; null înseamnă ordinea naturală.

Ce returnează

Nimic (void): lista însăși devine sortată.

Exemple

Exemplul 1: Sortare crescătoare și descrescătoare

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> note = new ArrayList<>(List.of(7, 10, 5, 9, 8));
        note.sort(null);
        System.out.println("Crescător: " + note);
        note.sort(Comparator.reverseOrder());
        System.out.println("Descrescător: " + note);
    }
}

Rezultat

Crescător: [5, 7, 8, 9, 10]
Descrescător: [10, 9, 8, 7, 5]

Exemplul 2: Sortarea elevilor după medie, apoi după nume

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Main {
    record Elev(String nume, double medie) {}

    public static void main(String[] args) {
        List<Elev> elevi = new ArrayList<>(List.of(
            new Elev("Radu", 8.5), new Elev("Ana", 9.75),
            new Elev("Elena", 8.5), new Elev("Mihai", 7.25)));

        elevi.sort(Comparator.comparingDouble(Elev::medie).reversed()
                             .thenComparing(Elev::nume));
        for (Elev e : elevi) {
            System.out.println(e.medie() + "  " + e.nume());
        }
    }
}

Rezultat

9.75  Ana
8.5  Elena
8.5  Radu
7.25  Mihai

Exemplul 3: Ordine naturală vs. ordine românească

Fără Collator, „Ștefan” ajunge după „Zamfir”, pentru că „Ș” are un cod mai mare decât „Z”. Collator cu limba română pune numele unde le-ar căuta un om.

import java.text.Collator;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        List<String> nume = new ArrayList<>(List.of("Zamfir", "Ștefan", "Sorin", "Ana", "Țuțu", "Tudor"));
        nume.sort(null);
        System.out.println("Natural:   " + nume);
        nume.sort(Collator.getInstance(Locale.of("ro")));
        System.out.println("Românește: " + nume);
    }
}

Rezultat

Natural:   [Ana, Sorin, Tudor, Zamfir, Ștefan, Țuțu]
Românește: [Ana, Sorin, Ștefan, Tudor, Țuțu, Zamfir]

Greșeli frecvente

  • Scrii lista = lista.sort(...). sort returnează void; lista se sortează pe loc.
  • Sortezi o listă creată cu List.of: aruncă UnsupportedOperationException. Fă întâi o copie cu new ArrayList<>(...).
  • Scrii un comparator cu scădere ((a, b) -> a - b) pentru numere mari: diferența poate depăși int și ordinea iese greșită. Folosește Integer.compare sau Comparator.comparingInt.

Comenzi înrudite

  • Collections.sort: Sortează o listă pe loc: crescător după ordinea naturală sau după un Comparator dat. Echivalent cu lista.sort(…).
  • Comparator: Interfața care spune cum se ordonează două obiecte: compare(a, b) returnează un număr negativ, zero sau pozitiv.
  • Comparator.comparing: Construiește un comparator care ordonează obiectele după o proprietate: comparing(Elev::nume), comparingInt(Elev::varsta).
  • Comparator.thenComparing: thenComparing adaugă un criteriu secundar pentru elementele egale după primul; reversed() inversează un comparator.
  • Arrays.sort: Sortează pe loc un array: crescător pentru numere și texte sau după un Comparator pentru array-uri de obiecte.
  • List.reversed: Returnează o vedere a listei în ordine inversă; nu copiază elementele și urmărește modificările listei originale.