关于比较器Comparator排序时间的问题
生活随笔
收集整理的這篇文章主要介紹了
关于比较器Comparator排序时间的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 最近涉及一個需要按照時間排序的問題,由于在數據庫層面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排序时间的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 健康管理-健康的概念和健康管理目标特点
- 下一篇: 健康管理-健康管理特点