Comparison method violates its general contract!null

List.sort报错急救指南:Comparison method violates its general contract全解析 本文深入解析Java中`List.sort`报错`Comparison method violates its general contract`的根源与解决方案。从JDK7的TimSort算法要求出发,详细讲解Comparator实现的三大核心契约原则,并提供紧急诊断四步法、高频问题修复方案及防御性编程实践,帮助开发者快速定位和解决排序异常问题。 阅读详情
@Override
            public int compare(){
            }

这个错就是这个方法报出来的

原因是compare方法没有对空值进行判断,所以传进去的不能是空

所以应该先判断是否为空,在进行判断大小

例如我原来的代码是:

	Collections.sort(list, new Comparator<DealerComplaintFollow>() {
            @Override
            public int compare(DealerComplaintFollow o1, DealerComplaintFollow o2) {
                if (FOUR_HOUR_FOLLOW.equals(filed)) {
                    return o1.getFourHourFollowRate() > o2.getFourHourFollowRate() ? -1 : 1;
                } else if (CLOSED.equals(filed)) {
                    return o1.getComplaintCloseRate() > o2.getComplaintCloseRate() ? -1 : 1;
                } else if (AVERAGE_FOLLOW_DURATION.equals(filed)) {
                    return o1.getAverageFollowDuration() > o2.getAverageFollowDuration() ? 1 : -1;
                } else if (AVERAGE_CLOSED_DURATION.equals(filed)) {
                    return o1.getAverageCloseDuration() > o2.getAverageCloseDuration() ? 1 : -1;
                }
                return 0;
            }
        });

修改之后的代码就应该是:

	Collections.sort(list, new Comparator<DealerComplaintFollow>() {
            @Override
            public int compare(DealerComplaintFollow o1, DealerComplaintFollow o2) {
                if (FOUR_HOUR_FOLLOW.equals(filed)) {
                    if (Objects.isNull(o1.getFourHourFollowRate()) && Objects.isNull(o2.getFourHourFollowRate())){
                        return 0;
                    }else if (Objects.isNull(o1.getFourHourFollowRate())){
                        return 1;
                    }else if (Objects.isNull(o2.getFourHourFollowRate())){
                        return -1;
                    }
                    return o1.getFourHourFollowRate() > o2.getFourHourFollowRate() ? -1 : 1;
                } else if (CLOSED.equals(filed)) {
                    if (Objects.isNull(o1.getComplaintCloseRate()) && Objects.isNull(o2.getComplaintCloseRate())){
                        return 0;
                    }else if (Objects.isNull(o1.getComplaintCloseRate())){
                        return 1;
                    }else if (Objects.isNull(o2.getComplaintCloseRate())){
                        return -1;
                    }
                    return o1.getComplaintCloseRate() > o2.getComplaintCloseRate() ? -1 : 1;
                } else if (AVERAGE_FOLLOW_DURATION.equals(filed)) {
                    if (Objects.isNull(o1.getAverageFollowDuration()) && Objects.isNull(o2.getAverageFollowDuration())){
                        return 0;
                    }else if (Objects.isNull(o1.getAverageFollowDuration())){
                        return -1;
                    }else if (Objects.isNull(o2.getAverageFollowDuration())){
                        return 1;
                    }
                    return o1.getAverageFollowDuration() > o2.getAverageFollowDuration() ? 1 : -1;
                } else if (AVERAGE_CLOSED_DURATION.equals(filed)) {
                    if (Objects.isNull(o1.getAverageCloseDuration()) && Objects.isNull(o2.getAverageCloseDuration())){
                        return 0;
                    }else if (Objects.isNull(o1.getAverageCloseDuration())){
                        return -1;
                    }else if (Objects.isNull(o2.getAverageCloseDuration())){
                        return 1;
                    }
                    return o1.getAverageCloseDuration() > o2.getAverageCloseDuration() ? 1 : -1;
                }
                return 0;
            }
        });

return啥结果 根据你想进行排序的顺序决定

深入解析Comparator的契约性:如何避免Comparison method violates its general contract错误 本文深入解析Java中Comparator接口的契约性,详细阐述自反性、反对称性和传递性三大核心法则,并针对常见的Comparison method violates its general contract错误,通过实战案例剖析整数溢出、状态映射、浮点数比较等典型陷阱,最后提供使用内置方法、处理null值、严格测试等最佳实践,帮助开发者编写健壮可靠的排序逻辑。 阅读详情

相关推荐

List.sort报错急救指南:手把手教你修复Comparison method violates its general contract

本文详细解析了Java中`List.sort`方法报错`Comparison method violates its general contract`的原因及修复方案。从JDK7的TimSort算法引入的严格比较契约出发,介绍了Comparator接口必须满足的自反性、反对称性和传递性三大原则,并提供了典型错误模式、系统化修复方案及调试验证技巧,帮助开发者彻底解决这一常见问题。

weixin_29009669的博客 238

java.lang.IllegalArgumentException: Comparison method violates its general contract!异常分析及解决办法

直接调用Collections的sort: Collections.sort(keywordList); 出现了如下错误: Exception in thread “main” java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:744) at java.util.

qq_39918677的博客 1万+

JDK7+排序踩坑实录:为什么你的Comparator突然报错Comparison method violates its general contract?

本文深入解析JDK7+中Comparator排序异常问题,揭示`Comparison method violates its general contract`错误的根源。通过分析Comparator的自反性、反对称性和传递性三大契约性质,提供符合规范的Comparator实现最佳实践,帮助开发者避免排序陷阱,确保代码在JDK7+环境中的稳定性。

weixin_30632089的博客 218

java.lang.IllegalArgumentException: Comparison method violates its general contract

当不是具体的数值比较时,要罗列多种具体情况下的比较规则,遵循Comparator规则

qq_35987023的博客 6536

JDK7+排序报错?手把手教你修复‘Comparison method violates its general contract‘

本文深入解析JDK7+中出现的'Comparison method violates its general contract'排序错误,详细讲解Comparator的三大原则(自反性、反对称性、传递性),并提供系统化的修复方法。通过典型错误案例分析和最佳实践,帮助开发者编写符合规范的排序逻辑,避免常见陷阱,提升代码质量。

weixin_29001683的博客 177

基于E310的纯逻辑代码实现AD9361射频收发

基于微相科技的E310平台实现AD9361的射频收发功能。采用纯逻辑控制的方式,不需要PS参与。实现了用VIO控制收发使能,发射功率,收发频率,数据接口时序控制,接收增益,BIST测试等功能。

xiaomingzi55的博客 2331

“Comparison method violates its general contract!”问题原因及解决办法

开发中踩到的坑。通过arraylist.sort对元素进行排序,测试阶段没发现,上线后不久报了这个错误。“Comparison method violates its general contract!”。查了一些资料,下面总结一下。先贴下出错的代码: stus.sort((o1, o2) -> { if(o1 == null || o2 == null || o1 == o2) { return 0; }

samur2的博客 5万+

【立创开源】太阳能板充电方案单节3.7v锂电池充电

一直对太阳能板感兴趣,老是感觉充电好麻烦,要是放在那里就可以自己充电多好,所以尝试做了一个太阳能充电板。因为这几天都是阴天,所以测试效果不太好,但是下雨天也是能充电的,但是基本只能维持电量不掉,电压差不多4.2v以上,电流只有2mA。中午出太阳的时候,隔着玻璃放在太阳下测试,电流有12mA以上。能充起一点点电。等大晴天看一看能不能达到卖家说50mA。┗( T﹏T )┛感觉达不到。这个东西只能当一个玩具(;′⌒`)。不过如果汽车上一些行车记录仪加一个这个,汽车经常在太阳下停车,可能再也不用充电了。

贾saisai的博客 1万+

Comparison method violates its general contract! 神奇的报错

Comparison method violates its general contract

Stronger的博客 5052

基于Stigmergy的团队LLM wiki协作机制与FastAPI工程实践

大语言模型驱动的知识管理正在改变个人笔记与团队文档的维护方式,但当多人共同维护一个维基时,如何避免版本覆盖、上下文丢失和幻觉污染成为核心挑战。Stigmergy这一源自生物学的协作机制提供了新思路:通过共享环境中的痕迹(如评论、标记、修订历史)实现异步协作,无需实时沟通或中心协调者。本文将原理落地为可工程化的系统,设计Page、Revision、Trace三大实体,并结合向量索引与LLM审查流程,最终用FastAPI与SQLite搭建一个最小可运行原型。从白蚁筑巢到团队知识库,Stigmergy让每个参与者

weixin_34174322的博客 364

C# chart以鼠标所在位置为中心进行缩放

以前都用labview做一些软件,但给出去总是会遇到版本,安装包过大等一些问题,于是想自学C#,记录一下使用过程中遇到的一些问题和解决措施,便于日后回顾。 在这个项目中需要绘制折线图,由于数据比较大,需要对图表进行缩放操作,以鼠标为中心对图表进行缩放,在网上查找了一些资料没找到我想要的,于是自己想了一个解决方案,可以基本实现,但略显繁琐,由于刚开始学习C#,对一些操作不太了解,若以后遇...

fei的博客 6363

Java排序时遇到Comparison method violates its general contract! 问题解决

主要针对两值相等和两值都为null的情况为做正确处理。2、针对第二种情况:对两值都为null时做出处理。的规则,对排序未处理 null 值一致性或。1、针对第一种情况:对o1和o2相等时做出处理。这个报错一般是排序方法的实现违反了。

weixin_44345975的博客 859

适航规章、标准,书籍资料下载汇总(增加DO-160G中英文版)

很多读者之前问我有没有DO-160G的资源,现在终于找到啦!如果大家有其他想要的资源,可以在留言区告诉我,有空我会帮大家找找看~文末有下载链接:更新日志:2024-9-28:初版。2024-10-21:增加DO-330英文版PDF下载。2024-10-30:增加DO-160G中文版(非机翻)和英文版PDF下载。以下是一些收集到的适航相关的资料,分享给大家。(如果没有你想要的资料,请留言,等找到会及时更新!

qq_41854911的博客 2754

Comparison method violates its general contract

     今天一个群里哥们儿碰到一个异常,抛到群里求解答,他的代码如下图: 抛出的异常信息为: java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:868) at java.util.Ti...

嘿↗你的益达 229

深入剖析 Hive 中 CASE WHEN 与 IF 函数的性能差异:解锁高效数据处理的关键

CASE WHEN 函数堪称 Hive 中条件判断的多面手,它具备两种强大的语法形式,以应对各种复杂的业务逻辑。简单 CASE 表达式这种形式适用于对某一列的值进行直接的条件匹配。其语法如下:END例如,我们有一个记录学生成绩的表CASE scoreELSE 'D'搜索 CASE 表达式当业务逻辑需要更灵活的条件判断时,搜索 CASE 表达式便派上用场。它的语法为:CASEENDCASEELSE 'D'

2401_83088008的博客 1125

在 SAP 中修改 Profile 文件中的主机名需要谨慎操作,需需确保所有相关配置保持一致

在SAP系统中修改Profile文件主机名需谨慎操作,主要步骤包括:1)停止相关SAP服务;2)重命名并编辑实例级Profile文件(如ER1_D00_OLDHOST改为ER1_D00_LRPSAP),修改所有含旧主机名的参数;3)可选更新默认Profile文件;4)在Windows系统中调整注册表配置;5)验证一致性后重启服务。关键注意:保持大小写统一、修改前备份文件、集群环境需同步所有节点。通过系统日志确认新主机名生效且无报错。

金牌架构师 1049

Comparison method violates its general contract!报错解决方法

今天遇到了一个Comparison method violates its general contract!问题,本来是同一个方法一个取了前十后十,一个是显示全部,然后一个报错,一个却能正常问题,排序代码如下 public Comparator down = new Comparator() { @Override public int compare(ZcglZlcgsyl o1, ZcglZ...

qq_36802747的博客 4271

lammps后处理:ovito选择原子高级技巧讲解

大家好,我是小马老师。 本文介绍如何在ovito中使用公式(Expression)选择需要的原子。 用ovito查看lammps模拟结果时,可能会遇到选择特定原子的情况,比如选择坐标位于一定范围内的原子,或者选择结构为fcc的原子等等。 这时候,就需要用到expression selection功能。 Expression selection功能比较强大,下面分别介绍几种选择原子的方法。 在输入公式前,先点击“Add modification”->"Expression selection"选项,在B

lammps_jiayou的博客 2万+

java使用compareTo报Comparison method violates its general contract 异常

java.lang.IllegalArgumentException: Comparison method violates its general contract! 莫名其妙的出现一个错误,源代码如下: //对右侧栏进行排序 将 # 丢在最后 Collections.sort(mIndexDatas, new Comparator<String&g...

Zeno2017的博客 725

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Comparison method violates its general contract;Collections.sort排序问题

用Collections.sort对List<Object>进行排序,本来没什么问题的, 查某一条数据的时候突然报了这个错, Comparison method violates its general contract java.lang.IllegalArgumentException: Comparison method violates its general contr...

alinekang的博客 1511

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Comparison method violates its general contract!

Collections.sort 抛出异常:Comparison method violates its general contract! 原因:list数据中存在相等或者为null得数据,未进行特殊处理。 在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort, Collections.sort 会报 IllegalArgumentException 异常。 说明: 1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。 2) 传递性:x

Aaron_qianmo的博客 643

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Comparison method violates its general contract. 问题分析

参考这篇:https://www.cnblogs.com/wendelhuang/p/7356797.html 我的问题和这一篇的问题一样,引进了对 null值的处理,Java 1.6之前没有问题的,Java1.7、1.8之后更换了底层的排序算法,对我们自己实现的 Comparator接口的 compare方法有一定的要求:自反、传递、对称。 以下对null的处理不满足上述要求的: if ...

You can either travel or read,but either your body or soul must be on the way. 516

Comparison method violates its general contract 问题的处理

java.lang.IllegalArgumentException: Comparison method violates its general contract!     at java.util.TimSort.mergeLo(TimSort.java:777)     at java.util.TimSort.mergeAt(TimSort.java:514)     at java.u...

请叫我大师兄 1万+
上一篇: Object转成JSONObject
下一篇: bigDecimal存到数据库后变成0
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值