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

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

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

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

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

并没有达到排序的结果,之前用这个比较器按照年龄或者字符串排序都是屡试不爽,这次碰钉子了,百思不得其解,经过后来仔细分析才发现是数据类型取值范围的问题,上面的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()的比较方法我们自己写,如下:

img

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Error running ‘transmission‘: Unable to open debugger port (127.0.0.1:52469): java.net.SocketExcepti

IDEA运行tomcat启动项目时报错。 开始还以为是这里的端口被占用的问题 然而实际上是tomcat的JMX端口的问题&#xff0c;将端口修改一下&#xff0c;就可以完美启动。 修改之后即可启动项目

synchronized 锁升级过程

synchronized 锁升级过程就是其优化的核心&#xff1a;偏向锁 -> 轻量级锁 -> 重量级锁 class Test{private static final Object object new Object(); public void test(){synchronized(object) {// do something } }}每个对象创建时都有各自的对象头&#…

java中数组遍历的三种方式

1.for循环遍历 通常遍历数组都是使用for循环来实现。遍历一维数组很简单&#xff0c;遍历二维数组需要使用双层for循环&#xff0c;通过数组的length属性可获得数组的长度。 2.Arrays工具类中toString静态方法遍历 利用Arrays工具类中的toString静态方法可以将一维数组转化为…

mysql中union 查询

mysql中union 查询 UNION ALL只是简单的将两个结果合并后就返回。这样&#xff0c;如果返回的两个结果集中有重复的数据&#xff0c;那么返回的结果集就会包含重复的数据了。 从效率上说&#xff0c;UNION ALL 要比UNION快很多&#xff0c;所以&#xff0c;如果可以确认合并的…

oracle内存表与临时表,Oracle 临时表之临时表空间组(TTG)

环境&#xff1a;sysORCL> select * from v$version;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdPL/SQL Release 10.2.0.1.0 - ProductionCORE 10.2.0.1.0 Producti…

修改TOMCAT的JVM虚拟机内存大小几种方式

修改TOMCAT的JVM虚拟机内存大小几种方式 Tomcat默认可以使用的内存为128MB&#xff0c;在较大型的应用项目中&#xff0c;这点内存是不够的&#xff0c;需要调大。 经常会出现Java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出的错误。 对此有以下几种方法可以选…

HashMap原理深入理解

hashing(哈希法)的概念 散列法&#xff08;Hashing&#xff09;是一种将字符组成的字符串转换为固定长度&#xff08;一般是更短长度&#xff09;的数值或索引值的方法&#xff0c;称为散列法&#xff0c;也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快&#…

HashMap的底层原理

一&#xff1a;HashMap的节点&#xff1a;HashMap是一个集合&#xff0c;键值对的集合,源码中每个节点用Node<K,V>表示 static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;V value;Node<K,V> next;Node是一个内部类&…

hashMap 底层原理+LinkedHashMap 底层原理+常见面试题

1.源码 java1.7 hashMap 底层实现是数组链表 java1.8 对上面进行优化 数组链表红黑树 2.hashmap 是怎么保存数据的。 在hashmap 中有这样一个结构 Node implenets Map.entity{hashkeyvaluenext} 当我们向hashMap 中放入数据时&#xff0c;其实就是一个 Enity{keyvaue}在存之…

linux时间跳变影响,MONGO 集群 修改linux主机时间后的影响

生产环境是一主一从一仲裁3分片的集群&#xff0c;现在发现其中一个节点比当前时间大了好几天&#xff0c;后使用NTP将时间往回调整副本集上。原来时间是5月3日&#xff0c;当前是4月26日&#xff0c;对此进行了调整。[rootcwdtest1 bin]# dateFri May 3 13:20:31 CST 2019[ro…

xp下添加linux启动项,grub.cfg--XP+ Ubuntu10.04双系统安装后无XP启动项

问题描述&#xff1a;Ubuntu 10.04发布了&#xff0c;随即裸机安装了Windows XP &#xff0c;然后用U盘启动盘安装了Ubuntu 10.04,安装速度飞快(不到10分钟吧)&#xff0c;但是装上后发现在grub启动项里没有XP&#xff0c;郁闷了&#xff0c;花了几分钟终于解决了&#xff0c;呵…

HashMap 源码详细分析(JDK1.8)

1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap。HashMap 最早出现在 JDK 1.2中&#xff0c;底层基于散列算法实现。HashMap 允许 null 键和 null 值&#xff0c;在计算哈键的哈希值时&#xff0c;null 键哈希值为 0。HashMap 并不保证键值对的顺序&…

@Autowired注解能用在static属性吗?autowired注入static属性上为null

Autowired注解能用在static属性吗&#xff1f; 答案是否定的&#xff0c;我们来测试下&#xff1a; 日志信息已经很明确了&#xff0c;表示static不能被Autowired进行复制。为什么呢&#xff1f;我们现在就来一起了解其原因。 首先将我们的测试环境搭建好&#xff0c; Use…

Swagger介绍及使用

导语&#xff1a; 相信无论是前端还是后端开发&#xff0c;都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力&#xff0c;经常来不及更新。其实无论是前端调用后端&#xff0c;还是后端调用后端&…

接口文档生成工具Swagger2的使用

一、什么是Swagger Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法&#xff0c;参数和模型紧密集成到服务器端的代码&#xff0c;允许API来始终保…

Netty详解

一&#xff0e;Netty介绍 1.什么是netty Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架&#xff0c;用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架&#xff0c;Netty 在互联网领域、大数据分布式计算…

有没有检查c语言编译错误的软件,求大佬解答,为什么这个程序编译软件检查不出错误...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include /* malloc()等 */#include#include#include /* exit() */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status; /* Status是函数的类型,其值是函数结果状态代码&…

详解 Java NIO

详解 Java NIO 文件的抽象化表示&#xff0c;字节流以及字符流的文件操作等属于传统 IO 的相关内容&#xff0c;我们已经在前面的文章进行了较为深刻的学习了。 但是传统的 IO 流还是有很多缺陷的&#xff0c;尤其它的阻塞性加上磁盘读写本来就慢&#xff0c;会导致 CPU 使用…

电气工程及其自动化学不学c语言,电气工程及其自动化学什么 就业方向有哪些...

电气工程及其自动化学什么 就业方向有哪些2019-05-05 11:16:29文/刘美娟电气工程及其自动化专业是电气信息领域的一门新兴学科&#xff0c;触角伸向各行各业&#xff0c;小到一个开关的设计&#xff0c;大到宇航飞机的研究&#xff0c;都有它的身影。由于和人们的日常生活以及工…

Tomcat(一):简介

一、概念 Tomcat 服务器是一个开源的轻量级Web应用服务器&#xff0c;在中小型系统和并发量小的场合下被普遍使用&#xff0c;是开发和调试Servlet、JSP 程序的首选。 二、原理 Tomcat结构图&#xff1a; ​ Tomcat主要组件&#xff1a;服务器Server&#xff0c;服务Serv…