Java Academy · Pelajaran

Subpeta dan Paparan Julat

Ekstrak paparan subMap, headMap dan tailMap untuk carian berasaskan julat dalam peta tersusun.

Pelajaran 2 daripada 413 langkah

Subpeta dan Paparan Julat ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Paparan Julat dalam TreeMap

subMap, headMap dan tailMap TreeMap mengembalikan paparan yang disokong — perubahan pada peta asas dan sebaliknya akan dicerminkan pada paparan tersebut. Perubahan melalui paparan akan dicerminkan pada peta asal.

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: Kunci di Bawah Sempadan

headMap(toKey) mengembalikan semua entry dengan kunci yang lebih kecil daripada toKey secara ketat. Gunakan varian inklusif headMap(toKey, true) untuk memasukkan sempadan tersebut.

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: Kunci Bermula dari Sempadan

tailMap(fromKey) mengembalikan semua entry dengan kunci ≥ 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 dengan Sempadan Inklusif

subMap(from, fromInclusive, to, toInclusive) dengan 4 argumen memberikan kawalan penuh terhadap keterangkuman sempadan:

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}

Mengubah Suai melalui Paparan

Operasi put/remove pada paparan subMap dicerminkan pada peta asal (dan sebaliknya). Percubaan untuk menyisipkan kunci di luar julat paparan akan mencetuskan pengecualian.

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

Kes Penggunaan: Pertanyaan Julat Rekod

Dapatkan semua entri rekod antara dua cap masa menggunakan paparan julat 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));

Kes Penggunaan: Carian Julat Harga

Cari semua produk dalam julat harga menggunakan kunci TreeMap sebagai harga:

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 Menurun

Rantaikan descendingMap() pada paparan untuk navigasi dalam susunan terbalik:

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

Antara Muka NavigableMap

NavigableMap melanjutkan SortedMap dan menambahkan navigasi kunci ceiling/floor/higher/lower serta paparan menurun. TreeMap ialah pelaksanaan yang paling biasa; ConcurrentSkipListMap ialah alternatif yang selamat untuk utas.

Prestasi Paparan

Operasi paparan subpeta (get, put, containsKey) mempunyai kerumitan O(log n) yang sama seperti TreeMap asas. Penciptaan paparan itu sendiri ialah O(1) — tiada penyalinan berlaku. Imbasan julat terhadap n kunci dalam paparan ialah O(log N + n), dengan N sebagai saiz keseluruhan peta.

Perangkap: Paparan Lapuk

Oleh sebab paparan disokong oleh peta asal, paparan boleh menjadi kosong atau mencetuskan pengecualian jika peta asal dikosongkan. Sentiasa dokumentasikan bahawa paparan adalah dinamik dan jangan simpannya melebihi kitar hayat yang dimaksudkan.

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

Semakan Pantas

Anda memanggil map.subMap(30, false, 70, true) pada TreeMap dengan kunci {10,20,30,40,50,60,70,80}. Kunci yang manakah disertakan dalam hasilnya?

Imbas Kembali: Subpeta dan Paparan Julat

Perkara penting:

  • subMap, headMap dan tailMap mengembalikan paparan langsung yang disokong — tiada penyalinan
  • Perubahan pada paparan dicerminkan pada peta asal dan sebaliknya
  • subMap(from, fromInclusive, to, toInclusive) dengan 4 argumen untuk kawalan penuh terhadap sempadan
  • put di luar julat melalui paparan mencetuskan IllegalArgumentException
  • Kerumitan imbasan julat: O(log N + n)
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Subpeta dan Paparan Julat” percuma?

Ya — teks penuh “Subpeta dan Paparan Julat” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Subpeta dan Paparan Julat”?

Ekstrak paparan subMap, headMap dan tailMap untuk carian berasaskan julat dalam peta tersusun. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Subpeta dan Paparan Julat” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. TreeMap: Pasangan Kunci-Nilai Tersusun
  2. Subpeta dan Paparan Julat
  3. TreeSet dan NavigableSet
  4. Susunan Tersuai dalam Koleksi Tree
← Kembali ke Java Academy