​ 最近涉及一个需要按照时间排序的问题,由于在数据库层面order by太麻烦,所以就准备在代码层面解决,但是过程中遇到了一个很有意思的问题。

​ 先介绍一下用的比较器的api:

o1大于o2,则返回正数;o1等于o2,则返回0;o1小于o2,则返回负数。

先弄一个实体类:

package com.chenjianwen.test;
import java.util.Date;public class OrderDateTest {private String name;private Date date;public OrderDateTest(){}public OrderDateTest(String name,Date date){this.name = name;this.date = date;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String toString() {return "OrderDateTest{" +"name='" + name + '\'' +", date=" + date +'}';}
}

我们按照其中的时间进行排序,如下测试用例:

    @Testpublic void test29() throws ParseException {List<OrderDateTest> list = new ArrayList<>();list.add(new OrderDateTest("1",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-10-26 15:40:30")));list.add(new OrderDateTest("2",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-08-25 15:41:30")));list.add(new OrderDateTest("3",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-10-29 15:40:32")));list.add(new OrderDateTest("4",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-09-21 15:40:30")));list.add(new OrderDateTest("5",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-10-09 15:40:30")));list.add(new OrderDateTest("6",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-11-29 15:40:30")));list.add(new OrderDateTest("7",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-12-29 15:40:30")));list.sort(new Comparator<OrderDateTest>() {@Overridepublic int compare(OrderDateTest o1, OrderDateTest o2) {return (int) (o2.getDate().getTime() - o1.getDate().getTime());}});list.stream().forEach(System.out::println);}

但是测试结果却是这样的:

并没有达到排序的结果,之前用这个比较器按照年龄或者字符串排序都是屡试不爽,这次碰钉子了,百思不得其解,经过后来仔细分析才发现是数据类型取值范围的问题,上面的compare()方法返回值类型是int的,int类型取值范围是:

-2^31 ~ 2^31-1,即-2147483648 ~ 2147483647

而上面我们按时间排序是先转换为时间戳的,而时间戳的差值超出了int的值范围,我们做个实验:

    @Testpublic void test31() throws ParseException {long t1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-12-29 15:40:30").getTime();long t2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-08-20 15:40:30").getTime();System.out.println(t1 - t2);}

上面两个时间点差了4个月,时间戳差值为11318400000,比int值范围大,所以这样是行不通的。解决方法是compare()的比较方法我们自己写,如下:

这样,排序就没问题了,如下结果:

关于比较器Comparator排序时间的问题相关推荐

  1. Java 对象排序 Comparable接口和比较器Comparator的使用

    我这里使用的是Treeset存储的学生信息,定义了学生类,对学生信息进行一个排序: 方法一 对象排序的的方法是,让元素所属类实现 Comparable 接口 ,重写 comparaTo(To) 方法 ...

  2. JAVA语言-比较器Comparator(java中Comparable和Comparator的区别)

    文章目录 一.什么是Comparator 二.Java compare方法和compareTo方法 三.java中Comparable和Comparator的区别 Comparator的例子 三.de ...

  3. 比较器Comparator使用

    最近在项目中做视频搜索功能,在获得视频结果集后需要对视频列表根据集数做排序,自然而然想到了用jdk的比较器Comparator, 编写代码实现如下 private void sortResItem(L ...

  4. java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序

    本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...

  5. 010_TreeMap键使用Comparator排序

    1. TreeMap键使用Comparator排序 import java.util.Comparator; import java.util.Map.Entry; import java.util. ...

  6. 008_TreeSet使用Comparator排序

    1. TreeSet使用Comparator排序 import java.util.Comparator; import java.util.TreeSet;/*** TreeSet使用Compara ...

  7. Java Arraylist 如何使用 Comparator排序

    Java Arraylist 如何使用 Comparator排序import java.util.ArrayList; import java.util.Collections; import jav ...

  8. Java的Comparator排序(升序降序)理解

    Java的Comparator排序(升序降序)理解 int compare(T o1, T o2); 这里o1表示位于前面的对象,o2表示后面的对象 返回-1(或负数),表示不需要交换01和02的位置 ...

  9. java comparator 排序_Java8 Comparator 排序方法

    Java8 Comparator 排序方法 Java8 中 Comparator 接口提供了一些静态方法,可以方便于我们进行排序操作,下面通过例子讲解下如何使用 对整数列表排序(升序) List li ...

最新文章

  1. 日常该怎么处理繁杂的工作?用智办事更有序、高效!
  2. 当医疗遇上人工智能,你不可不知的未来医疗5大趋势
  3. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )
  4. Windows APC学习笔记(二)—— 挂入过程执行过程
  5. iOS开发网络篇—网络编程基础
  6. Node使用MySQL
  7. html查看程序魅族,怎么查看源代码(什么工具能查出一个程序的代码)
  8. Response响应方法详解
  9. 通过源代码研究ASP.NET MVC中的Controller和View(三)
  10. 评分9.7,边看边用!这本Python书终于玩大了!
  11. MAX30102脉搏血氧仪和心率传感器(一)驱动程序
  12. No tracked branch configured for branch new_protocal or the branch doesn't exist.
  13. Redis安装配置说明
  14. 《上瘾》学习笔记(第一、二章)
  15. educoder:实验七 元组和集合
  16. 【调剂】上海科技大学信息学院2023年硕士招生调剂公告
  17. 工程伦理和学术道德(2021秋)
  18. 产生粗体字的html标签,html字体加粗用css设置文字粗体样式
  19. 光纤收发器的原理及应用_光纤收发器的作用原理
  20. 『 云原生·Docker』Docker网络

热门文章

  1. 手术后多久可以做胆摘除_近视手术后多久可以化眼妆?
  2. ruby hash方法_Ruby中带有示例的Hash.key?(obj)方法
  3. php映射,PHP实现路由映射到指定控制器
  4. 如何查看本地的崩溃log_过年回家,还怕抢不到票?程序员教你如何抢票
  5. python 函数 类 模块
  6. node js 开发网站_使用Node JS开发网站
  7. c语言给定一个非空整数数组_C程序检查给定整数的所有位是否为一(1)
  8. 图文并茂的聊聊Java内存模型!
  9. 韩信大招:一致性哈希
  10. JVM(三)对象的生死判定和算法详解