Sottomappe e viste di intervallo
Estragga viste subMap, headMap e tailMap per eseguire ricerche per intervallo nelle mappe ordinate.
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)); // trueheadMap: 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.99subMap 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=v40Interfaccia 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 exceptionVerifica 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)
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
- TreeMap: coppie chiave-valore ordinate
- Sottomappe e viste di intervallo
- TreeSet e NavigableSet
- Ordinamento personalizzato nelle collezioni ad albero