2011-04-08 58 views
2

我有兩個日期字段類說:集合中的兩個參數基礎分揀同時

class TestData { 
    Date activation; 
    Date timeStamp; 
} 

我想排序activation日期的基礎上面的類的列表,如果他們是平等的,然後上基於timestamp即max(激活)和max(timeStamp)。

代碼我想是follws只取最大值(激活)

public class CollectionSort { 

    public static void main(String[] args) { 
     List<TestData> testList = new ArrayList<TestData>(); 

     Collections.sort(testList, new Comparator<TestData>() { 

      @Override 
      public int compare(TestData t1, TestData t2) { 
       int result = 0; 
       if (t1.getActivation().before(t2.getActivation())) { 
         result = 1; 
       } 
       return result; 
      } 
     }); 
     System.out.println("First object is " + testList.get(0)); 
    } 
} 

任何幫助將不勝感激。

謝謝

+2

請注意,如果您的Comparator實現永遠不能返回負整數(通常是-1),那麼它幾乎肯定是錯的!因爲如果'compare(a,b)'返回一個正的'int',那麼'compare(b,a)'**必須返回一個負數! – 2011-04-08 08:11:41

+1

在比較方法中,您不需要對TestData或instanceof測試進行強制轉換。由於泛型(Java 5)在幕後自動爲您執行強制轉換,因此方法參數已經屬於TestData類型。 – 2011-04-08 08:11:52

回答

9

這樣做。

 Collections.sort(yourList, new Comparator<TestData>() {  
      public int compare(TestData o1, TestData o2) { 
       int date1Diff = o1.getActivation().compareTo(o2.getActivation()); 
       return date1Diff == 0 ? 
         o1.geTimestamp().compareTo(o2.getTimestamp()) : 
         date1Diff; 
      }    
     }); 
9

這裏是如何做到這一點在普通的Java:

public int compare(TestData o1, TestData o2) { 
    int result = o1.getActivation().compareTo(o2.getActivation())); 
    if(result==0) result = o1.getTimeStamp().compareTo(o2.getTimeStamp()); 
    return result; 
} 

或用Guava(使用ComparisonChain):

public int compare(TestData o1, TestData o2) { 
    return ComparisonChain.start() 
     .compare(o1.getActivation(), o2.getActivation()) 
     .compare(o1.getTimeStamp(), o2.getTimeStamp()) 
     .result(); 
} 

或用Commons/Lang(使用CompareToBuilder):

public int compare(TestData o1, TestData o2) { 
    return new CompareToBuilder() 
     .append(o1.getActivation(), o2.getActivation()) 
     .append(o1.getTimeStamp(), o2.getTimeStamp()) 
     .toComparison(); 
} 

(這三個版本都是等價的,但純Java版本是最詳細的,因此也是最容易出錯的版本。所有這三種解決方案都假定o1.getActivation()o1.getTimestamp()都實現了Comparable)。

+0

+1 API之間的不錯的比較:s! – aioobe 2011-04-08 08:27:47

+0

不錯的一個....... – 2011-04-08 10:27:17

相關問題