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

时间:2011-04-08 08:05:19

标签: java sorting collections

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

class TestData {
    Date activation;
    Date timeStamp;
}

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

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

的代码
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 个答案:

答案 0 :(得分: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;
            }               
        });

答案 1 :(得分:9)

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