Delkort og intervalvisninger
Udtræk visninger med subMap, headMap og tailMap til intervalbaserede opslag i sorterede maps.
Delkort og intervalvisninger er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Intervalvisninger i TreeMap
TreeMaps subMap, headMap og tailMap returnerer visninger, der er knyttet til det oprindelige map — de afspejler ændringer i det underliggende map og omvendt. Ændringer via visningen afspejles i det oprindelige map.
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 10; i++) map.put(i * 10, "item" + i);
var view = map.subMap(30, 70); // [30, 70)
System.out.println(view); // {30=item3, 40=item4, 50=item5, 60=item6}
map.put(45, "new"); // also visible through view!
System.out.println(view.containsKey(45)); // trueheadMap: nøgler under en grænse
headMap(toKey) returnerer alle poster med nøgler, der er strengt mindre end toKey. Brug den inklusive variant headMap(toKey, true) for at medtage grænsen.
TreeMap<String, Integer> words = new TreeMap<>();
"banana cherry apple date elderberry".chars()
.mapToObj(c -> String.valueOf((char)c)).distinct()
.forEach(w -> words.put(w, w.length()));
// Actually let's use real words:
TreeMap<String, Integer> wc = new TreeMap<>();
wc.put("apple",5); wc.put("banana",6); wc.put("cherry",6); wc.put("date",4);
System.out.println(wc.headMap("cherry")); // {apple=5, banana=6}tailMap: nøgler fra en grænse
tailMap(fromKey) returnerer alle poster med nøgler ≥ fromKey.
TreeMap<Integer, String> grades = new TreeMap<>();
grades.put(50,"F"); grades.put(60,"D"); grades.put(70,"C"); grades.put(80,"B"); grades.put(90,"A");
// All passing grades (>= 60)
var passing = grades.tailMap(60);
System.out.println(passing); // {60=D, 70=C, 80=B, 90=A}subMap med inklusive grænser
Den 4-argumenters subMap(from, fromInclusive, to, toInclusive) giver fuld kontrol over, om grænserne er inklusive:
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 10; i <= 100; i += 10) map.put(i, "v"+i);
// [30, 60] — both inclusive
System.out.println(map.subMap(30, true, 60, true));
// {30=v30, 40=v40, 50=v50, 60=v60}
// (30, 60) — both exclusive
System.out.println(map.subMap(30, false, 60, false));
// {40=v40, 50=v50}Ændringer via en visning
Put- og remove-operationer på en subMap-visning afspejles i det oprindelige map og omvendt. Hvis du forsøger at indsætte en nøgle uden for visningens interval, kastes en undtagelse.
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 5; i++) map.put(i * 10, "v" + i);
var view = map.subMap(20, 40); // [20, 40)
view.remove(20); // removes from both view and original map
System.out.println(map.containsKey(20)); // false
// This would throw IllegalArgumentException:
// view.put(50, "out of range");Anvendelse: Intervalforespørgsel i log
Hent alle logposter mellem to tidsstempler ved hjælp af en TreeMap-intervalvisning:
import java.time.*;
TreeMap<LocalDateTime, String> logs = new TreeMap<>();
logs.put(LocalDateTime.of(2024,1,1,8,0), "Server start");
logs.put(LocalDateTime.of(2024,1,1,10,0), "Request spike");
logs.put(LocalDateTime.of(2024,1,1,14,0), "Maintenance");
logs.put(LocalDateTime.of(2024,1,1,18,0), "Server stop");
var morning = logs.subMap(
LocalDateTime.of(2024,1,1,8,0), true,
LocalDateTime.of(2024,1,1,12,0), false
);
morning.forEach((t,m) -> System.out.println(t+" : "+m));Anvendelse: Opslag i prisinterval
Find alle produkter i et prisinterval ved at bruge TreeMap-nøgler som priser:
TreeMap<Double, String> products = new TreeMap<>();
products.put(9.99, "Pen");
products.put(24.99, "Book");
products.put(49.99, "Headphones");
products.put(299.99, "Tablet");
double min = 10.0, max = 100.0;
var affordable = products.subMap(min, true, max, true);
affordable.forEach((p,n) -> System.out.println(n+" $"+p));
// Book $24.99, Headphones $49.99descending SubMap
Kæd descendingMap() sammen med en visning for at navigere i omvendt rækkefølge:
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 10; i <= 100; i += 10) map.put(i, "v"+i);
// Get [40, 80] in descending order
map.subMap(40, true, 80, true)
.descendingMap()
.forEach((k,v) -> System.out.println(k + "=" + v));
// 80=v80, 70=v70, 60=v60, 50=v50, 40=v40NavigableMap-interface
NavigableMap udvider SortedMap og tilføjer navigation efter ceiling-, floor-, higher- og lower-nøgler samt visninger i faldende rækkefølge. TreeMap er den mest almindelige implementering; ConcurrentSkipListMap er det trådsikre alternativ.
Visningers ydeevne
Operationer på en submap-visning, såsom get, put og containsKey, har samme kompleksitet, O(log n), som det underliggende TreeMap. Det tager O(1) at oprette selve visningen — der sker ingen kopiering. Intervalgennemløb af n nøgler i visningen har kompleksiteten O(log N + n), hvor N er størrelsen på hele mappet.
Faldgrube: Forældede visninger
Fordi visningerne er knyttet til det oprindelige map, kan en visning blive tom eller udløse en undtagelse, hvis det oprindelige map tømmes. Dokumentér altid, at visningerne er aktive, og opbevar dem ikke længere end deres tilsigtede levetid.
TreeMap<Integer, String> map = new TreeMap<>();
map.put(10, "a"); map.put(20, "b"); map.put(30, "c");
var view = map.subMap(10, 30);
map.clear(); // view becomes empty
System.out.println(view.size()); // 0 — but no exceptionHurtigt tjek
Du kalder map.subMap(30, false, 70, true) på en TreeMap med nøglerne {10,20,30,40,50,60,70,80}. Hvilke nøgler er med i resultatet?
Opsamling: Submaps og intervalvisninger
Vigtigste pointer:
- subMap, headMap og tailMap returnerer aktive visninger, der er knyttet til det oprindelige map — der sker ingen kopiering
- Ændringer i visningen afspejles i det oprindelige map og omvendt
- 4-argumenters subMap(from, fromInclusive, to, toInclusive) giver fuld kontrol over grænserne
- Put-operationer uden for intervallet via en visning kaster IllegalArgumentException
- Kompleksiteten af et intervalgennemløb er O(log N + n)
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Delkort og intervalvisninger” gratis?
Ja — hele teksten til “Delkort og intervalvisninger” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Delkort og intervalvisninger”?
Udtræk visninger med subMap, headMap og tailMap til intervalbaserede opslag i sorterede maps. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Delkort og intervalvisninger”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- TreeMap: sorterede nøgle-værdi-par
- Delkort og intervalvisninger
- TreeSet og NavigableSet
- Brugerdefineret sortering i Tree-samlinger