我有一个有两个日期字段的课程说:
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));
}
}
非常感谢任何帮助。
由于
答案 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
)。