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

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

Comparison method violates its general contractide

发生问题的代码段:spa

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

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

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是没有这个限制的。blog

解决方法就很简单了:排序

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/993get

相关文章
相关标签/搜索