1. 程式人生 > >集合排序中的 Comparison method violates its general contract 異常

集合排序中的 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.TimSort.mergeAt(TimSort.java:485)
  at java.util.TimSort.mergeCollapse(TimSort.java:408)
at java.util.TimSort.sort(TimSort.java:214)
  at java.util.TimSort.sort(TimSort.java:173)
  at java.util.Arrays.sort(Arrays.java:659)
  at java.util.Collections.sort(Collections.java:217)
...

原因

JDK7中的Collections.Sort方法實現中,如果兩個值是相等的,那麼compare方法需要返回0,否則 可能 會在排序時拋錯,而JDK6是沒有這個限制的。

if (len2 == 0) {
    throw new IllegalArgumentException("Comparison method violates its general contract!");
}

 在 JDK7 版本以上,Comparator 要滿足自反性,傳遞性,對稱性,不然 Arrays.sort,(也就是說JDK6版本是不存在這個問題的)

Collections.sort 會報 IllegalArgumentException 異常。

說明:

1) 自反性:x,y 的比較結果和 y,x 的比較結果相反。

2) 傳遞性:x>y,y>z,則 x>z。

3) 對稱性:x=y,則 x,z 比較結果和 y,z 比較結果相同。

反例:下例中沒有處理相等的情況,實際使用中可能會出現異常

new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getId() > o2.getId() ? 1 : -1;
    }
} 

但是我的程式碼應該處理了相等的情況啊,

我們要排序的物件要建議實現滿足對稱性,傳遞性和自反性。說實話,這是啥啊,不造啊。我關心怎麼解決問題

原來程式碼:

Collections.sort(valueList, Collections.reverseOrder(new Comparator<Office>() {
			@Override
			public int compare(Office o1, Office o2) {
				if (o1.getScore() >= o2.getScore()) {
					return 1;
				}
				return -1;
				
			}
		}));

後來,我就把程式碼改成了下面這個鬼樣子:


		Collections.sort(valueList, Collections.reverseOrder(new Comparator<Office>() {
			@Override
			public int compare(Office o1, Office o2) {
				/*if (o1.getScore() >= o2.getScore()) {
					return 1;
				}
				return -1;*/
				return (int) (o1.getScore()-o2.getScore());
			}
		}));

ps:我的Office物件中,score 屬性是double型別的 所以需要強轉

雖然我不知道為什麼哈 但是它的確是好了,留個坑哈,等我明白了再來填

如果哪位大神肯幫我補充一下,那當然是感激不盡了!!!!!

相關推薦

集合排序Comparison method violates its general contract 異常

異常資訊 java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:86

Android碰到 "Comparison method violates its general contract" 異常的解決方法

1.概述:  最近在對資訊進行排序時,做了一個簡單地比較器,當時在執行時並沒有報錯,但是,後臺資料重新整理時,我這邊就出了問題。在jdk1.6中,當我們比較的內容的值相同時,使用java自己的排序方法"Collections.sort()"是很正常的,可是到了jdk1.7,

排序:這個坑,你要注意:Comparison method violates its general contract!

解決方法如下: /** * 對比類:根據持有金額 */ private static class TenderCollectComparator implements Comparator<TenderCollect> { public int compa

java 【排序異常:java.lang.IllegalArgumentException: Comparison method violates its general contract!

環境 java:1.7 前言 本來是不想寫這篇的,但是最近老報這個錯誤,一開始,我以為解決了,後來發現不是那麼回事 現在特意記錄下 我的排序程式碼 我先貼出完整的排序程式碼: /** * 支援兩個欄位排序 * @param result

mysql效能優化及 Comparison method violates its general contract

  專案上巢狀結果集查詢,查詢的列表再根據每個id進行查詢計算,巢狀的sql如下: SELECT SUM(IFNULL(t.out_rate,0)) totalOutRate, SUM(IF(IFNULL(t.pre_power,0)-IFNULL(t.power,0)<0,0,IFNULL(t.pr

java-collections.sort異常Comparison method violates its general contract!

異常資訊 java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:868

IllegalArgumentException: Comparison method violates its general contract錯誤詳細內容

 今天在開發的過程中出現了一個比較詭異的報錯。 擷取部分報錯資訊java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSor

處理 Comparable介面不嚴謹導致Comparison method violates its general contract!

本文主旨是記錄問題解決過程 出錯的日誌 Shutting down VM --------- beginning of crash FATAL EXCEPTION: main Process

Comparison method violates its general contract!

背景16號為了統一線上伺服器執行環境,將兩臺伺服器的Tomcat6+JDK6升級到Tomcat7+JDK7,本以為很簡單的事情,升級後自己驗證也沒問題,沒想到卻悲劇了。升級後,過了半小時運營就找過來反饋問題,部分角色無法登陸系統,由於異常日誌沒有輸出,沒有找到問題,無奈回滾。

[Java]實現Comparable介面不嚴謹導致Comparison method violates its general contract!

/** * 已經將src陣列複製了一份到dest陣列 * low和high是mergesort在陣列中的下標 * off為low相對於下標0的偏移量 */ private static void mergeSort(Object[] src,

java.lang.IllegalArgumentException: Comparison method violates its general contract!的解決方法

       上午在敲程式碼時,對一個List集合進行排序,程式碼如下: Collections.sort(list2,new Comparator<Integer>()

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

背景 16號為了統一線上伺服器執行環境,將兩臺伺服器的Tomcat6+JDK6升級到Tomcat7+JDK7,本以為很簡單的事情,升級後自己驗證也沒問題,沒想到卻悲劇了。升級後,過了半小時運營就找過來反饋問題,部分角色無法登陸系統,由於異常日誌沒有輸出,沒有找

這個坑,你要注意:Comparison method violates its general contract!

背景有部分業務需要進行排序,對比的物件是某實體裡的金額(double 型別),這樣,我們實現了自定義的比較類,結果執行一段時間之後報了錯誤:Comparison method violates its general contract! ,經過校驗,發現錯誤出現在自定義排序上

List集合排序Sort(Comparison comparison)

List< T > 集合對複雜型別的排序Sort()有4個過載 1.T型別實現了IComparable< T >介面 2.另寫一個類,該類實現了IComparer< T > 3.Sort(Comparison< T

JavaList集合排序的方法 比較器的使用 根據學生對象數序 語文 英語成績總和進行sort排序

private system.in set swift ringbuf 直觀 turn @override encoding package com.swift; import java.util.ArrayList; import java.util.Collecti

.Net集合排序還可以這麽玩

true ora 表達式 str nbsp static gen AS pan 背景: public class StockQuantity { public StockQuantity(string status, DateTime da

.Net集合排序的一種高級玩法

void nullable strong init .html ace 文章 tab center 背景: 學生有名稱、學號, 班級有班級名稱、班級序號 學校有學校名稱、學校編號(序號) 需求 現在需要對學生進行排序 第一排序邏輯 按學

java&android list集合排序工具類

user實體   public class User { private int id; private String name; private String age; public User(int id, String name, String age) {

Java集合Sort排序的使用方法

//對整數集合進行排序 public void sortIntArray() { int[] array = new int[] { 8, 5, 9, 0, 6, 3, 4, 7, 2, 1 };

深度學習在美團點評推薦平臺排序的應用--學習筆記

價格 美團 ger 連接 xtra 避免 傳統 jpeg 冗余 寫在前面:據說下周就要xxxxxxxx, 嚇得本寶寶趕緊找些廣告的東西看看 gbdt+lr的模型之前是知道怎麽搞的,dnn+lr的模型也是知道的,但是都沒有試驗過 深度學習在美團點評推薦平臺排