0Pricing
Java Academy · Pelajaran

Pengurutan Kustom pada Koleksi Tree

Berikan Comparator ke TreeMap atau TreeSet untuk menentukan urutan pengurutan khusus domain.

Pengurutan Kustom pada Koleksi Tree adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Mengapa Menggunakan Pengurutan Khusus?

Koleksi berbasis pohon (TreeMap, TreeSet) secara bawaan menggunakan urutan alami. Jika objek domain Anda tidak memiliki urutan alami, atau Anda memerlukan pengurutan yang berbeda, berikan sebuah Comparator saat konstruksi.

Comparator saat Konstruksi TreeMap

Berikan comparator untuk mengurutkan kunci berdasarkan aturan khusus—misalnya, urutan alfabet terbalik:

import java.util.*;

TreeMap<String, Integer> map = new TreeMap<>(Comparator.reverseOrder());
map.put("banana", 2);
map.put("apple", 1);
map.put("cherry", 3);

map.forEach((k,v) -> System.out.println(k)); // cherry, banana, apple

Comparator saat Konstruksi TreeSet

Berikan comparator ke TreeSet untuk mengendalikan urutan pengurutan secara independen dari urutan alami elemen:

TreeSet<String> byLength = new TreeSet<>(
    Comparator.comparingInt(String::length)
              .thenComparing(Comparator.naturalOrder())
);
byLength.addAll(List.of("fig","apple","kiwi","date","banana"));

for (String s : byLength) System.out.print(s + " ");
// fig date kiwi apple banana

Mengurutkan Objek berdasarkan Beberapa Bidang

Rangkaikan comparator untuk mengurutkan berdasarkan bidang utama, lalu bidang sekunder sebagai penentu jika terjadi nilai yang sama:

record Employee(String name, String dept, int salary) {}

TreeSet<Employee> sorted = new TreeSet<>(
    Comparator.comparing(Employee::dept)
              .thenComparingInt(Employee::salary).reversed()
              .thenComparing(Employee::name)
);
sorted.add(new Employee("Alice", "Eng", 90_000));
sorted.add(new Employee("Bob",   "Eng", 85_000));
sorted.add(new Employee("Carol", "HR",  70_000));

for (Employee e : sorted) System.out.println(e.dept()+" "+e.name());

Konsistensi dengan equals

Aturan penting: comparator yang digunakan oleh TreeSet/TreeMap menentukan kesetaraan untuk koleksi tersebut. Jika comparator.compare(a, b) == 0, a dan b dianggap sebagai kunci yang sama—meskipun a.equals(b) bernilai false.

// Comparator ignoring case — "apple" and "APPLE" become the same key!
TreeSet<String> ci = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
ci.add("apple");
ci.add("APPLE"); // not added — same by comparator
System.out.println(ci.size()); // 1

TreeMap Tanpa Membedakan Huruf Besar-Kecil

Kebutuhan praktis yang umum: TreeMap dengan kunci berupa string yang tidak membedakan huruf besar dan kecil (berguna untuk header HTTP dan kunci konfigurasi):

TreeMap<String, String> headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
headers.put("Content-Type", "application/json");
headers.put("content-type", "text/html"); // overwrites!

System.out.println(headers.get("CONTENT-TYPE")); // text/html
System.out.println(headers.size()); // 1

Comparator Aman terhadap Null

Koleksi berbasis pohon dengan urutan alami menimbulkan NPE untuk kunci null. Gunakan comparator yang aman terhadap null agar null dapat digunakan sebagai kunci minimum:

TreeMap<String, Integer> map = new TreeMap<>(
    Comparator.nullsFirst(Comparator.naturalOrder())
);
map.put(null, 0);
map.put("b", 2);
map.put("a", 1);

map.forEach((k,v) -> System.out.println(k + "=" + v));
// null=0, a=1, b=2

Contoh Objek Domain: Product berdasarkan Harga

Urutkan produk berdasarkan harga dalam TreeSet, dengan nama sebagai penentu jika harga sama agar keunikan tetap terjaga:

record Product(String name, double price) {}

TreeSet<Product> catalog = new TreeSet<>(
    Comparator.comparingDouble(Product::price)
              .thenComparing(Product::name)
);
catalog.add(new Product("Widget", 9.99));
catalog.add(new Product("Gadget", 24.99));
catalog.add(new Product("Donut",  9.99));

catalog.forEach(p -> System.out.println(p.name() + " $" + p.price()));
// Donut $9.99, Widget $9.99, Gadget $24.99

Mengambil Comparator

Panggil comparator() pada TreeMap/TreeSet untuk mengambil comparator khusus. Nilai null dikembalikan jika urutan alami digunakan.

TreeMap<String, Integer> map = new TreeMap<>(Comparator.reverseOrder());
System.out.println(map.comparator() != null); // true

TreeMap<String, Integer> natural = new TreeMap<>();
System.out.println(natural.comparator());      // null

Komposisi Comparator

Comparator milik Java menyediakan metode pabrik yang dapat dirangkaikan untuk komposisi yang rapi:

Comparator<String> comp =
    Comparator.comparingInt(String::length)   // by length
              .thenComparing(Comparator.naturalOrder()); // then alphabetically

TreeSet<String> ts = new TreeSet<>(comp);
ts.addAll(List.of("go", "java", "c", "rust", "py"));
ts.forEach(s -> System.out.print(s + " "));
// c go py java rust

Kapan TIDAK Menggunakan Comparator Khusus

Hindari penggunaan comparator yang tidak konsisten dengan equals pada kunci TreeMap/elemen TreeSet—hal ini menyebabkan entry yang "hilang" dan membingungkan. Pastikan compare(a, b) == 0 berlaku jika dan hanya jika a.equals(b) berlaku, agar perilaku benar dalam semua konteks koleksi.

Pemeriksaan Singkat

Sebuah TreeSet menggunakan comparator yang hanya didasarkan pada String::length. Apa yang terjadi ketika Anda menambahkan "cat" dan "dog" sekaligus?

Ringkasan: Pengurutan Khusus

Poin-poin penting:

  • Berikan Comparator ke konstruktor TreeMap/TreeSet untuk menentukan pengurutan khusus
  • Kesetaraan yang ditentukan Comparator mengatur keunikan dalam koleksi pohon
  • Pastikan Comparator konsisten dengan equals untuk menghindari hasil yang tidak terduga
  • Gunakan Comparator.nullsFirst/nullsLast untuk pengurutan yang aman terhadap null
  • Rangkai dengan thenComparing untuk pengurutan berdasarkan beberapa bidang

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pengurutan Kustom pada Koleksi Tree” gratis?

Ya — teks lengkap “Pengurutan Kustom pada Koleksi Tree” 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 “Pengurutan Kustom pada Koleksi Tree”?

Berikan Comparator ke TreeMap atau TreeSet untuk menentukan urutan pengurutan khusus domain. 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 4 dari 4.

Berapa lama pelajaran “Pengurutan Kustom pada Koleksi Tree” 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