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

相關文章
相關標籤/搜索