纳尼?Collections对时间戳排序出错了??
记录一次排序犯的bug,说到底还是考虑不全……
问题现象
今天突然发现项目中的一个列表排序出现了错乱,顿时很慌张,原来测试过的啊,没问题的呀,这是怎么回事,赶紧定位问题,现象如下:
1-9条数据排序正常,10条以后数据排序也对。但是这两块顺序不对。正常应该先展示10条以后的数据,最后再展示1-9条数据。(后来得知,这个现象属于偶然~~和数据有关系)
列表中部分有序,但是整体排序不对……
分析
恩?这是怎么回事?
列表采用的分页加载,莫非是 分页请求 数据的原因?
¥@#&……*……@¥
一顿分析后,得出结论,分页请求没问题,不是这个原因。
列表用的是RecycleView,莫非是 常见的 列表复用 的原因?
¥@#&……*……@¥
一顿分析后,得出结论,不是没问题。
那会不会是排序本身的问题呢?
那看一下排序的代码
// 网络请求获取数据,封装再beanList中
...
// 对beanList进行排序
Collections.sort(beanList, new Comparator<Bean>() {@Overridepublic int compare(Bean bean1, Bean bean2) {// 降序写法return (int) (bean2.getBuyTime() - bean1.getBuyTime());}
});
...
其实大佬一眼就能看出来原因了,奈何我这心大,看了好几遍,还总觉得没问题。
就这么几行代码咋能出错呢?还纠结了半天,最后才聚焦到了 int类型 上面……
是不是这个数值超过了int的最大值,所以计算错误了呢?
int的取值范围为: -2^31——2^31-1,即
-21 4748 3648——21 4748 36472147483647毫秒 ---> 2147483 秒 ---> 35791 分钟 ---> 596 小时
≈ 25天
2147483647秒 ---> 35791406 分钟 ---> 596523小时
≈ 24855天 ≈ 68年
也就是说,如果是毫秒作为单位的话,int类型最多表示25天时间。
如果时间超过这个范围,那么就会数据错误!
如果是秒作为单位的话,int类型大约可以表示68年时间。
我这里之所以出错,是因为时间超过了这个范围,所以导致排序的时候,错误地判断了大小关系。
解决问题
至此,定位原因。解决方法也就简单了:
(尴尬,犯了基础的错误……)
Collections.sort(beanList, new Comparator<Bean>() {@Overridepublic int compare(Bean bean1, Bean bean2) {// 降序写法// 原先采用的多次比较的方法,先判断是否是同年月,再return时间差,费时费力。// 感谢评论区大佬 【常威追打来福】 指点,比较方法已经修改如下:if(bean2.getBuyTime() - bean1.getBuyTime() > 0){return 1;}else if(bean2.getBuyTime() - bean1.getBuyTime() < 0){return -1;}else {return 0;}}
});
总结
程序开发是个细致的活,一定要细心呀!不要因为马虎,在基础的知识上面翻了车。
在此,再次回顾下基础类型的基础知识,切记勿再犯相关错误!
扩展
在JAVA中一共有八种基本数据类型,他们分别是
byte、short、int、long、float、double、char、boolean
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)
short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)
float 3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方)占用4个字节
double 1.797693e+308~ 4.9000000e-324 占用8个字节
float和double是表示浮点型的数据类型,他们之间的区别在于他们的精确度不同
double型比float型存储范围更大,精度更高,所以通常的浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的,可以在数据后面加上“F”。
浮点型的数据是不能完全精确的,所以有的时候在计算的时候可能会在小数点最后几位出现浮动,这是正常的。
boolean型(布尔型)
这个类型只有两个值,true和false(真和非真)
char型(文本型)
用于存放字符的数据类型,占用2个字节
采用unicode编码,它的前128字节编码与ASCII兼容,字符的存储范围在\u0000~\uFFFF
纳尼?Collections对时间戳排序出错了??相关推荐
- c语言链表容易犯的错误,急求大牛啊这个容易的链表到底在哪出错了
急求大牛啊,这个简单的链表到底在哪出错了 #include #include struct list { char str; struct list * next; }; int main() { s ...
- sql server datetime格式_为什么你SQL Server中SQL日期转换出错了呢?
开发人员有时候使用类似下面SQL将字符串转换为日期时间类型,乍一看,这样的SQL的写法是没有什么问题的.但是这样的SQL其实有时候就是一个定时炸弹,随时可能出现问题(隐藏的炸弹而已,只是等触发条件而已 ...
- Python中单元测试出错了,会怎么样?
在上一篇中,我们看到了单元测试正常通过时的情况,如果我们边修改一下要测试的函数,然后再运行单元测试,会出现什么情况. 原say_hello_name.py 1 def hello_name(name) ...
- 程序员最痛苦的事,就是程序出错;程序员最最痛苦的事,就是程序出错了还没有错误信息!--IIS Service Unavailable 问题如何解决...
今天有人问如何处理IIS网站出现"Service Unavailable"的情况. 在网上google了一下,导致这个出错的原因很多,而"Service Unavaila ...
- mmall工程生成dao层的插件出错了出错了 自动生成mapper 的插件出错了
mybatis.org/dtd/mybatis-generator-config_1_0.dtd标红 2019-03-31 22:18:52 qq_35598865 阅读数 1637 版权声明:本文为 ...
- 最短路径问题matlab作图,[MATLAB基础] matlab最短路径的输出问题,用了递归,但程序出错了,请大虾指点...
matlab最短路径的输出问题,用了递归,但程序出错了,请大虾指点 程序如下 function shortestpath(w,p,q) c='->'; l=''; f=''; t=size(w) ...
- java画方块_[求助]用Swing就画一个方块代码出错了
[求助]用Swing就画一个方块代码出错了 本意就是画个方块... 我都不行...郁闷..........帮帮我. 然后最好能告诉我下如果只想画个方块我写的代码哪句是废话..谢谢! 等待ING.... ...
- idea卡顿的解决方法_《王者荣耀》卡顿及无法下载资源解决方法说明 5周年祈愿活动出错了怎么办...
导读 王者荣耀5周年祈愿活动出错了怎么处理?在王者荣耀的游戏中,5周年祈愿活动会让玩家回答两个问题,回答正确的玩家将 有机会获得永久英雄和皮肤,但是玩家在更新版本的过程中却遇到卡顿及无法下载资源的问题 ...
- 该网站服务器出错了怎么回事,该网站服务器出错了是什么意思(图文)
[导读]该网站服务器出错了是什么意思,下面就是191路由网整理的网络知识百科,来看看吧! 大家好,我是191路由器网小编,上述问题将由我为大家讲解. 以网络为例,该网站服务器出错了的意思是指互联网数据 ...
最新文章
- a,b互换,不使用中间变量
- Linux系统IO分析工具之iotop常用参数介绍
- 重做实验七 寻址方式在结构化数据访问中的应用
- curl -windows下接口通讯
- request用法_虚拟语气的用法十一个考点:怎么考都在这里打转
- 高度可定制化 IM聊天界面设计
- 在windows系统下安装linux双系统
- 微博爬虫思路:Python通过移动端接口爬取,简单易操作
- 踩过坑的可控硅设计 经验总结
- 汇编语言(十二)颜色搭配显示+BIOS功能调用表+INT 10H功能详细列表
- 如何查看自己的qq邮箱服务器地址,怎么看自己设置的qq邮箱帐号
- 大话设计模式——解释器模式
- delphi 注册表
- 用Python下载学习通课程首页的资料
- 收藏几个百度网盘搜索资源引擎
- LaTex学习笔记——目录的制作
- 备忘录模式,徐长卿的三世记忆
- Java8时间校正器
- eclispe启动报错
- 仿网易新闻评论“盖楼”效果实现
热门文章
- 螺旋矩阵(Java)
- Yarn HA 原理
- J Infect (IF 38) | 韩国中央大学贾保磊等揭示人口腔微生物组中编码羊毛硫抗生素链球菌是肝脏疾病的潜在风险因子...
- 数据挖掘——认识数据
- Linux局域网共享打印机(实用型文档)
- 商业银行业务培训总结
- 区间dp入门——总结+习题+解析
- ProcessOn‘s Bug--完善个人资料无限扩容
- 广播计算机应用基础,2019年秋季考试《计算机应用基础》在线考核试题 广播幻灯片操作应选择的功能区是...
- 用百度ai的人流量统计(动态版)来统计固定场景的人流