Java 同时基于两个参数的集合排序
我有一个有两个日期字段的类,它们是:Java 同时基于两个参数的集合排序,java,sorting,collections,Java,Sorting,Collections,我有一个有两个日期字段的类,它们是: class TestData { Date activation; Date timeStamp; } 我想根据activationdate对上述类的列表进行排序,如果它们相等,则根据timestamp进行排序,即max(activation)和max(timestamp) 我尝试的代码如下,只获取max(激活) 公共类集合排序{ 公共静态void main(字符串[]args){ List testList=new ArrayList()
class TestData {
Date activation;
Date timeStamp;
}
我想根据activation
date对上述类的列表进行排序,如果它们相等,则根据timestamp
进行排序,即max(activation)和max(timestamp)
我尝试的代码如下,只获取max(激活)
公共类集合排序{
公共静态void main(字符串[]args){
List testList=new ArrayList();
Collections.sort(testList,newcomparator(){
@凌驾
公共int比较(TestData t1、TestData t2){
int结果=0;
if(t1.getActivation().before(t2.getActivation())){
结果=1;
}
返回结果;
}
});
System.out.println(“第一个对象是”+testList.get(0));
}
}
任何帮助都将不胜感激
谢谢这样就可以了
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;
}
});
Collections.sort(yourList,newcomparator(){
公共整数比较(TestData o1、TestData o2){
int date1Diff=o1.getActivation().compareTo(o2.getActivation());
返回日期1diff==0?
o1.getTimestamp().compareTo(o2.getTimestamp()):
date1Diff;
}
});
以下是如何在纯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;
}
或与(使用):
或与(使用):
(这三个版本都是等效的,但纯Java版本最冗长,因此最容易出错。这三个解决方案都假定
o1.getActivation()
和o1.getTimestamp()
实现可比性
).请注意,如果您的比较器
实现永远无法返回负整数(通常是-1
),那么它几乎肯定是错误的!因为如果compare(a,b)
返回一个正的int
,那么compare(b,a)
必须返回一个负的!在比较方法中,不需要对TestData或instanceof test进行强制转换。由于泛型(Java5)的转换是在后台自动完成的,因此方法参数已经是TestData类型。
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;
}
public int compare(TestData o1, TestData o2) {
return ComparisonChain.start()
.compare(o1.getActivation(), o2.getActivation())
.compare(o1.getTimeStamp(), o2.getTimeStamp())
.result();
}
public int compare(TestData o1, TestData o2) {
return new CompareToBuilder()
.append(o1.getActivation(), o2.getActivation())
.append(o1.getTimeStamp(), o2.getTimeStamp())
.toComparison();
}