排序问题排查Comparison method violates its general contract!
通过List.sort对元素进行排序,测试阶段没发现,在st测试的时候报了这个错误。“Comparison method violates its general contract!”。
具体堆栈信息:
看起来没什么问题,但是却报了一个错,“比较方法违反其一般合同”。
在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,Collections.sort会报 IllegalArgumentException 异常。
自反性:当 两个相同的元素相比时,compare必须返回0,也就是compare(o1, o1) = 0;
反对称性:如果compare(o1,o2) = 1,则compare(o2, o1)必须返回符号相反的值也就是 -1;
传递性:如果 a>b, b>c, 则 a必然大于c。也就是compare(a,b)>0, compare(b,c)>0, 则compare(a,c)>0
报错代码:
// 线索优先级排序// 1.根据来源渠道排序// 2.根据线索状态排序// 3.时间排序clueHostList.sort((first, second) -> {if (first.getDataChannel().equals(second.getDataChannel())){if (first.getFollowUpStatus().equals(first.getFollowUpStatus())){return (int)(first.getGmtCreate().getTime() - second.getGmtCreate().getTime());}return ClueFollowUpStatusOrder.getOrderByCode(first.getFollowUpStatus()) - ClueFollowUpStatusOrder.getOrderByCode(second.getFollowUpStatus());}return ClueDataChanelOrder.getOrderByCode(first.getDataChannel()) - ClueDataChanelOrder.getOrderByCode(second.getDataChannel());});
public static Integer getOrderByCode(Integer clueDataChannel){if (clueDataChannel == null || lookup.get(clueDataChannel) == null){return MAX_ORDER;}return lookup.get(clueDataChannel).getOrder();}
问题原因:
解决办法:不要出现模棱两可的order!!!
public static Integer getOrderByCode(Integer clueDataChannel){if (clueDataChannel == null || lookup.get(clueDataChannel) == null){return Optional.ofNullable(clueDataChannel).orElse(0) + MAX_ORDER;}return lookup.get(clueDataChannel).getOrder();}
排序问题排查Comparison method violates its general contract!相关推荐
- java.lang.IllegalArgumentException: Comparison method violates its general contract
一.简介 本篇文章讨论ArrayList.sort方法报错: java.lang.IllegalArgumentException: Comparison method violates its ge ...
- android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题
android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题 jav ...
- fastjson 序列化问题:Comparison method violates its general contract
fastjson 序列化问题:Comparison method violates its general contract 问题重现 今天在测试接口的时候,调用了Mybatis Plus 分页查询的 ...
- java异常排列方式_java中排序报:Comparison method violates its general contract异常的解决...
前言 上周线上的一段排序的java代码出现了一个Comparison method violates its general contract,在解决这个问题的途中学到了一些知识这里总结分享一下. 异 ...
- Collections.sort()排序使用TimSort排序报Comparison method violates its general contract 原因
前段时间升级JDK后,之前的功能报java.lang.IllegalArgumentException: Comparison method violates its general contract ...
- 处理 Comparable接口不严谨导致Comparison method violates its general contract!
本文主旨是记录问题解决过程 出错的日志 Shutting down VM --------- beginning of crash FATAL EXCEPTION: main Process: com ...
- Comparison method violates its general contract!
最近项目中有许多地方用到了集合排序,不是自然排序,必须的自己实现排序逻辑了. java提供实现排序接口有两个Comparable与Comparator. 我简单理解: 1.Comparable接口是实 ...
- java异常:Comparison method violates its general contract解决
就在五一放假的前一天凌晨,收到一个测试同学发来的消息,说有个接口访问出现了问题,页面如下: 第二天早上紧急查看了线上日志,发现确实是因为这个告警导致返回问题 通过这条堆栈信息查了一些资料 Compar ...
- Comparison method violates its general contract 出现原因和解决方法
错误如下: 代码如下: 刚开始运行,没有什么问题,当我数据量一大的时候,就开时抛出异常,然后一点点拆解,我发现 当nums1和nums2如下时,即list存在太多相同的数组就会抛出这个异常. int[ ...
最新文章
- java实现倒计时闹钟_js带闹铃功能的倒计时代码
- 整数数组查找java_使用Java编写程序以查找整数数组中的第一个非重复数字?
- python绘制3维图-Python 画出来六维图
- COP-kMeans限制性--kMeans变体算法研究
- python 函数定义先后是否会影响函数之间的相互调用?(不影响)
- 以列表形式输出_04 Python之列表、集合和字典的推导式
- 浏览器为什么会有兼容性问题
- HashOperations
- PHP系统发布指什么,cis系统是指什么
- php查询对象是否有某个属性可用,JavaScript 判断对象中是否有某属性的常用方法...
- IE成长之路--OSPF报文类型
- 医院耗材管理系统开发_12
- Linux 运维之道笔记-第一章
- 书摘—松下幸之助全传
- 将《先生请出山》放到桌面上,聊聊如何将视频做成动态壁纸
- linux下imwbr1进程,清除挖矿程序(imWBR1,ddg,wipefs),亲测可用
- Oracle 删除数据后释放数据文件所占磁盘空间(表空间降高水位)
- 九龙证券|人工智能+国产软件+智慧城市概念股火了,欧洲资管巨头大举抄底
- 概率分析方法与推断统计(来自我写的python书)
- 2011年2月14日 业界新闻摘要