Java Academy · Lekcja

TreeMap: posortowane pary klucz-wartość

Używaj TreeMap do utrzymywania posortowanej kolejności i nawigowania za pomocą firstKey, lastKey, floorKey i ceilingKey.

Lekcja 1 z 413 kroki

TreeMap: posortowane pary klucz-wartość to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Czym jest TreeMap?

TreeMap to implementacja posortowanej mapy oparta na drzewie czerwono-czarnym. Klucze są utrzymywane w rosnącej kolejności naturalnej (lub w kolejności określonej przez własny komparator). Wszystkie podstawowe operacje mają złożoność O(log n).

import java.util.TreeMap;

TreeMap<String, Integer> scores = new TreeMap<>();
scores.put("Charlie", 85);
scores.put("Alice", 92);
scores.put("Bob", 78);

// Iteration is in key order: Alice, Bob, Charlie
for (var entry : scores.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

firstKey, lastKey, floorKey, ceilingKey

Interfejs NavigableMap klasy TreeMap udostępnia metody nawigacyjne służące do znajdowania kluczy względem podanej wartości:

TreeMap<Integer, String> map = new TreeMap<>();
map.put(10, "ten"); map.put(20, "twenty"); map.put(30, "thirty"); map.put(40, "forty");

System.out.println(map.firstKey());       // 10
System.out.println(map.lastKey());        // 40
System.out.println(map.floorKey(25));     // 20 (largest key ≤ 25)
System.out.println(map.ceilingKey(25));   // 30 (smallest key ≥ 25)
System.out.println(map.lowerKey(20));     // 10 (strictly less)
System.out.println(map.higherKey(20));    // 30 (strictly greater)

Nawigowanie po wpisach

floorEntry, ceilingEntry, firstEntry, lastEntry zwracają cały obiekt Map.Entry, a nie tylko klucz:

TreeMap<Integer, String> prices = new TreeMap<>();
prices.put(100, "Budget"); prices.put(300, "Standard"); prices.put(700, "Premium");

var entry = prices.floorEntry(350);
System.out.println(entry.getKey() + ": " + entry.getValue()); // 300: Standard

var top = prices.lastEntry();
System.out.println(top.getValue()); // Premium

subMap, headMap, tailMap

Wyodrębnij widoki zakresów z TreeMap. Widoki te są powiązane z oryginalną mapą — zmiany w jednym są odzwierciedlane w drugim.

TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 10; i++) map.put(i, "v"+i);

// Keys from 3 (inclusive) to 7 (exclusive)
System.out.println(map.subMap(3, 7));   // {3=v3, 4=v4, 5=v5, 6=v6}

// Keys strictly less than 5
System.out.println(map.headMap(5));     // {1=v1, 2=v2, 3=v3, 4=v4}

// Keys >= 7
System.out.println(map.tailMap(7));     // {7=v7, 8=v8, 9=v9, 10=v10}

Granice włączne i wyłączne

Użyj przeciążonych wariantów, aby precyzyjnie określić granice:

TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 10; i++) map.put(i*10, "v"+i);

// From 30 (inclusive) to 60 (inclusive)
System.out.println(map.subMap(30, true, 60, true));
// {30=v3, 40=v4, 50=v5, 60=v6}

Kolejność malejąca

Użyj descendingMap() lub descendingKeySet(), aby iterować po kluczach w odwrotnej kolejności:

TreeMap<String, Integer> tm = new TreeMap<>();
tm.put("A", 1); tm.put("C", 3); tm.put("B", 2);

for (String key : tm.descendingKeySet()) {
    System.out.print(key + " "); // C B A
}

pollFirstEntry i pollLastEntry

Atomowo usuń i zwróć pierwszy lub ostatni wpis — jest to przydatne przy tworzeniu map priorytetów:

TreeMap<Integer, String> events = new TreeMap<>();
events.put(8, "Breakfast");
events.put(12, "Lunch");
events.put(18, "Dinner");

var first = events.pollFirstEntry(); // removes 8=Breakfast
System.out.println(first.getValue() + " removed");
System.out.println(events.firstKey()); // 12

Przypadek użycia: tabela wyników

Tabela wyników wymaga posortowania graczy według wyniku. TreeMap automatycznie sortuje według klucza:

TreeMap<Integer, String> leaderboard = new TreeMap<>(Comparator.reverseOrder());
leaderboard.put(1200, "Alice");
leaderboard.put(1500, "Bob");
leaderboard.put(900, "Carol");

int rank = 1;
for (var e : leaderboard.entrySet()) {
    System.out.println(rank++ + ". " + e.getValue() + " (" + e.getKey() + ")");
}
// 1. Bob (1500)
// 2. Alice (1200)
// 3. Carol (900)

Przypadek użycia: harmonogram zdarzeń

Przypisz zdarzenia do znaczników czasu — użyj ceilingEntry, aby znaleźć następne zaplanowane zdarzenie po określonym czasie:

import java.time.LocalTime;
TreeMap<LocalTime, String> schedule = new TreeMap<>();
schedule.put(LocalTime.of(9,0), "Standup");
schedule.put(LocalTime.of(14,0), "Review");
schedule.put(LocalTime.of(17,0), "Retro");

LocalTime now = LocalTime.of(11, 30);
var next = schedule.ceilingEntry(now);
System.out.println("Next: " + next.getValue()); // Review

Wydajność TreeMap a HashMap

Najważniejsze różnice:

  • HashMap: średnio O(1) dla get/put; brak uporządkowania
  • TreeMap: O(log n) dla get/put; sortowanie według klucza
  • LinkedHashMap: średnio O(1); kolejność wstawiania

Użyj TreeMap, gdy potrzebujesz posortowanych kluczy lub zapytań zakresowych. HashMap jest szybsza przy prostym wyszukiwaniu kluczy.

Bezpieczeństwo wątkowe

TreeMap NIE jest bezpieczna wątkowo. W przypadku dostępu współbieżnego użyj ConcurrentSkipListMap, która również zachowuje sortowanie i zapewnia operacje o złożoności O(log n), a także obsługuje równoczesny odczyt i zapis.

Szybkie sprawdzenie

Masz obiekt TreeMap<Integer, String> z kluczami {10, 20, 30, 40}. Co zwraca map.floorKey(25)?

Podsumowanie: TreeMap

Najważniejsze informacje:

  • TreeMap utrzymuje klucze w posortowanej kolejności rosnącej za pomocą drzewa czerwono-czarnego
  • Wszystkie operacje mają złożoność O(log n)
  • Nawigacja: firstKey, lastKey, floorKey, ceilingKey, lowerKey, higherKey
  • Widoki zakresów: subMap, headMap, tailMap (widoki powiązane z mapą)
  • Użyj ConcurrentSkipListMap dla bezpiecznych wątkowo posortowanych map
Bezpłatny start

Ucz się Java dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
104
Lekcje
374

Często zadawane pytania

Czy lekcja „TreeMap: posortowane pary klucz-wartość” jest bezpłatna?

Tak — pełny tekst „TreeMap: posortowane pary klucz-wartość” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „TreeMap: posortowane pary klucz-wartość”?

Używaj TreeMap do utrzymywania posortowanej kolejności i nawigowania za pomocą firstKey, lastKey, floorKey i ceilingKey. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „TreeMap: posortowane pary klucz-wartość”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. TreeMap: posortowane pary klucz-wartość
  2. Podmapy i widoki zakresów
  3. TreeSet i NavigableSet
  4. Własny porządek w kolekcjach typu Tree
← Powrót do Java Academy