0Pricing
Java Academy · Pelajaran

Submap dan Tampilan Rentang

Ekstrak tampilan subMap, headMap, dan tailMap untuk pencarian berbasis rentang pada map terurut.

Submap dan Tampilan Rentang adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Tampilan Rentang dalam TreeMap

subMap, headMap, dan tailMap milik TreeMap mengembalikan tampilan yang didukung—tampilan tersebut mencerminkan perubahan pada map yang mendasarinya, begitu pula sebaliknya. Perubahan melalui tampilan akan tercermin pada map asli.

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 Batas

headMap(toKey) mengembalikan semua entry dengan kunci yang lebih kecil secara ketat daripada toKey. Gunakan varian inklusif headMap(toKey, true) untuk menyertakan batas 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 Mulai dari Batas

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 Batas Inklusif

subMap(from, fromInclusive, to, toInclusive) dengan 4 argumen memberikan kendali penuh atas inklusivitas batas:

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}

Memodifikasi melalui Tampilan

Operasi put/remove pada tampilan subMap tercermin pada map asli (dan sebaliknya). Percobaan menyisipkan kunci di luar rentang tampilan akan menimbulkan 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");

Kasus Penggunaan: Kueri Rentang Log

Ambil semua entry log di antara dua stempel waktu menggunakan tampilan rentang 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));

Kasus Penggunaan: Pencarian Rentang Harga

Temukan semua produk dalam rentang harga dengan 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

Rangkaikan descendingMap() pada tampilan untuk navigasi dalam urutan 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

Antarmuka NavigableMap

NavigableMap memperluas SortedMap dan menambahkan navigasi kunci ceiling/floor/higher/lower serta tampilan menurun. TreeMap adalah implementasi yang paling umum; ConcurrentSkipListMap adalah alternatif yang aman untuk thread.

Kinerja Tampilan

Operasi pada tampilan submap (get, put, containsKey) memiliki kompleksitas O(log n), sama seperti TreeMap yang mendasarinya. Membuat tampilan itu sendiri memiliki kompleksitas O(1)—tidak ada penyalinan. Pemindaian rentang atas n kunci dalam tampilan memiliki kompleksitas O(log N + n), dengan N sebagai ukuran penuh map.

Kesalahan Umum: Tampilan Kedaluwarsa

Karena tampilan didukung oleh map asli, tampilan dapat menjadi kosong atau menimbulkan pengecualian jika map asli dihapus menggunakan clear. Selalu dokumentasikan bahwa tampilan bersifat langsung dan jangan menyimpannya melampaui masa penggunaan 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

Pemeriksaan Singkat

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

Ringkasan: Submap dan Tampilan Rentang

Inti penting:

  • subMap, headMap, tailMap mengembalikan tampilan langsung yang didukung—tanpa penyalinan
  • Perubahan pada tampilan tercermin pada map asli dan sebaliknya
  • subMap 4 argumen (from, fromInclusive, to, toInclusive) untuk kendali penuh atas batas
  • Put di luar rentang melalui tampilan menimbulkan IllegalArgumentException
  • Kompleksitas pemindaian rentang: O(log N + n)

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Submap dan Tampilan Rentang” gratis?

Ya — teks lengkap “Submap dan Tampilan Rentang” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Submap dan Tampilan Rentang”?

Ekstrak tampilan subMap, headMap, dan tailMap untuk pencarian berbasis rentang pada map terurut. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Submap dan Tampilan Rentang” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. TreeMap: Pasangan Kunci-Nilai Terurut
  2. Submap dan Tampilan Rentang
  3. TreeSet dan NavigableSet
  4. Pengurutan Kustom pada Koleksi Tree
← Kembali ke Java Academy