同时根据两个参数进行集合排序

我有一个有两个日期字段的课程说:

class TestData { Date activation; Date timeStamp; } 

我想根据activation日期对上述类的列表进行排序,如果它们相等则基于timestamp即max(激活)和max(timeStamp)。

我试过的代码就像只能获取max(激活)的一样

 public class CollectionSort { public static void main(String[] args) { List testList = new ArrayList(); Collections.sort(testList, new Comparator() { @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)); } } 

任何帮助将不胜感激。

谢谢

这样做。!

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

以下是如何在Plain 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 )。