Java Academy · Lektion

Delkort og intervalvisninger

Udtræk visninger med subMap, headMap og tailMap til intervalbaserede opslag i sorterede maps.

Lektion 2 af 413 trin

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)); // true

headMap: 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.99

descending 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=v40

NavigableMap-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 exception

Hurtigt 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)
Gratis at komme i gang

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

  1. TreeMap: sorterede nøgle-værdi-par
  2. Delkort og intervalvisninger
  3. TreeSet og NavigableSet
  4. Brugerdefineret sortering i Tree-samlinger
← Tilbage til Java Academy