Aangepaste ordening in Tree-collecties
Geef een Comparator mee aan TreeMap/TreeSet om domeinspecifieke sorteervolgordes te definiëren.
Aangepaste ordening in Tree-collecties is een gratis Java Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
Waarom een aangepaste volgorde?
Tree-verzamelingen (TreeMap, TreeSet) gebruiken standaard de natuurlijke volgorde. Wanneer je domeinobjecten geen natuurlijke volgorde hebben of je anders wilt sorteren, geef je tijdens het maken een Comparator mee.
Comparator bij het maken van TreeMap
Geef een comparator mee om sleutels volgens een aangepaste regel te sorteren — bijvoorbeeld in omgekeerde alfabetische volgorde:
import java.util.*;
TreeMap<String, Integer> map = new TreeMap<>(Comparator.reverseOrder());
map.put("banana", 2);
map.put("apple", 1);
map.put("cherry", 3);
map.forEach((k,v) -> System.out.println(k)); // cherry, banana, appleComparator bij het maken van TreeSet
Geef een comparator mee aan TreeSet om de sorteervolgorde onafhankelijk van de natuurlijke volgorde van het element te bepalen:
TreeSet<String> byLength = new TreeSet<>(
Comparator.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder())
);
byLength.addAll(List.of("fig","apple","kiwi","date","banana"));
for (String s : byLength) System.out.print(s + " ");
// fig date kiwi apple bananaObjecten sorteren op meerdere velden
Combineer comparators om eerst op een primair veld en vervolgens als beslissende tweede sortering op een secundair veld te sorteren:
record Employee(String name, String dept, int salary) {}
TreeSet<Employee> sorted = new TreeSet<>(
Comparator.comparing(Employee::dept)
.thenComparingInt(Employee::salary).reversed()
.thenComparing(Employee::name)
);
sorted.add(new Employee("Alice", "Eng", 90_000));
sorted.add(new Employee("Bob", "Eng", 85_000));
sorted.add(new Employee("Carol", "HR", 70_000));
for (Employee e : sorted) System.out.println(e.dept()+" "+e.name());Consistentie met equals
Kritieke regel: de comparator die door TreeSet/TreeMap wordt gebruikt, bepaalt gelijkheid voor de verzameling. Als comparator.compare(a, b) == 0, worden a en b als dezelfde sleutel beschouwd — zelfs als a.equals(b) false is.
// Comparator ignoring case — "apple" and "APPLE" become the same key!
TreeSet<String> ci = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
ci.add("apple");
ci.add("APPLE"); // not added — same by comparator
System.out.println(ci.size()); // 1Hoofdletterongevoelige TreeMap
Een veelvoorkomende praktische behoefte: een TreeMap waarvan de sleutels hoofdletterongevoelige tekenreeksen zijn (handig voor HTTP-headers en configuratiesleutels):
TreeMap<String, String> headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
headers.put("Content-Type", "application/json");
headers.put("content-type", "text/html"); // overwrites!
System.out.println(headers.get("CONTENT-TYPE")); // text/html
System.out.println(headers.size()); // 1Nullveilige comparator
Tree-verzamelingen met een natuurlijke volgorde veroorzaken een NPE voor null-sleutels. Gebruik een nullveilige comparator om null als kleinste sleutel toe te staan:
TreeMap<String, Integer> map = new TreeMap<>(
Comparator.nullsFirst(Comparator.naturalOrder())
);
map.put(null, 0);
map.put("b", 2);
map.put("a", 1);
map.forEach((k,v) -> System.out.println(k + "=" + v));
// null=0, a=1, b=2Voorbeeld van een domeinobject: product op prijs
Sorteer producten op prijs in een TreeSet, met de naam als beslissende tweede sortering om uniciteit te behouden:
record Product(String name, double price) {}
TreeSet<Product> catalog = new TreeSet<>(
Comparator.comparingDouble(Product::price)
.thenComparing(Product::name)
);
catalog.add(new Product("Widget", 9.99));
catalog.add(new Product("Gadget", 24.99));
catalog.add(new Product("Donut", 9.99));
catalog.forEach(p -> System.out.println(p.name() + " $" + p.price()));
// Donut $9.99, Widget $9.99, Gadget $24.99De comparator ophalen
Roep comparator() aan op een TreeMap/TreeSet om de aangepaste comparator op te halen. De methode retourneert null als de natuurlijke volgorde wordt gebruikt.
TreeMap<String, Integer> map = new TreeMap<>(Comparator.reverseOrder());
System.out.println(map.comparator() != null); // true
TreeMap<String, Integer> natural = new TreeMap<>();
System.out.println(natural.comparator()); // nullCompositie van comparators
De Comparator van Java biedt koppelbare fabrieksmethoden voor een overzichtelijke compositie:
Comparator<String> comp =
Comparator.comparingInt(String::length) // by length
.thenComparing(Comparator.naturalOrder()); // then alphabetically
TreeSet<String> ts = new TreeSet<>(comp);
ts.addAll(List.of("go", "java", "c", "rust", "py"));
ts.forEach(s -> System.out.print(s + " "));
// c go py java rustWanneer je GEEN aangepaste comparator moet gebruiken
Gebruik voor sleutels van TreeMap of elementen van TreeSet geen comparator die niet consistent is met equals — dit veroorzaakt verwarrende "ontbrekende" vermeldingen. Zorg voor correct gedrag in alle contexten van verzamelingen dat compare(a, b) == 0 precies dan geldt wanneer a.equals(b) true is.
Korte controle
Een TreeSet gebruikt alleen een comparator op basis van String::length. Wat gebeurt er wanneer je zowel "cat" als "dog" toevoegt?
Samenvatting: aangepaste sortering
Belangrijkste punten:
- Geef een Comparator door aan de constructor van TreeMap/TreeSet om een aangepaste sortering te definiëren
- Gelijkheid volgens Comparator bepaalt de uniciteit in boomcollecties
- Zorg dat de comparator consistent is met equals om verrassingen te voorkomen
- Gebruik Comparator.nullsFirst/nullsLast voor een null-veilige sortering
- Koppel vergelijkingen met thenComparing voor sortering op meerdere velden
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “Aangepaste ordening in Tree-collecties” gratis?
Ja — de volledige tekst van “Aangepaste ordening in Tree-collecties” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “Aangepaste ordening in Tree-collecties”?
Geef een Comparator mee aan TreeMap/TreeSet om domeinspecifieke sorteervolgordes te definiëren. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Aangepaste ordening in Tree-collecties”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- TreeMap: gesorteerde sleutel-waardeparen
- Submaps en bereikweergaven
- TreeSet en NavigableSet
- Aangepaste ordening in Tree-collecties