Java TreeMap: Sortierte Maps meistern mit praktischen Beispielen
Java TreeMap
Erkunden Sie die Java TreeMap-Klasse – eine leistungsstarke, natürlich sortierte Map-Implementierung – mit klaren Beispielen, Schlüsseloperationen und fortgeschrittenen Navigationstechniken.
Die TreeMap-Klasse ist Teil des Java Collections Framework und bietet eine Rot-Schwarz-Baum-Implementierung, die ihre Einträge gemäß der natürlichen Ordnung der Schlüssel oder einem benutzerdefinierten Comparator sortiert hält. Sie implementiert das NavigableMap-Interface, das praktische Methoden für Traversierung und Abfrage der Map hinzufügt.
TreeMap erstellen
Bevor Sie eine TreeMap nutzen können, importieren Sie das Paket:
import java.util.TreeMap;
Dann erstellen Sie eine Instanz:
TreeMap<Key, Value> numbers = new TreeMap<>();
Standardmäßig sind Schlüssel in natürlicher aufsteigender Reihenfolge sortiert. Benötigen Sie benutzerdefinierte Ordnung, übergeben Sie einen Comparator an den Konstruktor.
- Key – einzigartiger Identifikator für jeden Eintrag.
- Value – Daten assoziiert mit dem Schlüssel.
TreeMap Methoden Überblick
Die Klasse bietet einen reichen Satz an Operationen. Unten sind Schlüsselkategorien mit Code-Snippets.
Elemente einfügen
put()– fügt Schlüssel/Wert-Paar hinzu oder ersetzt.putAll()– merged eine andere Map in diese.putIfAbsent()– fügt nur ein falls Schlüssel fehlt.
Beispiel:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> evenNumbers = new TreeMap<>(); evenNumbers.put("Two", 2); evenNumbers.put("Four", 4); evenNumbers.putIfAbsent("Six", 6); System.out.println("TreeMap of even numbers: " + evenNumbers); TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("One", 1); numbers.putAll(evenNumbers); System.out.println("TreeMap of numbers: " + numbers); } }
Ausgabe
TreeMap of even numbers: {Four=4, Six=6, Two=2} TreeMap of numbers: {Four=4, One=1, Six=6, Two=2}
Auf Elemente zugreifen
Collection Views nutzen
entrySet()– gibt alle Schlüssel/Wert-Paare zurück.keySet()– gibt alle Schlüssel zurück.values()– gibt alle Werte zurück.
Beispiel:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("TreeMap: " + numbers); System.out.println("Key/Value mappings: " + numbers.entrySet()); System.out.println("Keys: " + numbers.keySet()); System.out.println("Values: " + numbers.values()); } }
Ausgabe
TreeMap: {One=1, Three=3, Two=2} Key/Value mappings: [One=1, Three=3, Two=2] Keys: [One, Three, Two] Values: [1, 3, 2]
Werte abrufen
get()– gibt Wert für Schlüssel zurück odernullfalls abwesend.getOrDefault()– gibt Default falls Schlüssel fehlt.
Beispiel:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("TreeMap: " + numbers); int value1 = numbers.get("Three"); System.out.println("Using get(): " + value1); int value2 = numbers.getOrDefault("Five", 5); System.out.println("Using getOrDefault(): " + value2); } }
Ausgabe
TreeMap: {One=1, Three=3, Two=2} Using get(): 3 Using getOrDefault(): 5
Einträge entfernen
remove(key)– löscht Eintrag und gibt dessen Wert zurück.remove(key, value)– löscht nur falls Key auf angegebenen Value mappt.
Beispiel:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("TreeMap: " + numbers); int removed = numbers.remove("Two"); System.out.println("Removed value: " + removed); boolean removedPair = numbers.remove("Three", 3); System.out.println("Is the entry {Three=3} removed? " + removedPair); System.out.println("Updated TreeMap: " + numbers); } }
Ausgabe
TreeMap: {One=1, Three=3, Two=2} Removed value: 2 Is the entry {Three=3} removed? true Updated TreeMap: {One=1}
Werte ersetzen
replace(key, value)– aktualisiert Wert für Schlüssel.replace(key, old, new)– aktualisiert nur falls aktueller Wertoldmatcht.replaceAll(function)– wendet Funktion auf jeden Eintrag an.
Beispiel:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); System.out.println("Original TreeMap: " + numbers); numbers.replace("Second", 22); numbers.replace("Third", 3, 33); System.out.println("After replace(): " + numbers); numbers.replaceAll((k, v) -> v + 2); System.out.println("After replaceAll(): " + numbers); } }
Ausgabe
Original TreeMap: {First=1, Second=2, Third=3} After replace(): {First=1, Second=22, Third=33} After replaceAll(): {First=3, Second=24, Third=35}
Navigationsmethoden
Da TreeMap NavigableMap implementiert, bietet es Methoden für effiziente Strukturabfragen.
Erste und letzte Elemente
firstKey()– erster Key in Ordnung.firstEntry()– Eintrag für ersten Key.lastKey()– letzter Key.lastEntry()– Eintrag für letzten Key.
Beispiel:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); System.out.println("TreeMap: " + numbers); System.out.println("First Key: " + numbers.firstKey()); System.out.println("Last Key: " + numbers.lastKey()); System.out.println("First Entry: " + numbers.firstEntry()); System.out.println("Last Entry: " + numbers.lastEntry()); } }
Ausgabe
TreeMap: {First=1, Second=2, Third=3} First Key: First Last Key: Third First Entry: First=1 Last Entry: Third=3
Ceiling, Floor, Higher und Lower
Diese Methoden geben Keys oder Entries relativ zu einem gegebenen Key zurück, was Range-Queries erleichtert.
higherKey(),higherEntry()– nächster höherer Key/Eintrag.lowerKey(),lowerEntry()– vorheriger niedrigerer Key/Eintrag.ceilingKey(),ceilingEntry()– kleinster Key/Eintrag ≥ gegebenem Key.floorKey(),floorEntry()– größter Key/Eintrag ≤ gegebenem Key.
Beispiel:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 5); numbers.put("Third", 4); numbers.put("Fourth", 6); System.out.println("TreeMap: " + numbers); System.out.println("higherKey('Fourth'): " + numbers.higherKey("Fourth")); System.out.println("higherEntry('Fourth'): " + numbers.higherEntry("Fourth")); System.out.println("lowerKey('Fourth'): " + numbers.lowerKey("Fourth")); System.out.println("lowerEntry('Fourth'): " + numbers.lowerEntry("Fourth")); System.out.println("ceilingKey('Fourth'): " + numbers.ceilingKey("Fourth")); System.out.println("ceilingEntry('Fourth'): " + numbers.ceilingEntry("Fourth")); System.out.println("floorKey('Fourth'): " + numbers.floorKey("Fourth")); System.out.println("floorEntry('Fourth'): " + numbers.floorEntry("Fourth")); } }
Ausgabe
TreeMap: {First=1, Fourth=6, Second=5, Third=4} higherKey('Fourth'): Second higherEntry('Fourth'): Second=5 lowerKey('Fourth'): First lowerEntry('Fourth'): First=1 ceilingKey('Fourth'): Fourth ceilingEntry('Fourth'): Fourth=6 floorKey('Fourth'): Fourth floorEntry('Fourth'): Fourth=6
Polling und Ranges
pollFirstEntry() und pollLastEntry() entfernen und geben erste/letzte Einträge zurück.
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); System.out.println("TreeMap: " + numbers); System.out.println("pollFirstEntry(): " + numbers.pollFirstEntry()); System.out.println("pollLastEntry(): " + numbers.pollLastEntry()); System.out.println("Updated TreeMap: " + numbers); } }
Ausgabe
TreeMap: {First=1, Second=2, Third=3} pollFirstEntry(): First=1 pollLastEntry(): Third=3 Updated TreeMap: {Second=2}
headMap, tailMap, subMap
Diese Methoden liefern Views über spezifische Key-Ranges.
headMap(toKey, inclusive)– Keys < toKey (oder ≤ falls inclusive).tailMap(fromKey, inclusive)– Keys ≥ fromKey (oder > falls exklusiv).subMap(fromKey, fromInclusive, toKey, toInclusive)– Keys zwischen den beiden Bounds.
Beispiel:
import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); System.out.println("headMap('Fourth'): " + numbers.headMap("Fourth")); System.out.println("headMap('Fourth', true): " + numbers.headMap("Fourth", true)); System.out.println("tailMap('Second'): " + numbers.tailMap("Second")); System.out.println("tailMap('Second', false): " + numbers.tailMap("Second", false)); System.out.println("subMap('Fourth', true, 'Third', false): " + numbers.subMap("Fourth", true, "Third", false)); } }
Ausgabe
TreeMap: {First=1, Fourth=4, Second=2, Third=3} headMap('Fourth'): {First=1} headMap('Fourth', true): {First=1, Fourth=4} tailMap('Second'): {Second=2, Third=3, Fourth=4} tailMap('Second', false): {Third=3, Fourth=4} subMap('Fourth', true, 'Third', false): {Fourth=4, Second=2}
Zusätzliche Utility-Methoden
| Methode | Beschreibung |
|---|---|
clone() | Erstellt flache Kopie der Map. |
containsKey() | Prüft Anwesenheit eines Schlüssels. |
containsValue() | Prüft auf spezifischen Wert. |
size() | Gibt Anzahl Einträge zurück. |
clear() | Entfernt alle Einträge. |
Benutzerdefinierte Schlüsselordnung mit Comparator
Um Keys anders zu sortieren – etwa umgekehrte Reihenfolge oder case-insensitive Strings – implementieren Sie Comparator und übergeben ihn an den TreeMap-Konstruktor.
import java.util.TreeMap; import java.util.Comparator; class Main { public static void main(String[] args) { TreeMap<String, Integer> numbers = new TreeMap<>(new CustomComparator()); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); } static class CustomComparator implements Comparator<String> { @Override public int compare(String a, String b) { // Umgekehrte natürliche Ordnung return a.compareTo(b) * -1; } } }
Ausgabe
TreeMap: {Third=3, Second=2, Fourth=4, First=1}
Für mehr zu Comparator siehe die offizielle Java-Dokumentation.
Java
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java Kommentare: Typen, Verwendung und Best Practices
- Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
- Java Strings meistern: Erstellung, Methoden und Best Practices
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
- Java Assertions: Praktischer Leitfaden zur Fehlererkennung und Code-Reliabilität
- Java Collections Algorithmen meistern: Sortieren, Mischen und mehr