Collections.sort în Java

Sortează o listă pe loc: crescător după ordinea naturală sau după un Comparator dat. Echivalent cu lista.sort(...).

Sintaxă
static <T extends Comparable<? super T>> void sort(List<T> list)
static <T> void sort(List<T> list, Comparator<? super T> c)

Ce face Collections.sort

Collections.sort(lista) rearanjează elementele listei în ordine crescătoare: numerele de la mic la mare, textele alfabetic (după codurile Unicode). Lista însăși se modifică; metoda nu returnează nimic.

Cu al doilea argument dai regula de ordonare: Collections.sort(lista, Comparator.reverseOrder()) sau Comparator.comparing(Elev::nume). Sortarea este stabilă: elementele egale își păstrează ordinea relativă, deci poți sorta în mai mulți pași.

Din Java 8 poți scrie la fel de bine lista.sort(comparator) (cu null pentru ordinea naturală); Collections.sort o apelează în spate. Lista trebuie să fie modificabilă.

Parametri

Parametru Descriere
list Lista de sortat (modificabilă).
c Comparatorul; dacă lipsește, elementele trebuie să fie Comparable.

Ce returnează

Nimic (void); lista este sortată pe loc.

Exemple

Exemplul 1: Nume și note sortate

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

public class Main {
    public static void main(String[] args) {
        List<String> nume = new ArrayList<>(List.of("Radu", "Ana", "Elena", "Bogdan"));
        Collections.sort(nume);
        System.out.println(nume);

        List<Integer> note = new ArrayList<>(List.of(7, 10, 5, 9));
        Collections.sort(note, Comparator.reverseOrder());
        System.out.println(note);
    }
}

Rezultat

[Ana, Bogdan, Elena, Radu]
[10, 9, 7, 5]

Exemplul 2: Sortarea unor obiecte după mai multe criterii

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

public class Main {
    record Produs(String nume, String categorie, double pret) {}

    public static void main(String[] args) {
        List<Produs> produse = new ArrayList<>(List.of(
                new Produs("lapte", "lactate", 8.5),
                new Produs("pâine", "panificație", 5.0),
                new Produs("brânză", "lactate", 32.0),
                new Produs("covrig", "panificație", 2.5)));
        Collections.sort(produse, Comparator.comparing(Produs::categorie).thenComparingDouble(Produs::pret));
        for (Produs p : produse) {
            System.out.println(p.categorie() + " | " + p.nume() + " | " + p.pret() + " lei");
        }
    }
}

Rezultat

lactate | lapte | 8.5 lei
lactate | brânză | 32.0 lei
panificație | covrig | 2.5 lei
panificație | pâine | 5.0 lei

Greșeli frecvente

  • Scrii lista = Collections.sort(lista);. Metoda returnează void; nu atribui rezultatul.
  • Sortezi o listă creată cu List.of. Apare UnsupportedOperationException; copiaz-o în new ArrayList<>(...).
  • Sortezi textele românești și te miri că „Ștefan” vine după „Zoe”. Ordinea implicită folosește codurile caracterelor; pentru ordinea limbii folosește java.text.Collator.getInstance(Locale.of("ro")) ca comparator.

Comenzi înrudite

  • List.sort: Sortează lista pe loc după comparatorul dat; cu null sortează în ordinea naturală (numere crescător, texte alfabetic).
  • Arrays.sort: Sortează pe loc un array: crescător pentru numere și texte sau după un Comparator pentru array-uri de obiecte.
  • 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).
  • Collections.reverse: reverse inversează pe loc ordinea elementelor unei liste; swap schimbă între ele elementele de pe două poziții.
  • Collections.binarySearch: Caută rapid o valoare într-o listă sortată, prin înjumătățiri. Returnează poziția sau un număr negativ care arată unde ar trebui inserată.