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)
任何帮助将不胜感激.
谢谢
这样做会.
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)
以下是如何在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).