0Pricing
Java Academy · Pelajaran

Pengurutan Berdasarkan Banyak Kunci dengan thenComparing

Rangkai comparator dengan thenComparing untuk mengurutkan berdasarkan beberapa field sesuai prioritas.

Pengurutan Berdasarkan Banyak Kunci dengan thenComparing adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.

Pengurutan dengan Banyak Kunci

thenComparing() merangkai comparator untuk mengurutkan berdasarkan beberapa bidang. Pengurutan utama dilakukan terlebih dahulu; jika sama, lakukan pengurutan sekunder; dan seterusnya.

thenComparing Dasar

Gunakan thenComparing() untuk menyelesaikan nilai yang sama setelah comparator utama.

import java.util.*;

record Student(String name, int grade, double gpa) {}

List<Student> students = List.of(
    new Student("Alice",   10, 3.9),
    new Student("Bob",     11, 3.7),
    new Student("Charlie", 10, 3.8),
    new Student("Diana",   11, 3.7)
);

Comparator<Student> sort = Comparator.comparingInt(Student::grade)
    .thenComparingDouble(Student::gpa).reversed()
    .thenComparing(Student::name);

students.stream().sorted(sort).forEach(System.out::println);

Pengurutan Tiga Tingkat

Rangkai sebanyak mungkin tingkat thenComparing sesuai kebutuhan.

record Employee(String dept, String team, String name, double salary) {}

List<Employee> employees = List.of(
    new Employee("Eng", "Backend", "Alice",   95000),
    new Employee("Eng", "Backend", "Bob",     92000),
    new Employee("Eng", "Frontend","Charlie", 88000),
    new Employee("Mkt", "Growth",  "Diana",   75000)
);

Comparator<Employee> sort = Comparator
    .comparing(Employee::dept)
    .thenComparing(Employee::team)
    .thenComparing(Comparator.comparingDouble(Employee::salary).reversed());

employees.stream().sorted(sort)
    .forEach(e -> System.out.printf("%s > %s > %s: $%.0f%n",
        e.dept(), e.team(), e.name(), e.salary()));

thenComparing dengan Comparator

Gunakan bentuk metode yang menerima Comparator ketika Anda memerlukan urutan terbalik atau kustom untuk kunci sekunder.

Comparator<Employee> sort = Comparator
    .comparing(Employee::dept)
    .thenComparing(Comparator.comparing(Employee::salary).reversed()); // highest paid first
    // equivalent: .thenComparingDouble(Employee::salary, Comparator.reverseOrder())

Mengurutkan dengan Bidang Null

Gabungkan thenComparing dengan nullsLast/nullsFirst untuk menangani bidang opsional dengan baik.

record Product(String name, String category, Double rating) {}

Comparator<Product> sort = Comparator
    .comparing(Product::category, Comparator.nullsLast(Comparator.naturalOrder()))
    .thenComparing(Product::rating,  Comparator.nullsLast(Comparator.reverseOrder()))
    .thenComparing(Product::name);

Pemilihan Kunci Pengurutan Dinamis

Pilih kunci pengurutan saat runtime berdasarkan preferensi pengguna.

static Comparator<Product> sortBy(String key) {
    return switch (key) {
        case "price"    -> Comparator.comparingDouble(Product::price);
        case "name"     -> Comparator.comparing(Product::name);
        case "stock"    -> Comparator.comparingInt(Product::stock).reversed();
        default         -> Comparator.comparingDouble(Product::price);
    };
}

String userChoice = "stock";
products.stream().sorted(sortBy(userChoice)).forEach(System.out::println);

thenComparing dengan Fungsi Pengekstrak

Bentuk thenComparing(Function<T,U>) mengekstrak kunci Comparable untuk pengurutan sekunder tanpa memerlukan Comparator eksplisit.

record Event(String type, int year, int month, int day) {}

Comparator<Event> chronological = Comparator
    .comparing(Event::type)
    .thenComparingInt(Event::year)
    .thenComparingInt(Event::month)
    .thenComparingInt(Event::day);

Mengurutkan Koleksi Record

Record dengan metode pengakses dapat digunakan dengan lancar bersama referensi metode dalam rangkaian comparator.

record Order(String customerId, String status, double total, java.time.LocalDate date) {}

List<Order> orders = loadOrders();

Comparator<Order> byCustomerThenDate = Comparator
    .comparing(Order::customerId)
    .thenComparing(Order::date, Comparator.reverseOrder()); // newest first per customer

orders.stream().sorted(byCustomerThenDate)
    .collect(Collectors.groupingBy(Order::customerId))
    .forEach((cust, ords) -> {
        System.out.println("Customer: " + cust);
        ords.forEach(o -> System.out.println("  " + o.date() + " $" + o.total()));
    });

Jaminan Pengurutan Stabil

List.sort() dan Arrays.sort() Java untuk objek menggunakan merge sort yang stabil. Elemen yang dianggap sama saat dibandingkan mempertahankan urutan relatif aslinya.

// Stable sort example:
// First sort by name, then by dept
// Equal dept elements preserve the name order from previous sort
List<Employee> sorted = employees.stream()
    .sorted(Comparator.comparing(Employee::name))     // 1st pass
    .sorted(Comparator.comparing(Employee::dept))     // 2nd pass (stable!)
    .collect(Collectors.toList());
// Within each dept, employees remain alphabetically sorted

Comparator.comparing dengan Comparator Kunci

Bentuk dua argumen Comparator.comparing(keyExtractor, keyComparator) memungkinkan Anda menentukan kunci sekaligus urutannya.

// Sort by name length, then alphabetically within same length
Comparator<String> c = Comparator
    .comparing(String::length, Integer::compare)
    .thenComparing(Comparator.naturalOrder());

List<String> words = new ArrayList<>(List.of("fig","apple","kiwi","banana","pea"));
words.sort(c);
System.out.println(words); // [fig, pea, kiwi, apple, banana]

Dunia Nyata: Hasil Pencarian Flight

Mengurutkan hasil pencarian penerbangan berdasarkan harga, kemudian durasi, lalu waktu keberangkatan.

record Flight(String airline, double price, int durationMin, java.time.LocalTime departs) {}

Comparator<Flight> bestFlight = Comparator
    .comparingDouble(Flight::price)
    .thenComparingInt(Flight::durationMin)
    .thenComparing(Flight::departs);

Mengumpulkan Hasil yang Terurut

Gabungkan pengurutan berdasarkan beberapa kunci dengan pengumpul untuk menghasilkan grup atau peta yang terurut.

Map<String, List<Employee>> byDept = employees.stream()
    .sorted(Comparator.comparing(Employee::dept)
        .thenComparing(Comparator.comparingDouble(Employee::salary).reversed()))
    .collect(Collectors.groupingBy(Employee::dept,
        LinkedHashMap::new,  // preserve insertion (sorted) order
        Collectors.toList()));

byDept.forEach((dept, emps) -> {
    System.out.println(dept + ":");
    emps.forEach(e -> System.out.println("  " + e.name() + " $" + e.salary()));
});

Pemeriksaan Singkat

Anda ingin mengurutkan karyawan terlebih dahulu berdasarkan departemen secara alfabetis, kemudian berdasarkan gaji secara menurun. Rangkaian manakah yang benar?

Ringkasan: Pengurutan Berdasarkan Beberapa Kunci dengan thenComparing

Poin-poin utama:

  • thenComparing() menambahkan kunci pengurutan sekunder yang diterapkan ketika kunci primer sama
  • Rangkai sebanyak mungkin tingkat thenComparing sesuai kebutuhan
  • Gunakan thenComparing(pembanding) dengan reversed() ketika kunci sekunder perlu diurutkan secara menurun
  • Gabungkan dengan nullsFirst/nullsLast untuk bidang yang bersifat opsional
  • List.sort() dari Java bersifat stabil — elemen yang sama mempertahankan urutan awalnya
  • Pemilihan pengurutan dinamis: gunakan switch untuk mengembalikan Comparator yang tepat saat runtime

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pengurutan Berdasarkan Banyak Kunci dengan thenComparing” gratis?

Ya — teks lengkap “Pengurutan Berdasarkan Banyak Kunci dengan thenComparing” 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 Berdasarkan Banyak Kunci dengan thenComparing”?

Rangkai comparator dengan thenComparing untuk mengurutkan berdasarkan beberapa field sesuai prioritas. 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 3 dari 4.

Berapa lama pelajaran “Pengurutan Berdasarkan Banyak Kunci dengan thenComparing” 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. Interface Comparable
  2. Pengurutan dengan Comparator dan Lambda
  3. Pengurutan Berdasarkan Banyak Kunci dengan thenComparing
  4. Mempraktikkan Pengurutan Array dan Koleksi
← Kembali ke Java Academy