SORU
26 Ocak 2009, PAZARTESİ


Null-güvenli bir compareTo basitleştirmek için nasıl() uygulama?

Bu (Collections.sort() ve diğer güzellikler Java platformu tarafından sunulan kullanabilmek için) gibi basit bir sınıf için compareTo() yöntem uygulamaya çalışıyorum

public class Metadata implements Comparable<Metadata> {
    private String name;
    private String value;

// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}

İstiyorumdoğal siparişbu nesneler olmak için: 1) Adı 2) göre sıralanmış eğer isim aynı ise değer sıralaması; hem karşılaştırmaları büyük / küçük harf duyarlı olmalıdır. Her iki alan için null değerleri compareTo bu gibi durumlarda kırmak gerekir değil yani gayet kabul edilebilir.

Aklıma gelen bir çözüm birlikte (kullanarak "koruma hükümleri" burada Diğerleri tek bir dönüş noktası tercih olabilir, ama konumuz bu değil): . ben aşağıdaki satırları

// 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 yapıyor, ama bu kod ile gayet mutlu değilim. Kuşkusuz değilçokkarmaşık, ama çok ayrıntılı ve sıkıcı bir iştir.

Asıl soru şunasıl bu daha ayrıntılı olurişlevselliği koruyarak ()? Eğer yardım ederlerse standart kütüphaneleri veya Apache Commons Java başvurmak için çekinmeyin. Bu (küçük) yapmak için tek seçenek benim kendi uygulamak için daha basit olabilir "NullSafeStringComparator", ve bunu uygulamak karşılaştırmak için her iki alan?

Düzenlemeler 1-3Eddie haklı; "iki isim boş" durum yukarıda . bu sabit

CEVAP
5 NİSAN 2012, PERŞEMBE


Henüz belirtilmeyen bu yana, sadece Apache Commons Lang kullanabilirsiniz:

result = ObjectUtils.compare(firstComparable, secondComparable)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • dcigs

    dcigs

    9 EYLÜL 2006
  • monkophile

    monkophile

    25 Temmuz 2007
  • TechnoBuffalo

    TechnoBuffal

    8 HAZİRAN 2007