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

  • BMG Rentals Property Management

    BMG Rentals

    23 Mayıs 2011
  • EminemVEVO

    EminemVEVO

    12 Mayıs 2009
  • SunsetTrance

    SunsetTrance

    20 EYLÜL 2008