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 usiaUntuk 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.
Tantangan
MudahMari 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), dansalary(double). Sertakan constructor untuk menginisialisasi semua field dan method getter untuk masing-masing field. OverridetoString()agar mengembalikan:[name] ([department]) - $[salary]SalaryComparator.java: Buat pembanding yang mengurutkan karyawan berdasarkan gaji dalam urutan menurun (gaji tertinggi terlebih dahulu). Implementasikan antarmukaComparator<Employee>dan methodcompare()-nya. GunakanDouble.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). ImplementasikanComparator<Employee>dan gunakan methodcompareTo()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,salaryBuat
ArrayListkaryawan, lalu tunjukkan kedua cara pengurutan berikut:- Pertama, urutkan berdasarkan gaji menggunakan
SalaryComparator-mu dan cetak setiap karyawan - Cetak satu baris kosong
- Lalu, urutkan berdasarkan nama menggunakan
NameComparator-mu dan cetak setiap karyawan
- Pertama, urutkan berdasarkan gaji menggunakan
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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online