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, appleComparator 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 bananaMengurutkan 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()); // 1TreeMap 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()); // 1Comparator 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=2Contoh 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.99Mengambil 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()); // nullKomposisi 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 rustKapan 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
- TreeMap: Pasangan Kunci-Nilai Terurut
- Submap dan Tampilan Rentang
- TreeSet dan NavigableSet
- Pengurutan Kustom pada Koleksi Tree