如何比較和排序不同類型的使用Java集合對象。下面是用例: 例如狗,MAN,樹,計算機,機械 - 所有這些不同的對象有一個共同的財產說「int lifeTime」。現在我想基於壽命特性比較和使用Java集合排序不同類型的對象
THX
如何比較和排序不同類型的使用Java集合對象。下面是用例: 例如狗,MAN,樹,計算機,機械 - 所有這些不同的對象有一個共同的財產說「int lifeTime」。現在我想基於壽命特性比較和使用Java集合排序不同類型的對象
THX
訂購這些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>
。
資源:
最簡單的方式將涉及您的類都實現一個接口或擴展底座T級帽子暴露了用於比較的共同屬性(lifeTime)。否則,你可以只創建一個使用反射來獲取生命週期屬性,併爲您的比較比較的方法使用該值的Comparator
。當然,如果你的集合包含一個沒有lifeTime屬性的對象,這將會拋出異常。
如果所有的類都實現定義的生活界面,因爲它遵循(總是在Java中是一個好主意):
public interface Living {
int getLifeTime();
}
您可以通過使用lambdaj庫,因爲它遵循你的生活對象的集合進行排序:
List<Alive> sortedLivings = sort(livings, on(Alive.class).getLifeTime());
我知道這個名字聽起來很熟悉。這個問題讓我覺得現在沒有辦法解決反轉中的元素爲了給定的迭代(或自然順序/比較器的反向排序)在lambdaj。 – 2010-10-02 15:19:24
如果實現'Alive.compareTo',你應該實現它正確,即真正的比較兩個對象,而不是返回0,否則,你將需要一個(基本上是重複的)在每一個具體的子類實現的壽命。 – 2010-10-02 12:58:52
@彼得Török,我沒有做過的實現,因爲我不知道該通緝令。而你真的沒有改寫它在每個子類中,這是我在第一部分中的一個抽象類的原因,而不是一個接口,也就是爲什麼我離開了這個長期的評論的'返回0'線。 – 2010-10-02 13:01:12
對不起,您的代碼評論對此不清楚(至少對我而言);這就是爲什麼我認爲最好添加一個澄清評論:-) – 2010-10-02 14:24:38