Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同时基于两个参数的集合排序_Java_Sorting_Collections - Fatal编程技术网

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();
 }