0Pricing
Java Academy · Lektion

TreeSet und NavigableSet

Speichern Sie eindeutige sortierte Elemente und verwenden Sie floor, ceiling, higher und lower für Nachbarschaftsabfragen.

TreeSet und NavigableSet ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist TreeSet?

TreeSet ist eine sortierte Menge, die auf einem Rot-Schwarz-Baum basiert. Sie speichert eindeutige Elemente in aufsteigender natürlicher Ordnung (oder gemäß einem übergebenen Comparator). Alle Operationen haben die Komplexität O(log n).

import java.util.TreeSet;

TreeSet<String> names = new TreeSet<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");
names.add("Alice"); // duplicate ignored

for (String s : names) System.out.print(s + " ");
// Alice Bob Charlie

NavigableSet-Methoden: floor, ceiling, lower, higher

TreeSet implementiert NavigableSet und stellt Navigationsmethoden bereit, um die jeweils nächstgelegenen Elemente zu finden:

TreeSet<Integer> set = new TreeSet<>();
for (int i = 10; i <= 50; i += 10) set.add(i);
// {10, 20, 30, 40, 50}

System.out.println(set.floor(25));   // 20 (greatest ≤ 25)
System.out.println(set.ceiling(25)); // 30 (smallest ≥ 25)
System.out.println(set.lower(30));   // 20 (strictly less)
System.out.println(set.higher(30));  // 40 (strictly greater)

first, last, pollFirst, pollLast

Greifen Sie auf die Grenzelemente zu oder entfernen Sie sie:

TreeSet<String> ts = new TreeSet<>(Set.of("cherry","apple","banana","date"));

System.out.println(ts.first());       // apple
System.out.println(ts.last());        // date
System.out.println(ts.pollFirst());   // apple (removed)
System.out.println(ts.pollLast());    // date (removed)
System.out.println(ts);              // [banana, cherry]

headSet, tailSet, subSet

Extrahieren Sie sortierte Teilmengenansichten:

TreeSet<Integer> set = new TreeSet<>(Set.of(1,2,3,4,5,6,7,8,9,10));

System.out.println(set.headSet(5));      // [1, 2, 3, 4]
System.out.println(set.tailSet(7));      // [7, 8, 9, 10]
System.out.println(set.subSet(3, 7));    // [3, 4, 5, 6]

// Inclusive upper bound:
System.out.println(set.subSet(3, true, 7, true)); // [3,4,5,6,7]

Absteigende Iteration

Verwenden Sie descendingIterator() oder descendingSet() für die umgekehrte Reihenfolge:

TreeSet<Integer> ts = new TreeSet<>(Set.of(1,3,5,7,9));

// Descending iterator
var it = ts.descendingIterator();
while (it.hasNext()) System.out.print(it.next() + " ");
// 9 7 5 3 1

Benutzerdefinierte Ordnung mit Comparator

Übergeben Sie einen Comparator, um nach einer nicht natürlichen Ordnung zu sortieren – zum Beispiel längste Zeichenfolge zuerst:

TreeSet<String> byLength = new TreeSet<>(
    Comparator.comparingInt(String::length)
              .thenComparing(Comparator.naturalOrder())
);
byLength.add("Hi");
byLength.add("Hello");
byLength.add("Hey");
byLength.add("Java");

for (String s : byLength) System.out.print(s + " ");
// Hi Hey Java Hello

Anwendungsfall: Sortierte eindeutige Benutzernamen

Speichern Sie Benutzernamen in einem TreeSet, um automatisch Duplikate zu entfernen und die alphabetische Reihenfolge beizubehalten:

TreeSet<String> users = new TreeSet<>();
users.add("alice");
users.add("bob");
users.add("alice"); // ignored
users.add("carol");

System.out.println(users.first()); // alice
System.out.println(users);         // [alice, bob, carol]

Anwendungsfall: Zählen in einem Bereich

Zählen Sie mithilfe von subSet die Elemente in einem Bereich:

TreeSet<Integer> scores = new TreeSet<>();
for (int s : new int[]{45,62,78,55,90,88,34,71}) scores.add(s);

// Scores between 60 and 89 (inclusive)
int count = scores.subSet(60, true, 89, true).size();
System.out.println("Students in B range: " + count); // 3 (62, 78, 88... wait: 62,78,71,88=4)
// Actually: 62,71,78,88 = 4

TreeSet vs. HashSet vs. LinkedHashSet

Wählen Sie je nach Bedarf:

  • HashSet: O(1)-Operationen, ungeordnet
  • LinkedHashSet: O(1)-Operationen, in Einfügereihenfolge
  • TreeSet: O(log n)-Operationen, sortierte Reihenfolge, Navigationsmethoden

TreeSet erfordert, dass die Elemente Comparable implementieren oder ein Comparator bereitgestellt wird.

Null-Elemente

TreeSet erlaubt bei Verwendung der natürlichen Ordnung KEINE Null-Elemente – es wird eine NullPointerException ausgelöst, da null nicht verglichen werden kann. Ein benutzerdefinierter Comparator, der null explizit behandelt, würde funktionieren.

TreeSet<String> ts = new TreeSet<>();
try {
    ts.add(null); // throws NullPointerException
} catch (NullPointerException e) {
    System.out.println("Cannot add null: " + e);
}

Threadsicherheit

TreeSet ist NICHT threadsicher. Synchronisieren Sie es extern mit Collections.synchronizedSortedSet(), oder verwenden Sie ConcurrentSkipListSet, das sowohl sortiert als auch threadsicher ist.

Kurzer Test

Ein TreeSet<Integer> enthält {10, 20, 30, 40, 50}. Was gibt set.ceiling(35) zurück?

Zusammenfassung: TreeSet und NavigableSet

Wichtigste Erkenntnisse:

  • TreeSet speichert eindeutige sortierte Elemente (O(log n))
  • Implementiert NavigableSet: floor, ceiling, lower, higher, first, last
  • headSet, tailSet und subSet geben gebundene Bereichsansichten zurück
  • Verwenden Sie descendingSet()/descendingIterator() für die umgekehrte Reihenfolge
  • Nicht threadsicher – verwenden Sie für gleichzeitige Zugriffe ConcurrentSkipListSet

Häufig gestellte Fragen

Ist die Lektion „TreeSet und NavigableSet“ kostenlos?

Ja — der vollständige Text von „TreeSet und NavigableSet“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „TreeSet und NavigableSet“?

Speichern Sie eindeutige sortierte Elemente und verwenden Sie floor, ceiling, higher und lower für Nachbarschaftsabfragen. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „TreeSet und NavigableSet“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. TreeMap: Sortierte Schlüssel-Wert-Paare
  2. Teil-Maps und Bereichsansichten
  3. TreeSet und NavigableSet
  4. Eigene Ordnung in Tree-Collections
← Zurück zu Java Academy