处理 Comparable接口不严谨导致Comparison method violates its general contract!
本文主旨是记录问题解决过程
出错的日志
Shutting down VM
--------- beginning of crash
FATAL EXCEPTION: main
Process: com.gezbox.deliver, PID: 25572
java.lang.IllegalArgumentException: Comparison method violates its general contract!
AndroidRuntime: at java.util.TimSort.mergeLo(TimSort.java:773)
AndroidRuntime: at java.util.TimSort.mergeAt(TimSort.java:510)
AndroidRuntime: at java.util.TimSort.mergeForceCollapse(TimSort.java:453)
AndroidRuntime: at java.util.TimSort.sort(TimSort.java:250)
AndroidRuntime: at java.util.Arrays.sort(Arrays.java:1523)
AndroidRuntime: at java.util.Collections.sort(Collections.java:238)
AndroidRuntime: at com.zzz.XXXFragment.refreshDate(XXXFragment.java:203)
AndroidRuntime: at com.zzz.XXXFragment$2.onSuccess(XXXFragment.java:152)
AndroidRuntime: at com.zzz.XXXFragment$2.onSuccess(XXXFragment.java:147)
AndroidRuntime: at com.gezbox.net.Callback.onResponse(Callback.java:79)
AndroidRuntime: at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:754)
AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
AndroidRuntime: at android.os.Looper.loop(Looper.java:165)
AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6365)
AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:883)
AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
原因
- JDK7中的Collections.Sort方法实现中,你的返回值需要严谨全面;
- 如果两个值是相等的,那么compare方法需要返回0,否则 可能 会在排序时抛错,而JDK6是没有这个限制的。
- 在在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性
代码使用的范例
说明:
1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。
2) 传递性:x>y,y>z,则 x>z。
3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同
对比代码一般是这样的结构,写一段放着看看
Collections.sort(dataList, new Comparator<PackageInfo>() {@Overridepublic int compare(PackageInfo item1, PackageInfo item2) {return xxxxx.compare(xxxxx);}
});
有个简单的解决办法
- 找出所有的条件语句
- 针对所有条件,列出所有的可能情况。然后遍历一遍,覆盖所有的路径
上代码
范例
Collections.sort(dataList, new Comparator<ProcessingOrderResponse.PackageInfo>() {@Overridepublic int compare(ProcessingOrderResponse.PackageInfo item1, ProcessingOrderResponse.PackageInfo item2) {if (TextUtils.equals(mContext.getResources().getString(R.string.task_order_return), item1.packageNo)) {return 1;} else if (TextUtils.equals(mContext.getResources().getString(R.string.task_order_return), item2.packageNo)) {return -1;} else {return item1.packageNo.compareTo(item2.packageNo);}}});
修改后的
Collections.sort(dataList, new Comparator<ProcessingOrderResponse.PackageInfo>() {@Overridepublic int compare(ProcessingOrderResponse.PackageInfo item1, ProcessingOrderResponse.PackageInfo item2) {if (TextUtils.equals(mContext.getString(R.string.task_order_return), item1.packageNo)&& TextUtils.equals(mContext.getString(R.string.task_order_return), item2.packageNo)) {return 0;} else if (!TextUtils.equals(mContext.getString(R.string.task_order_return), item1.packageNo)&& TextUtils.equals(mContext.getString(R.string.task_order_return), item2.packageNo)) {return 1;} else if (TextUtils.equals(mContext.getString(R.string.task_order_return), item1.packageNo)&& !TextUtils.equals(mContext.getString(R.string.task_order_return), item2.packageNo)) {return -1;} else {if (item1.packageNo.compareTo(item2.packageNo) > 0) {return 1;} else if (item1.packageNo.compareTo(item2.packageNo) == 0) {return 0;} else {return -1;}}}});
简单说明
这里有三个判断条件
两个TextUtil.equals 以及String.compareTo
解决思路是
想讲两个TextUtil.equals这的所有路径都遍历,得到4个状态,分别给出1,0,-1这几个返回值
剩下的String.compareTo也遍历一遍,给出1,0,-1三个返回值
网上找了一圈,本来想看看java的源码,结果。。。。没找到源码,有知道的朋友麻烦告诉我一下,在此先谢过
处理 Comparable接口不严谨导致Comparison method violates its general contract!相关推荐
- 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 ...
- Comparison method violates its general contract!
最近项目中有许多地方用到了集合排序,不是自然排序,必须的自己实现排序逻辑了. java提供实现排序接口有两个Comparable与Comparator. 我简单理解: 1.Comparable接口是实 ...
- java异常:Comparison method violates its general contract解决
就在五一放假的前一天凌晨,收到一个测试同学发来的消息,说有个接口访问出现了问题,页面如下: 第二天早上紧急查看了线上日志,发现确实是因为这个告警导致返回问题 通过这条堆栈信息查了一些资料 Compar ...
- fastjson 序列化问题:Comparison method violates its general contract
fastjson 序列化问题:Comparison method violates its general contract 问题重现 今天在测试接口的时候,调用了Mybatis Plus 分页查询的 ...
- 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 ...
- 排序问题排查Comparison method violates its general contract!
通过List.sort对元素进行排序,测试阶段没发现,在st测试的时候报了这个错误."Comparison method violates its general contract!&quo ...
- Comparison method violates its general contract 出现原因和解决方法
错误如下: 代码如下: 刚开始运行,没有什么问题,当我数据量一大的时候,就开时抛出异常,然后一点点拆解,我发现 当nums1和nums2如下时,即list存在太多相同的数组就会抛出这个异常. int[ ...
最新文章
- CES Asia专题|微鹅展示无线充电,智能手机的无线充电时代何时来临?
- 习题:codevs 2822 爱在心中 解题报告
- opencv机器学习线性回归_机器学习入门1---简单线性回归
- Origin一键复制粘贴,也能批量更改图片格式
- 为什么读博士的人越来越多?博士毕业难度不是越来越大吗?
- 指针津逮--------浅谈从指针到“ref”
- GDCM:dicom文件固定方向的测试程序
- 库克:大家会爱上有史以来最出色的iPhone和Apple Watch
- android layout wrap_content,android-如果高度为WRAP_CONTENT,则不显示VideoVi...
- C++ 虚拟继承与虚基类
- 测试Live Write的发布功能
- 《华为交换机学习指南》学习笔记·一
- Fuzz:插桩技术入门
- 详解两个队列实现一个栈(python实现——经典面试题)
- 工作转正申请自我评价
- 2023最新健身俱乐部会员管理系统的设计与实现(毕业设计+论文+开题报告+运行)
- PNAS:睡眠的fMRI频谱特征
- 读书笔记:《钱穆-zg历代zz得失》
- StringBuffer(史上最详细)
- 3行代码完成时序建模,最新开源的时序算法发布!