Untuk mengimplementasikan pengurutan, diperlukan objek yang diurutkan dapat dibandingkan satu sama lain untuk lebih banyak atau lebih sedikit. Dengan kata lain, untuk mendefinisikan aturan yang akan memungkinkan dua objek untuk menunjukkan mana di antara mereka dalam konteks yang diberikan yang berjalan lebih awal dan yang mana kemudian.
Di java, aturan-aturan ini didefinisikan pada level kelas dimana objek tersebut berada. Misalnya, ambil kelas untuk mendeskripsikan akun pengguna:
UserAccount {
currency
value
updatedTimestamp
}Bergantung pada konteksnya, akun pengguna dapat dibandingkan menurut aturan yang berbeda, misalnya:
dalam aplikasi, pengguna melihat akun yang diurutkan berdasarkan mata uang, lalu berdasarkan nilai;
di panel admin, semua akun pengguna diurutkan berdasarkan tanggal modifikasi.
Untuk menerapkan perbandingan lebih atau kurang di java, ada dua kemungkinan:
UserAccount mengimplementasikan antarmuka
Comparable<UserAccount>Dalam kasus ini, dua objek mendapatkan kemampuan untuk dibandingkan satu sama lain:acc1.compareTo(acc2)Kelas terpisah dibuat yang mengimplementasikan antarmuka
Comparator<UserAccount>, dan kemudian objek kelas ini dapat membandingkan dua objek dari kelas asli satu sama lain:userAccountComparator.compare(acc1, acc2)
Jelas, dalam beberapa kasus, tidak ada pilihan antara Comparable dan Comparator. Jika kelas asli tidak dapat dimodifikasi, atau jika diperlukan aturan perbandingan yang berbeda, maka Komparator harus digunakan. Jika tidak, Anda secara teknis dapat menggunakan Comparator dan Comparable.
Comparable , (class's natural ordering). , (String, Date). , . , . ( BigDecimal , 4.0 4.00?). , "" . Comparable.
. , . . : . :
:
Arrays.sort(accountsList):
Arrays.sort(accountsList, accountByValueComparator)
, compareTo UserAccount, - accountByValueComparator. . .
UserAccount implements Comparable<UserAccount> {
@Override
public int compareTo(UserAccount other) { .. }
} , compareTo ? , Comparable#compareTo, Arrays.sort(). jdk, . : UserAccount Arrays.sort(), stream.sorted() .
Dalam kasus melewatkan pembanding secara eksplisit, menemukan penggunaannya itu sepele. Saya menganggap ini sebagai argumen untuk menggunakan pembanding. (Sama / kode hash adalah contoh lain dari kesulitan menemukan penggunaan implisit, tetapi tidak ada alternatif "Equalator" untuk mereka).
Singkatnya, dalam banyak kasus, argumen untuk menggunakan Comparator lebih banyak daripada argumen untuk menggunakan Comparable.