compareTo()
Bu gibi basit bir sınıf için yöntem uyguluyorum ( Collections.sort()
Java platformu tarafından sunulan ve diğer güzellikleri kullanabilmek için):
public class Metadata implements Comparable<Metadata> {
private String name;
private String value;
// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}
Bu nesneler için doğal sıralaması istiyorum : 1) ada göre ve 2) değere göre aynı ise; her iki karşılaştırma da büyük / küçük harfe duyarlı olmamalıdır. Her iki alan için null değerler mükemmel şekilde kabul edilebilir, bu nedenle compareTo
bu durumlarda kırılmamalıdır.
Akla gelen çözüm, aşağıdaki satırlar boyuncadır (Burada "bekçi hükümleri" kullanıyorum, diğerleri ise tek bir dönüş noktası tercih edebilir, ancak bu noktanın yanında):
// 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);
}
Bu işi yapar, ancak bu koddan çok memnun değilim. Kuşkusuz çok karmaşık değil, oldukça ayrıntılı ve sıkıcı.
Soru, bunu nasıl daha az ayrıntılı hale getirirsiniz (işlevselliği korurken)? Yardımcı olurlarsa Java standart kitaplıklarına veya Apache Commons'a başvurmaktan çekinmeyin. Bunu (biraz) basitleştirmenin tek yolu kendi "NullSafeStringComparator'ımı uygulamak ve her iki alanı karşılaştırmak için uygulamak mı?
Düzenlemeler 1-3 : Eddie haklı; yukarıdaki "her iki ad da boş" durumu düzeltildi
Kabul edilen cevap hakkında
Bu soruyu 2009'da elbette Java 1.6'da sordum ve o zaman Eddie'nin saf JDK çözümü benim tercih ettiğim kabul edilen cevaptı. Bunu (2017) şimdiye kadar değiştirmek için hiç uğraşmadım.
Ayrıca, bir zamanlar tercih ettiğim 3. parti kütüphane çözümleri -a 2009 Apache Commons Koleksiyonları bir ve 2013 Guava biri- her zaman yayınladım.
Şimdi kabul edilen cevabı Lukasz Wiktor'un temiz Java 8 çözümünü yaptım . Bu, Java 8'de kesinlikle tercih edilmelidir ve bu günlerde Java 8 neredeyse tüm projeler için kullanılabilir olmalıdır.