Menu
CoddyTech

Antarmuka Comparator

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 45 dari 87.

Meskipun Comparable menentukan urutan alami sebuah class, terkadang kamu perlu mengurutkan object dengan cara yang berbeda. Interface Comparator memungkinkanmu membuat logika perbandingan terpisah tanpa memodifikasi class asli.

Comparator adalah object eksternal yang membandingkan dua object dengan tipe yang sama. Ini berguna saat kamu menginginkan beberapa opsi pengurutan atau tidak bisa mengubah class itu sendiri:

import java.util.Comparator;

class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
}

class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
}

Kamu kemudian dapat meneruskan comparator ke method pengurutan:

List<Person> people = new ArrayList<>();
people.add(new Person("Charlie", 30));
people.add(new Person("Alice", 25));

Collections.sort(people, new NameComparator());  // Diurutkan berdasarkan nama
Collections.sort(people, new AgeComparator());   // Diurutkan berdasarkan usia

Untuk menulis kode yang ringkas, kamu bisa menggunakan ekspresi lambda karena Comparator adalah interface fungsional:

Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));

Perbedaan utamanya: Comparable diimplementasikan oleh class yang dibandingkan dan menentukan satu urutan alami, sedangkan Comparator adalah class terpisah yang dapat menentukan urutan kustom tanpa batas.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pengurutan karyawan yang menunjukkan keunggulan antarmuka Comparator. Kamu akan membuat beberapa pembanding untuk mengurutkan karyawan dengan berbagai cara, berdasarkan gaji dan nama, tanpa mengubah class Employee itu sendiri.

Kamu akan mengatur kodemu dalam empat file:

  • Employee.java: Buat class yang merepresentasikan karyawan dengan tiga field privat: name (String), department (String), dan salary (double). Sertakan constructor untuk menginisialisasi semua field dan method getter untuk masing-masing field. Override toString() agar mengembalikan: [name] ([department]) - $[salary]
  • SalaryComparator.java: Buat pembanding yang mengurutkan karyawan berdasarkan gaji dalam urutan menurun (gaji tertinggi terlebih dahulu). Implementasikan antarmuka Comparator<Employee> dan method compare()-nya. Gunakan Double.compare() untuk membandingkan nilai gaji dengan aman.
  • NameComparator.java: Buat pembanding lain yang mengurutkan karyawan berdasarkan nama secara alfabetis dalam urutan menaik (A sampai Z). Implementasikan Comparator<Employee> dan gunakan method compareTo() milik String untuk membandingkan nama.
  • Main.java: Satukan semuanya dengan membuat list karyawan dan mengurutkannya menggunakan pembandingmu. Kamu akan menerima input untuk tiga karyawan, masing-masing pada baris terpisah dengan format: name,department,salary

    Buat ArrayList karyawan, lalu tunjukkan kedua cara pengurutan berikut:

    1. Pertama, urutkan berdasarkan gaji menggunakan SalaryComparator-mu dan cetak setiap karyawan
    2. Cetak satu baris kosong
    3. Lalu, urutkan berdasarkan nama menggunakan NameComparator-mu dan cetak setiap karyawan

Kamu akan menerima tiga baris input, masing-masing berisi data karyawan dengan format: name,department,salary

Sebagai contoh, baris input mungkin seperti ini: Alice,Engineering,75000.0

Ingat untuk mengimpor java.util.Comparator di file pembandingmu, serta java.util.ArrayList, java.util.Collections, dan java.util.Scanner di file Main-mu. Perhatikan bagaimana pembanding memungkinkan kamu menentukan beberapa strategi pengurutan secara terpisah: class Employee tidak perlu mengetahui apa pun tentang cara pengurutannya!

Coba sendiri

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Baca data tiga karyawan dari input
        // Format setiap baris: name,department,salary
        String line1 = scanner.nextLine();
        String line2 = scanner.nextLine();
        String line3 = scanner.nextLine();
        
        // TODO: Uraikan setiap baris dan buat object Employee
        // Petunjuk: Gunakan split(",") untuk memisahkan nilai-nilainya
        
        // TODO: Buat ArrayList untuk karyawan dan tambahkan ketiganya
        
        // TODO: Urutkan berdasarkan gaji menggunakan SalaryComparator dan cetak setiap karyawan
        // Petunjuk: Gunakan Collections.sort(list, comparator)
        
        // TODO: Cetak baris kosong
        
        // TODO: Urutkan berdasarkan nama menggunakan NameComparator dan cetak setiap karyawan
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online