Java TreeMap: Gesorteerde maps beheersen met praktische voorbeelden
Java TreeMap
Verken de Java TreeMap-klasse – een krachtige, natuurlijk-gesorteerde map-implementatie – met duidelijke voorbeelden, sleuteloperaties en geavanceerde navigatietechnieken.
De TreeMap-klasse is onderdeel van het Java Collections Framework en biedt een red-black tree-implementatie die entries gesorteerd houdt volgens de natuurlijke ordening van de keys of een custom Comparator. Het implementeert de NavigableMap-interface, die handige methoden toevoegt voor het doorlopen en bevragen van de map.
Een TreeMap aanmaken
Voordat je een TreeMap kunt gebruiken, importeer het pakket:
import java.util.TreeMap;
Maak dan een instantie aan:
TreeMap<Key, Value> numbers = new TreeMap<>();
Standaard worden keys gesorteerd in natuurlijke oplopende volgorde. Als je een custom volgorde nodig hebt, geef een Comparator door aan de constructor.
- Key – unieke identifier voor elke entry.
- Value – data geassocieerd met de key.
TreeMap-methoden overzicht
De klasse biedt een rijke set operaties. Hieronder de belangrijkste categorieën met code-snippets.
Elementen invoegen
put()– voegt of vervangt een key/value-paar.putAll()– voegt een andere map samen in deze.putIfAbsent()– voegt alleen toe als key ontbreekt.
Voorbeeld:
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 van even numbers: " + evenNumbers); TreeMap<String, Integer> numbers = new TreeMap<>(); numbers.put("One", 1); numbers.putAll(evenNumbers); System.out.println("TreeMap van numbers: " + numbers); } }
Output
TreeMap van even numbers: {Four=4, Six=6, Two=2} TreeMap van numbers: {Four=4, One=1, Six=6, Two=2}
Elementen benaderen
Met Collection Views
entrySet()– retourneert alle key/value-paren.keySet()– retourneert alle keys.values()– retourneert alle values.
Voorbeeld:
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()); } }
Output
TreeMap: {One=1, Three=3, Two=2} Key/Value mappings: [One=1, Three=3, Two=2] Keys: [One, Three, Two] Values: [1, 3, 2]
Waarden ophalen
get()– retourneert de waarde voor een key ofnullals afwezig.getOrDefault()– retourneert een default als key ontbreekt.
Voorbeeld:
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("Met get(): " + value1); int value2 = numbers.getOrDefault("Five", 5); System.out.println("Met getOrDefault(): " + value2); } }
Output
TreeMap: {One=1, Three=3, Two=2} Met get(): 3 Met getOrDefault(): 5
Entries verwijderen
remove(key)– verwijdert de entry en retourneert de waarde.remove(key, value)– verwijdert alleen als key mapt naar de gespecificeerde waarde.
Voorbeeld:
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("Verwijderde waarde: " + removed); boolean removedPair = numbers.remove("Three", 3); System.out.println("Is de entry {Three=3} verwijderd? " + removedPair); System.out.println("Bijgewerkte TreeMap: " + numbers); } }
Output
TreeMap: {One=1, Three=3, Two=2} Verwijderde waarde: 2 Is de entry {Three=3} verwijderd? true Bijgewerkte TreeMap: {One=1}
Waarden vervangen
replace(key, value)– werkt de waarde voor een key bij.replace(key, old, new)– werkt alleen bij als de huidige waarde matcht metold.replaceAll(function)– past een functie toe op elke entry.
Voorbeeld:
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("Originele TreeMap: " + numbers); numbers.replace("Second", 22); numbers.replace("Third", 3, 33); System.out.println("Na replace(): " + numbers); numbers.replaceAll((k, v) -> v + 2); System.out.println("Na replaceAll(): " + numbers); } }
Output
Originele TreeMap: {First=1, Second=2, Third=3} Na replace(): {First=1, Second=22, Third=33} Na replaceAll(): {First=3, Second=24, Third=35}
Navigatiemethoden
Omdat TreeMap NavigableMap implementeert, biedt het methoden om de structuur efficiënt te bevragen.
Eerste en laatste elementen
firstKey()– eerste key in volgorde.firstEntry()– entry voor de eerste key.lastKey()– laatste key.lastEntry()– entry voor de laatste key.
Voorbeeld:
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("Eerste Key: " + numbers.firstKey()); System.out.println("Laatste Key: " + numbers.lastKey()); System.out.println("Eerste Entry: " + numbers.firstEntry()); System.out.println("Laatste Entry: " + numbers.lastEntry()); } }
Output
TreeMap: {First=1, Second=2, Third=3} Eerste Key: First Laatste Key: Third Eerste Entry: First=1 Laatste Entry: Third=3
Ceiling, Floor, Higher en Lower
Deze methoden retourneren keys of entries relatief aan een gegeven key, wat range-queries faciliteert.
higherKey(),higherEntry()– volgende hogere key/entry.lowerKey(),lowerEntry()– vorige lagere key/entry.ceilingKey(),ceilingEntry()– kleinste key/entry ≥ gegeven key.floorKey(),floorEntry()– grootste key/entry ≤ gegeven key.
Voorbeeld:
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")); } }
Output
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 en Ranges
pollFirstEntry() en pollLastEntry() verwijderen en retourneren de eerste/laatste entries respectievelijk.
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("Bijgewerkte TreeMap: " + numbers); } }
Output
TreeMap: {First=1, Second=2, Third=3} pollFirstEntry(): First=1 pollLastEntry(): Third=3 Bijgewerkte TreeMap: {Second=2}
headMap, tailMap, subMap
Deze methoden bieden views over specifieke key-ranges.
headMap(toKey, inclusive)– keys < toKey (of ≤ als inclusive).tailMap(fromKey, inclusive)– keys ≥ fromKey (of > als exclusief).subMap(fromKey, fromInclusive, toKey, toInclusive)– keys tussen de twee grenzen.
Voorbeeld:
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)); } }
Output
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}
Aanvullende utility-methoden
| Methode | Beschrijving |
|---|---|
clone() | Maakt een shallow copy van de map. |
containsKey() | Controleert aanwezigheid van een key. |
containsValue() | Controleert op specifieke waarde. |
size() | Retourneert het aantal entries. |
clear() | Verwijdert alle entries. |
Custom key-ordening met Comparator
Om keys anders te sorteren – zoals omgekeerde volgorde of case-insensitive strings – implementeer Comparator en geef het door aan de TreeMap-constructor.
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) { // Omgekeerde natuurlijke volgorde return a.compareTo(b) * -1; } } }
Output
TreeMap: {Third=3, Second=2, Fourth=4, First=1}
Voor meer over Comparator, zie de officiële Java-documentatie.
Java
- Java-operators beheersen: typen, syntax en praktische voorbeelden
- Java-commentaar: typen, gebruik en best practices
- Java Enhanced For-lus beheersen: syntax, voorbeelden en best practices
- Java Strings beheersen: aanmaken, methodes en best practices
- Java interfaces meesteren: concepten, implementatie en best practices
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java Try-with-resources meesteren: automatische resource management uitgelegd
- Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
- Java Assertions: een praktische gids voor bugdetectie en codebetrouwbaarheid
- Java Collection-algoritmes: Sorteren, shuffelen en meer
- Willekeurige Getallen Genereren in Java: Praktische Gids met Random en Math.random