TreeMap în Java

Dicționar care ține cheile mereu sortate și oferă căutări de tip „prima cheie”, „cea mai apropiată cheie”, „intervalul de chei”.

Sintaxă
new TreeMap<>()
new TreeMap<>(Comparator<? super K> comparator)
new TreeMap<>(Map<? extends K, ? extends V> m)

Ce face TreeMap

TreeMap păstrează perechile într-un arbore echilibrat, ordonate după cheie: numerele crescător, textele alfabetic (după codurile caracterelor), datele cronologic. Parcurgerea, afișarea, keySet() și values() respectă această ordine. Operațiile sunt rapide (timp logaritmic), puțin mai lente decât la HashMap.

Pentru altă ordine dai un Comparator la constructor, de exemplu new TreeMap<>(Comparator.reverseOrder()). Cheile pe care comparatorul le consideră egale sunt aceeași cheie.

Pe lângă metodele din Map, are metode de navigare: firstKey/lastKey, ceilingKey/floorKey, headMap/tailMap/subMap, descendingMap. Nu acceptă cheia null.

Parametri

Parametru Descriere
comparator Ordinea cheilor. Fără el, cheile trebuie să fie Comparable.
m Map din care se copiază perechile (de exemplu un HashMap, ca să-l afișezi sortat).

Ce returnează

Un dicționar sortat, modificabil.

Exemple

Exemplul 1: Cheltuieli pe zile, în ordine cronologică

import java.time.LocalDate;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        TreeMap<LocalDate, Integer> cheltuieli = new TreeMap<>();
        cheltuieli.put(LocalDate.of(2026, 10, 15), 120);
        cheltuieli.put(LocalDate.of(2026, 10, 3), 45);
        cheltuieli.put(LocalDate.of(2026, 10, 9), 300);
        cheltuieli.forEach((zi, lei) -> System.out.println(zi + ": " + lei + " lei"));
        System.out.println("Invers: " + cheltuieli.descendingMap());
    }
}

Rezultat

2026-10-03: 45 lei
2026-10-09: 300 lei
2026-10-15: 120 lei
Invers: {2026-10-15=120, 2026-10-09=300, 2026-10-03=45}

Exemplul 2: Clasament invers după punctaj

import java.util.Comparator;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        TreeMap<Integer, String> clasament = new TreeMap<>(Comparator.reverseOrder());
        clasament.put(87, "Ana");
        clasament.put(95, "Radu");
        clasament.put(72, "Elena");
        System.out.println(clasament);
        System.out.println("Câștigător: " + clasament.firstEntry().getValue());
    }
}

Rezultat

{95=Radu, 87=Ana, 72=Elena}
Câștigător: Radu

Greșeli frecvente

  • Folosești ca cheie o clasă care nu este Comparable, fără comparator. Primul put aruncă ClassCastException.
  • Pui cheia null. TreeMap aruncă NullPointerException.
  • Te aștepți ca textele să fie sortate „ca în dicționarul românesc”. Ordinea implicită folosește codurile Unicode, deci „Ș” vine după „Z”. Pentru ordinea limbii, dă un java.text.Collator ca comparator.

Comenzi înrudite

  • Map: Interfața pentru dicționare: perechi cheie → valoare, în care găsești rapid valoarea după cheie. Cheile sunt unice.
  • HashMap: Dicționarul cel mai rapid: put, get și remove în timp aproape constant, dar fără ordine garantată a cheilor.
  • TreeSet: Mulțime care ține elementele mereu sortate (crescător sau după un Comparator) și oferă căutări de tip „cel mai mic”, „cel mai apropiat”.
  • TreeMap.firstKey: firstKey() returnează cea mai mică cheie dintr-un TreeMap, lastKey() pe cea mai mare. Pe un map gol aruncă excepție.
  • TreeMap.headMap: headMap(x) dă partea unui TreeMap cu cheile mai mici decât x; tailMap(x) partea cu cheile mai mari sau egale.
  • TreeMap.ceilingKey: ceilingKey(x) găsește cea mai mică cheie mai mare sau egală cu x, floorKey(x) cea mai mare cheie mai mică sau egală.