2010-10-02 93 views

回答

9

訂購這些obects所有這些對象應該有一個共同的抽象類/接口,如Alive與方法getLifeTime(),你可以有兩種Alive延伸Comparable<Alive>或創建自己的Comparator<Alive>

public abstract class Alive extends Comparable<Alive>{ 
    public abstract int getLifeTime(); 
    public int compareTo(Alive alive){ 
     return 0; // Or a negative number or a positive one based on the getLifeTime() method 
    } 
} 

或者

public interface Alive { 
    int getLifeTime(); 
} 

public class AliveComparator implements Comparator<Alive>{ 
    public int compare(Alive alive1, Alive alive2){ 
     return 0; // Or a negative number or a positive one based on the getLifeTime() method 
    } 
} 

之後,下一步是爲使用自動分類收集(TreeSet<Alive>)或排序與Collections.sort()一個List<Alive>


資源:

+0

如果實現'Alive.compareTo',你應該實現它正確,即真正的比較兩個對象,而不是返回0,否則,你將需要一個(基本上是重複的)在每一個具體的子類實現的壽命。 – 2010-10-02 12:58:52

+1

@彼得Török,我沒有做過的實現,因爲我不知道該通緝令。而你真的沒有改寫它在每個子類中,這是我在第一部分中的一個抽象類的原因,而不是一個接口,也就是爲什麼我離開了這個長期的評論的'返回0'線。 – 2010-10-02 13:01:12

+0

對不起,您的代碼評論對此不清楚(至少對我而言);這就是爲什麼我認爲最好添加一個澄清評論:-) – 2010-10-02 14:24:38

1

最簡單的方式將涉及您的類都實現一個接口或擴展底座T級帽子暴露了用於比較的共同屬性(lifeTime)。否則,你可以只創建一個使用反射來獲取生命週期屬性,併爲您的比較比較的方法使用該值的Comparator。當然,如果你的集合包含一個沒有lifeTime屬性的對象,這將會拋出異常。

1

如果所有的類都實現定義的生活界面,因爲它遵循(總是在Java中是一個好主意):

public interface Living { 
    int getLifeTime(); 
} 

您可以通過使用lambdaj庫,因爲它遵循你的生活對象的集合進行排序:

List<Alive> sortedLivings = sort(livings, on(Alive.class).getLifeTime()); 
+0

我知道這個名字聽起來很熟悉。這個問題讓我覺得現在沒有辦法解決反轉中的元素爲了給定的迭代(或自然順序/比較器的反向排序)在lambdaj。 – 2010-10-02 15:19:24