关于比较器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;就可以完美启动。 修改之后即可启动项目

oracle 11g 环境,Linux彻底清理Oracle 11g RAC环境方案

参考文档&#xff1a;Linux环境下11.2.0.3 rac的快速卸载脚本在Oracle 11.1和Oracle 10.1,10.2上&#xff0c;都是官方提供手工清理RAC环境的方法的(比如环境有问题&#xff0c;或者RAC安装失败&#xff0c;要清理后重新安装。虽然这些版本&#xff0c;也提供了卸载脚本&#x…

oracle常用用户权限,oracle创建新用户及授予常用权限

创建用户create user usernameidentified by usernamedefault tablespace tablespace_name;授予一般权限grant connect,resource,create any table,drop any table,create sequence,select any table, create any index, drop any index,alter any trigger, create any trigger…

synchronized 锁升级过程

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

oracle数据泵索引创建慢,IMPDP 很慢的原因探究

最近帮一个客户做数据迁移测试&#xff0c;数据库版本的10.2.0.4.0&#xff0c;操作系统是AIX到Linux&#xff0c;采用EXPDP/IMPDP方式进行全库导出和导入。客户的数据库有3.6T&#xff0c;导出时间花了30小时&#xff0c;但是导入却花了120小时&#xff0c;这个很不正常。因为…

Collections.synchronizedList使用

Collections.synchronizedList使用 1.SynchronizedList类具体代码&#xff1a; static class SynchronizedList<E>extends SynchronizedCollection<E>implements List<E> {private static final long serialVersionUID -7754090372962971524L;final List&l…

oracle提交数据按键,Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link)...

Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link)有没有办法只通过数据库链接而不是当前会话的数据提交在表上插入/更新的数据&#xff1f; 或者他们被认为是同一个&#xff1f;例如&#xff1a;INSERT INTO main_database.main_table(value1, valu…

oracle ado6,c# ado 连接数据库 六步曲

建立连接分为六步&#xff1a;1.定义连接字符串&#xff0c;oracle 的连接字符串为&#xff1a;private static string connString "Data Source192.168.1.130:1521/mydata;Persist Security InfoTrue;User IDem_test;Passwordtest123;UnicodeTrue";2.根据连接字符串…

java中数组遍历的三种方式

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

127.0.0.1 myz.php,XXE漏洞总结 · MYZ’s Blog

就先以这次校赛的例子作为开头吧ctf首先说一说这次的题&#xff1a;这一次的题是一种回显式的xxe,但是过滤了ENTITY参数.(有点难以判别)贴出源码:1234567891011121314151617181920212223242526272829303132libxml_disable_entity_loader(false);$user1 $_POST[user1];$xmlfile…

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溢出的错误。 对此有以下几种方法可以选…

oracle数据库read only,oracle 报错Linux-x86_64 Error: 30: Read-only file system

本帖最后由 ccton 于 2014-2-18 12:08 编辑[root**** hydata]# cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 5.6 (Tikanga)[root**** hydata]# uname -aLinux gywsj.hyb210 2.6.18-238.el5 #1 SMP Sun Dec 19 14:22:44 EST 2010 x86_64 x86_64 x86_64 GNU…

sql中in和exist语句的区别?

两者都能实现表功能查询&#xff0c;主要区别如下&#xff1a; 1、适用表的类型不同。 in是子查询为驱动表&#xff0c;外面的表为被驱动表&#xff0c;故适用于子查询结果集小而外面的表结果集大的情况。 exists是外面的表为驱动表&#xff0c;子查询里面的表为被驱动表&am…

织梦task_do.php,织梦20160906更新后栏目空白问题

织梦发布了20160906更新&#xff0c;dedecmsv5.7已经很久没有更新了&#xff0c;看到这个更新后心中突然感动强烈的兴奋&#xff0c;虽然早有准备这只是个小小的更新&#xff01;本次更新内容&#xff1a;dede/makehtml_list_action.php,优化更新列表页速度&#xff0c;建议在后…

linux shell 执行目录,bash shell脚本执行的几种方法

bash shell 脚本执行的方法有多种&#xff0c;本文作一个总结&#xff0c;供大家学习参考。假设我们编写好的shell脚本的文件名为hello.sh&#xff0c;文件位置在/data/shell目录中并已有执行权限。方法一&#xff1a;切换到shell脚本所在的目录(此时&#xff0c;称为工作目录)…

Java 源码--Arrays

前言 数组比较特殊&#xff0c;一个数组属于一个对象&#xff0c;但是它的创建方式却不同于一般对象。 Java中的数组创建数组有以下三种方式&#xff1a; // 第一种 int[] array new int[5]; // 第二种 int[] array {1, 2, 3, 4, 5}; // 第三种 int[] array new int[]{1,…

HashMap原理深入理解

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

linux终端转到目录,linux下目录及终端学习

linux目录按调用分为相对路径与绝对路径相对路径&#xff1a;从当前路径下查找查找目标也可使用./调用当前目录下文件或者../调用上一层目录中文件&#xff0c;可通过pwd查看当前路径绝对路径&#xff1a;从根目录出发查找文件。执行cat /etc/passwd命令时由于引用绝对路径&…