Saya menerapkan compareTo()
metode untuk kelas sederhana seperti ini (untuk dapat menggunakan Collections.sort()
dan barang lain yang ditawarkan oleh platform Java):
public class Metadata implements Comparable<Metadata> {
private String name;
private String value;
// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}
Saya ingin urutan alami untuk objek-objek ini adalah: 1) diurutkan berdasarkan nama dan 2) diurutkan berdasarkan nilai jika nama sama; kedua perbandingan harus peka terhadap huruf besar-kecil. Untuk kedua bidang, nilai nol sangat dapat diterima, jadi compareTo
jangan sampai putus dalam kasus ini.
Solusi yang muncul dalam pikiran adalah di sepanjang garis berikut (saya menggunakan "klausa penjaga" di sini sementara yang lain mungkin lebih suka satu titik kembali, tapi itu intinya):
// primarily by name, secondarily by value; null-safe; case-insensitive
public int compareTo(Metadata other) {
if (this.name == null && other.name != null){
return -1;
}
else if (this.name != null && other.name == null){
return 1;
}
else if (this.name != null && other.name != null) {
int result = this.name.compareToIgnoreCase(other.name);
if (result != 0){
return result;
}
}
if (this.value == null) {
return other.value == null ? 0 : -1;
}
if (other.value == null){
return 1;
}
return this.value.compareToIgnoreCase(other.value);
}
Ini berhasil, tapi saya tidak sepenuhnya senang dengan kode ini. Memang itu tidak terlalu rumit, tetapi cukup bertele-tele dan membosankan.
Pertanyaannya adalah, bagaimana Anda membuat ini kurang bertele-tele (sambil mempertahankan fungsi)? Silakan merujuk ke perpustakaan standar Java atau Apache Commons jika mereka membantu. Apakah satu-satunya pilihan untuk membuat ini (sedikit) lebih sederhana adalah dengan mengimplementasikan "NullSafeStringComparator" saya sendiri, dan menerapkannya untuk membandingkan kedua bidang?
Suntingan 1-3 : Eddie benar; memperbaiki kasus "kedua nama adalah nol" di atas
Tentang jawaban yang diterima
Saya menanyakan pertanyaan ini pada tahun 2009, di Java 1.6 tentu saja, dan pada saat itu solusi JDK murni oleh Eddie adalah jawaban yang saya pilih. Saya tidak pernah sempat mengubah itu sampai sekarang (2017).
Ada juga solusi perpustakaan pihak ke-3 - Koleksi Apache Commons 2009 satu dan satu Guava 2013, keduanya diposting oleh saya - yang saya lebih suka di beberapa titik waktu.
Saya sekarang membuat solusi Java 8 bersih oleh Lukasz Wiktor jawaban yang diterima. Itu pasti harus disukai jika di Jawa 8, dan hari ini Java 8 harus tersedia untuk hampir semua proyek.