2011-03-07 112 views
1

我有一個包含產品項目和購買時間的列表。是否可以使用比較java來首先根據產品描述對此列表進行排序,然後按購買日期對它進行排序?組然後使用java比較器對列表進行排序

到目前爲止,我可以使用它按日期或描述或另一個字段的順序排序列表,但我想知道是否可以使用多個字段進行排序?

這是我到目前爲止,排序日期罰款。

public int compare(Transaction aTransaction1, Transaction aTransaction2) 
    { 
     Date lTransactionDate1 = aTransaction1.getTransactionDate(); 
     Date lTransactionDate2 = aTransaction2.getTransactionDate(); 

     return lTransactionDate2.compareTo(lTransactionDate1); 
    } 

在此先感謝。

+2

[最好的方法來比較對象的多個字段?](http://stackoverflow.com/questions/369512/best-way-to-compare-objects-by-multiple-fields) – dogbane 2011-03-07 11:20:09

+0

umm所以創建另一個比較對象似乎是要走的路?或將使用枚舉工作呢?枚舉方法看起來更好 – user648036 2011-03-07 11:24:20

回答

0

取決於您的比較器。如果首先比較產品描述和日期,我認爲你應該得到你以後的內容,即產品項目首先按照描述排序,然後具有相同描述的項目按日期排序。

+0

嗯,我不知道你的意思。 java比較方法是否通過列表一次?或多次?我不想比較產品說明並按順序排列,然後再按日期進行比較排序,因爲這會「破壞」以前訂購的產品說明排序。 – user648036 2011-03-07 11:26:40

+0

@ user648036這不是Peter建議你做的。但是,由於您已將主題引入,因此可以先按日期排序整個列表,然後再按產品說明排序,這樣就可以得到您需要的結果,因爲'Collections.sort()'中的排序算法是保守的。當然你不應該這樣做,但很高興知道你可以。 – biziclop 2011-03-07 11:39:48

+0

@ user648036,我的意思是說,通過實施和使用正確的比較器,您可以根據您的意願一次性訂購列表。在此期間@Emil添加了示例代碼,雖然具有不同的屬性,但是 - 說明了這個想法。 – 2011-03-07 12:33:54

0

這是一個用多個字段進行排序的例子。這裏的實現是根據緯度,經度和高度進行排序。

public class LatLongHt implements Comparable<LatLongHt> { 
    public double lat,lng,ht; 
    public LatLongHt(double latitude, double longitude, double ht2) { 
     this.lat=latitude; 
     lng=longitude; 
     ht=ht2; 
    } 
    @Override 
    public int compareTo(LatLongHt obj) { 
     int result; 
     if((result=compareValue(this.lat,obj.lat))==0)  
      if((result=compareValue(this.lng, obj.lng))==0) 
       result=compareValue(this.ht, obj.ht); 
     return result; 
    } 
    private int compareValue(double val1, double val2) { 
     if(val1==val2) 
      return 0; 
     if(val1>val2) 
      return 1;  
     return -1; 
    } 

    @Override 
    public String toString(){ 
     return "("+lat+','+lng+','+ht+')'; 

    } 


    @ Override 
    public boolean equals(Object o){ 
     if(!(o instanceof LatLongHt))  
      return false; 
     LatLongHt that=(LatLongHt)o; 
     return that.lat==this.lat && that.lng==this.lng && that.ht==this.ht; 
    } 

    @Override 
    public int hashCode() { 
    int result=11; 
    result=(int)(31*result+Double.doubleToLongBits(lat)); 
    result=(int)(31*result+Double.doubleToLongBits(lng)); 
    result=(int)(31*result+Double.doubleToLongBits(ht)); 
    return result; 
} 

} 

我希望這將有助於你如何與多個字段排序,以得到一個想法,然後works.You可以根據自己的需要寫一個比較。

+0

謝謝隊友。我會放棄這一點 – user648036 2011-03-07 11:35:43

0

Bean Comparator允許您對類中的字段進行排序,以便爲描述和日期創建單獨的比較器。然後您可以使用Group Comparator將比較器組合成一個。你的代碼是這樣:

BeanComparator description = new BeanComparator(Transaction.class, "getDescription"); 
BeanComparator date = new BeanComparator(Transaction.class, "getTransactionDate"); 
GroupComparator gc = new GroupComparator(description, date); 
Collections.sort(yourList, gc); 

或者,您可以使用您手動創建單獨的自定義比較,並只使用GroupComparator在一次傳做這兩類。

相關問題