文档章节

JDK7-Collections.sort()报Comparison method violates its general contract异常

山哥
 山哥
发布于 2016/09/12 16:40
字数 240
阅读 394
收藏 0

记录在 JDK7 下使用 Collections.sort()  排序偶发的一个异常,以前在 JDK1.6 下面没有这个问题:

Comparison method violates its general contract

发生问题的代码段:

Collections.sort(resultsData, new Comparator<RecordLog>(){
	@Override
	public int compare(RecordLog log1, RecordLog log2) {
		return log1.getTrust() >= log2.getTrust() ? -1 : 1;
	}
});

一个很简单的排序,在JDK1.6下运行没有任何问题,但是切换到JDK7下面偶然会抛出了错误:

java.lang.IllegalArgumentException: Comparison method violates its general contract!
		at java.util.TimSort.mergeHi(Unknown Source)
		at java.util.TimSort.mergeAt(Unknown Source)
		at java.util.TimSort.mergeCollapse(Unknown Source)
		at java.util.TimSort.sort(Unknown Source)
		at java.util.TimSort.sort(Unknown Source)
		at java.util.Arrays.sort(Unknown Source)
		at java.util.Collections.sort(Unknown Source)

原因是:JDK7中的Collections.sort()方法实现中采用 TimeSort,如果两个值是相等的,那么compare方法需要返回0,否则可能会在排序时抛错,而JDK6是没有这个限制的。

解决方法就很简单了:

Collections.sort(resultsData, new Comparator<RecordLog>(){
	@Override
	public int compare(RecordLog log1, RecordLog log2) {
		return log1.getTrust() == log2.getTrust() ? 0 : (log1.getTrust() > log2.getTrust() ? -1 : 1);
	}
});

 

感谢:http://blog.2baxb.me/archives/993

© 著作权归作者所有

山哥

山哥

粉丝 246
博文 354
码字总数 136686
作品 0
南京
程序员
私信 提问
JDK7版本运行抛出异常:Comparison method violates its general contract

最近在学Java,后续尝试用Java在云服务器上做个项目 不过在做一个年龄排序题目的时候,JDK7版本运行抛出异常:Comparison method violates its general contract。 下面是代码: import jav...

云非絮
2016/12/07
1K
6
记一次线上处理的用户反馈

今天突然有用户反馈各个端都不能使用我们的产品了,出于经验,应该是和最近的一次上线有关,最近的一次上线是升级java版本,1.6->1.8。 按照用户反馈,立刻去线上grep各个机器这个用户的错误...

selfless
2016/07/31
23
0
Comparison method violates its general contract!

在使用spark RDD中,需要进行二次排序,二次排序需要使用到scala List的sortWith(compare),需传递一个比较函数compare给sortWith,这个时候会报如标题所示的错误。 val rdd1 = rdd.groupBy...

cjun1990
2016/03/31
631
0
feilong-core 1.10.5,让 Java 开发更简便的工具包

feilong-core 1.10.5 发布了。feilong-core 是一个让 Java 开发更简便的工具包, 可以让你从大量重复的底层代码中脱身,提高工作效率; 让你的代码更简炼,易写、易读、易于维护; 本次升级共有 ...

飞天奔月
2017/07/31
531
3
记一次bug fix:比较器错误

起 4月1号收到兼职端的反馈,说进入“已分配“页面失败,显示系统错误。使用我自己账号登录,无法复现问题,但是使用兼职同学提供的账号进行测试,确实存在这个问题。 定位问题 首先查看日志...

苗新国
2016/06/27
40
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
2
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
3
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部