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

use*_*217 2 java sorting collections

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

class TestData {
    Date activation;
    Date timeStamp;
}
Run Code Online (Sandbox Code Playgroud)

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

我试过的代码就是只能获取最大值(激活)的后续代码

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

谢谢

Jig*_*shi 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;
            }               
        });
Run Code Online (Sandbox Code Playgroud)


Sea*_*oyd 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;
 }
Run Code Online (Sandbox Code Playgroud)

或者使用番石榴(使用ComparisonChain):

public int compare(TestData o1, TestData o2) {
    return ComparisonChain.start()
      .compare(o1.getActivation(), o2.getActivation())
      .compare(o1.getTimeStamp(), o2.getTimeStamp())
      .result();
 }
Run Code Online (Sandbox Code Playgroud)

或者使用Commons/Lang(使用CompareToBuilder):

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

(所有三个版本相当,但普通的Java版本是最详细的,因此最容易出错的.所有这三个解决方案假定这两个o1.getActivation()o1.getTimestamp()实施Comparable).