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(...).sortreturneazăvoid; lista se sortează pe loc. - Sortezi o listă creată cu
List.of: aruncăUnsupportedOperationException. Fă întâi o copie cunew ArrayList<>(...). - Scrii un comparator cu scădere (
(a, b) -> a - b) pentru numere mari: diferența poate depășiintși ordinea iese greșită. FoloseșteInteger.comparesauComparator.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.