2010-12-13 21 views
18

Bir sınıfım var, bunu zaten bir öznitelikle sıralıyorum. Şimdi başka bir şey yapmam gerekiyor, veriyi sıralamak için başka bir yol yaratmam gerekiyor. Nasıl yapabilirim, böylece iki yöntem arasında seçim yapabilirim. Bildiğim tek komut, verileri karşılaştırmak istediğim sınıftan compareTo yöntemini alacak Koleksiyonlar.sort.Sadece bir sınıfta 2 karşılaştırılabilir yöntem nasıl yapabilirim?

Bu mümkün mü?

+0

ve: IsbnComparator, AuthorComparator vb

Oh ve yapılandırılabilir bir seçenek olacaktır "yol", o zaman iyi cevaplar vermek daha kolay olacaktır. Öyle olduğu gibi, kesin bir soruya cevap vermek için uğraştığımı saygıyla kabul etmeliyim. –

cevap

49

Yapmanız gereken, özel bir Comparator uygulamaktır. Ve sonra kullanın:

Collections.sort(yourList, new CustomComparator<YourClass>()); 

Özellikle, yazabilirsiniz: (Bu Comparator uygulayan bir Anonim sınıfını oluşturur.) İstersen

Collections.sort(yourList, new Comparator<YourClass>(){ 
    public int compare(YourClass one, YourClass two) { 
     // compare using whichever properties of ListType you need 
    } 
}); 

Klasının içine bu inşa edebileceğini:

class YourClass { 

    static Comparator<YourClass> getAttribute1Comparator() { 
     return new Comparator<YourClass>() { 
      // compare using attribute 1 
     }; 
    } 

    static Comparator<YourClass> getAttribute2Comparator() { 
     return new Comparator<YourClass>() { 
      // compare using attribute 2 
     }; 
    } 
} 

O şöyle kullanılabilir:

Collections.sort(yourList, YourClass.getAttribute2Comparator()); 
3

Sınıfınızda yalnızca bir compareTo() yöntemine sahip olabilirsiniz.

Aynı sınıfı birden çok şekilde sıralamak isterseniz, Comparator uygulamalarını oluşturun.

3

İki yöntem aynı ayak izini gerektiriyorsa, birden fazla kullanımla tek bir sınıfa aşırı yüklenme olasılığınız olabilir; bu, sınıf hiyerarşinizi sabitleyerek çözülür - örneğin "şekil" kullanmak yerine, "oval" ile sınıflayın, "Dikdörtgen", vb.

Alt sınıflama mantıklı değilse, farklı karşılaştırma sınıfları oluşturmanız gerekir. Java'da, genellikle karşılaştırmalar için bir Karşılaştırıcı kullanırsınız. Birkaç oluşturun (veya yapılandırılabilir karşılaştırıcı oluşturmak): Bu "şey" yerine daha açık kelimeler kullanmak mümkün ise

 
BookComparator implements Compartor { 
    enum FIELD { AUTHOR, ISBN, ... }; 
    setSortOrder(int rank, FIELD field){...} 
} 
İlgili konular