compareTo() dan Comparable
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 44 dari 87.
Antarmuka Comparable memungkinkan object menentukan urutan alaminya. Dengan mengimplementasikan antarmuka ini, class-mu dapat diurutkan secara otomatis menggunakan method seperti Collections.sort() atau disimpan dalam koleksi yang sudah diurutkan seperti TreeSet.
Antarmuka ini mengharuskan kamu mengimplementasikan satu method: compareTo(). Method ini membandingkan object saat ini dengan object lain dan mengembalikan bilangan bulat yang menunjukkan urutan relatif keduanya:
- Nilai negatif: object ini berada sebelum object lainnya
- Nol: kedua object sama
- Nilai positif: object ini berada setelah object lainnya
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age); // Urutkan berdasarkan usia dari yang termuda ke yang tertua
}
}Setelah diterapkan, pengurutan menjadi mudah:
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people); // Sekarang diurutkan berdasarkan usia: Bob, AliceUntuk membandingkan string atau field lain yang dapat dibandingkan, kamu dapat menggunakan method compareTo() miliknya alih-alih menggunakan pengurangan: return this.name.compareTo(other.name);. Pendekatan ini lebih aman dan menangani kasus tepi dengan tepat. Untuk field int, pilih Integer.compare(a, b) daripada a - b, karena pengurangan dapat menyebabkan overflow pada nilai ekstrem.
Tantangan
MudahMari kita buat sistem pemeringkatan film yang menggunakan antarmuka Comparable untuk mengurutkan film berdasarkan ratingnya. Kamu akan membuat class Movie yang tahu cara membandingkan dirinya dengan film lain, sehingga film dapat diurutkan secara otomatis dari rating tertinggi ke terendah.
Kamu akan mengatur kodemu dalam dua file:
Movie.java: Buat class yang merepresentasikan film dan dapat dibandingkan dengan film lain. Sebuah Movie memiliki tiga field private:title(String),director(String), danrating(double, dari 0.0 hingga 10.0). Sertakan constructor untuk menginisialisasi semua field dan method getter untuk masing-masing field.Buat class Movie-mu mengimplementasikan
Comparable<Movie>dan meng-override methodcompareTo(). Film harus diurutkan berdasarkan rating secara menurun (rating tertinggi terlebih dahulu). Saat membandingkan bilangan double, gunakanDouble.compare()agar perbandingan aman. Ingat untuk membalik urutannya saat mengurutkan secara menurun!Override
toString()agar mengembalikan:[title] by [director] - Rating: [rating]Main.java: Buat class Movie-mu berfungsi dengan membuat list film dan mengurutkannya. Kamu akan menerima input untuk tiga film, masing-masing pada baris terpisah dengan format:title,director,ratingParse setiap baris untuk membuat object Movie, tambahkan ke
ArrayList, lalu gunakanCollections.sort()untuk mengurutkan list. Berkat implementasiComparable-mu, film akan otomatis diurutkan berdasarkan rating!Setelah mengurutkan, cetak setiap film pada baris tersendiri menggunakan format
toString(). Film dengan rating tertinggi harus muncul pertama.
Kamu akan menerima tiga baris input, masing-masing berisi data film dengan format: title,director,rating
Contohnya, baris input mungkin terlihat seperti ini: Inception,Christopher Nolan,8.8
Ingat untuk mengimpor java.util.ArrayList, java.util.Collections, dan java.util.Scanner di file Main-mu. Perhatikan bagaimana mengimplementasikan Comparable memungkinkanmu mengurutkan object kustom dengan satu pemanggilan method: tidak perlu comparator tambahan!
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 tiga baris data film
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO: Buat ArrayList untuk menyimpan object Movie
// TODO: Uraikan setiap baris (format: title,director,rating)
// Petunjuk: Gunakan split(",") untuk memisahkan bagian-bagiannya
// Petunjuk: Gunakan Double.parseDouble() untuk nilai rating
// TODO: Buat object Movie dan tambahkan ke list
// TODO: Urutkan list menggunakan Collections.sort()
// TODO: Cetak setiap film (satu per baris)
}
}
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