Java Academy · Lezione

Sottomappe e viste di intervallo

Estragga viste subMap, headMap e tailMap per eseguire ricerche per intervallo nelle mappe ordinate.

Lezione 2 di 413 passaggi

Sottomappe e viste di intervallo è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Viste di intervalli in TreeMap

subMap, headMap e tailMap di TreeMap restituiscono viste collegate: riflettono le modifiche apportate alla mappa sottostante e viceversa. Le modifiche apportate tramite la vista si riflettono nella mappa originale.

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: chiavi al di sotto di un limite

headMap(toKey) restituisce tutte le entry con chiavi strettamente minori di toKey. Utilizzi la variante inclusiva headMap(toKey, true) per includere il limite.

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: chiavi a partire da un limite

tailMap(fromKey) restituisce tutte le entry con chiavi ≥ 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 con limiti inclusivi

La variante a 4 argomenti subMap(from, fromInclusive, to, toInclusive) consente di controllare completamente l'inclusività dei limiti:

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}

Modifica tramite una vista

Le operazioni put/remove su una vista subMap si riflettono nella mappa originale e viceversa. Se si tenta di inserire una chiave al di fuori dell'intervallo della vista, viene generata un'eccezione.

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");

Caso d'uso: query su un intervallo di log

Recuperi tutte le entry di log comprese tra due timestamp utilizzando una vista di intervallo di TreeMap:

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

Caso d'uso: ricerca in un intervallo di prezzi

Trovi tutti i prodotti in un intervallo di prezzi utilizzando i prezzi come chiavi di TreeMap:

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

subMap discendente

Concateni descendingMap() a una vista per navigare in ordine inverso:

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

Interfaccia NavigableMap

NavigableMap estende SortedMap e aggiunge la navigazione tramite le chiavi ceiling/floor/higher/lower, oltre alle viste discendenti. TreeMap è l'implementazione più comune; ConcurrentSkipListMap è l'alternativa thread-safe.

Prestazioni delle viste

Le operazioni sulle viste di submap (get, put, containsKey) hanno la stessa complessità O(log n) della TreeMap sottostante. La creazione della vista è O(1): non viene effettuata alcuna copia. Le scansioni dell'intervallo su n chiavi nella vista hanno complessità O(log N + n), dove N è la dimensione della mappa completa.

Problema: viste obsolete

Poiché le viste sono collegate alla mappa originale, una vista può diventare vuota o generare un'eccezione se la mappa originale viene svuotata. Documenti sempre che le viste sono dinamiche e non le conservi oltre il ciclo di vita previsto.

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

Verifica rapida

Si chiama map.subMap(30, false, 70, true) su una TreeMap con le chiavi {10,20,30,40,50,60,70,80}. Quali chiavi sono incluse nel risultato?

Riepilogo: submap e viste di intervalli

Punti chiave:

  • subMap, headMap e tailMap restituiscono viste dinamiche collegate, senza effettuare copie
  • Le modifiche nella vista si riflettono nella mappa originale e viceversa
  • Utilizzi subMap(from, fromInclusive, to, toInclusive) a 4 argomenti per controllare completamente i limiti
  • Le operazioni put al di fuori dell'intervallo tramite una vista generano IllegalArgumentException
  • Complessità della scansione di un intervallo: O(log N + n)
Gratis per iniziare

Impara Java con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
104
Lezioni
374

Domande Frequenti

La lezione «Sottomappe e viste di intervallo» è gratuita?

Sì — il testo completo di «Sottomappe e viste di intervallo» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «Sottomappe e viste di intervallo»?

Estragga viste subMap, headMap e tailMap per eseguire ricerche per intervallo nelle mappe ordinate. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Sottomappe e viste di intervallo»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. TreeMap: coppie chiave-valore ordinate
  2. Sottomappe e viste di intervallo
  3. TreeSet e NavigableSet
  4. Ordinamento personalizzato nelle collezioni ad albero
← Torna a Java Academy