尝试理解以下输出:
public class CommunicationComparator implements Comparator<Communication> {
@Override
public int compare(Communication comm1, Communication comm2) {
long t1 = comm1.getDate().getTime();
long t2 = comm2.getDate().getTime();
return (int) (t2 - t1);
}
}
getDate()方法返回一个java.sql.Timestamp。
下面是排序前的输出:
for (Communication n : retVal) {
System.out.println(n.getDate().toString());
}
2012-10-03 10:02:02.0
2012-10-07 03:02:01.0
2012-10-08 13:02:02.0
2012-10-09 03:02:00.0
2012-11-26 10:02:05.0
2012-11-28 11:28:11.0
2012-12-03 12:03:01.0
2012-12-06 15:03:01.0
2012-12-13 14:03:00.0
2012-12-28 11:03:00.0
2012-12-28 13:49:21.0
之后:
Collections.sort(retVal, new CommunicationsComparator());
2012-12-13 14:03:00.0
2012-12-06 15:03:01.0
2012-12-03 12:03:01.0
2012-11-28 11:28:11.0
2012-10-09 03:02:00.0
2012-10-08 13:02:02.0
2012-11-26 10:02:05.0
2012-10-07 03:02:01.0
2012-10-03 10:02:02.0
2012-12-28 13:49:21.0
2012-12-28 11:03:00.0
知道为什么底部的两个对象可能无法正确排序吗?我正在使用MySQL JDBC实现这个时间戳
最后2个日期与之前日期的差值将溢出整数。
也许更好的解决办法是比较两个值,而不是相减。
long t1 = comm1.getDate().getTime();
long t2 = comm2.getDate().getTime();
if(t2 > t1)
return 1;
else if(t1 > t2)
return -1;
else
return 0;
如果差值大于25天左右,则溢出。(int不能表示比25天更大的毫秒时间差)。这会使比较不正确。
这个问题可以通过将return语句改为
来解决:return Long.signum(t2 - t1);
可以使用
return Long.compare(t2, t1);
但是你最好比较一下日期。
return comm2.getDate().compareTo(comm1.getDate());
我的第一个想法是问题是溢出。t1
和t2
是long
s。
我会检查的。
如果二级比较对你来说足够好,你应该尝试:
return (int) ((t2 - t1)/1000);
这并不能保证不会有溢出。我至少会加一个测试。
我认为最好的答案不是我的。我最喜欢的是: if(t2 > t1)
return 1;
else if(t1 > t2)
return -1;
else
return 0;
在java 8及以上版本中,我们可以用一种非常干净和简单的方式做到这一点:
list.stream().max(Comparator.comparing(YourCustomPojo::yourDateField))
这适用于任何具有compareTo()
支持的字段类型的Pojo。java.sql.Timeastamp
和java.util.Date
已经对这个方法提供了开箱即用的支持。
查看这里的Java文档