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 CharlieNavigableSet-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 1Benutzerdefinierte 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 HelloAnwendungsfall: 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 = 4TreeSet 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
- TreeMap: Sortierte Schlüssel-Wert-Paare
- Teil-Maps und Bereichsansichten
- TreeSet und NavigableSet
- Eigene Ordnung in Tree-Collections