Menu
CoddyTech

compareTo() dan Comparable

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

Interface Comparable memungkinkan object menentukan urutan alaminya. Dengan mengimplementasikan interface ini, class-mu dapat diurutkan secara otomatis menggunakan method seperti Collections.sort() atau disimpan dalam koleksi terurut seperti TreeSet.

Antarmuka ini mengharuskan kamu menerapkan 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, Alice

Untuk membandingkan string atau field Comparable lainnya, kamu bisa menyerahkan perbandingan kepada method compareTo() miliknya daripada menggunakan pengurangan: return this.name.compareTo(other.name);. Pendekatan ini lebih aman dan menangani kasus tepi dengan benar. Untuk field int, utamakan Integer.compare(a, b) daripada a - b, karena pengurangan dapat mengalami overflow dengan nilai ekstrem.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pemeringkatan film yang menggunakan interface 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 menyusun 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), dan rating (double, dari 0.0 hingga 10.0). Sertakan constructor untuk menginisialisasi semua field dan getter method untuk masing-masing field.

    Buat class Movie-mu mengimplementasikan Comparable<Movie> dan melakukan override pada method compareTo(). Film harus diurutkan berdasarkan rating secara menurun (rating tertinggi lebih dulu). Saat membandingkan double, gunakan Double.compare() agar perbandingan aman. Ingat untuk membalik urutannya agar hasil pengurutan menurun!

    Lakukan override pada toString() agar mengembalikan: [title] by [director] - Rating: [rating]

  • Main.java: Hidupkan class Movie-mu dengan membuat list film dan mengurutkannya. Kamu akan menerima input untuk tiga film, masing-masing pada baris terpisah dengan format: title,director,rating

    Parse setiap baris untuk membuat object Movie, tambahkan ke ArrayList, lalu gunakan Collections.sort() untuk mengurutkan list. Berkat implementasi Comparable-mu, film akan otomatis diurutkan berdasarkan rating!

    Setelah pengurutan, cetak setiap film pada barisnya sendiri dengan format toString(). Film dengan rating tertinggi harus muncul lebih dulu.

Kamu akan menerima tiga baris input, masing-masing berisi data film dengan format: title,director,rating

Contohnya, baris input bisa terlihat seperti: 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 buatanmu dengan satu pemanggilan method: kamu tidak memerlukan 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 rating
        
        // TODO: Buat object Movie dan tambahkan ke list
        
        // TODO: Urutkan list menggunakan Collections.sort()
        
        // TODO: Cetak setiap film (satu per baris)
    }
}
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