1. 程式人生 > >[Java]實現Comparable介面不嚴謹導致Comparison method violates its general contract!

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

/** * 已經將src陣列複製了一份到dest陣列 * low和high是mergesort在陣列中的下標 * off為low相對於下標0的偏移量 */ private static void mergeSort(Object[] src, Object[] dest, int low, int high, int off) { int length = high - low;
//一段精簡的插入排序程式碼,INSERTIONSORT_THRESHOLD = 7 // Insertion sort on smallest arrays if (length < INSERTIONSORT_THRESHOLD) { for (int i=low; i<high; i++) for (int j=i; j>low && ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--) swap(dest, j, j
-1); return; } // Recursively sort halves of dest into src int destLow = low; int destHigh = high; low += off; high += off; int mid = (low + high) >>> 1; mergeSort(dest, src, low, mid, -off); mergeSort(dest, src, mid, high, -off); //判斷整個陣列是否已經有序
// If list is already sorted, just copy from src to dest. This is an // optimization that results in faster sorts for nearly ordered lists. if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) { System.arraycopy(src, low, dest, destLow, length); return; } //歸併 // Merge sorted halves (now in src) into dest for(int i = destLow, p = low, q = mid; i < destHigh; i++) { if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0) dest[i] = src[p++]; else dest[i] = src[q++]; } }

相關推薦

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

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

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

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

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

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

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

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!

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

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

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

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

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

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

Comparison method violates its general contract!

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

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

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

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

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

Effective Java 第三版讀書筆記——條款14:考慮實現 Comparable 介面

與本章討論的其他方法不同,compareTo 方法並沒有在 Object 類中宣告。相反,它是 Comparable 介面中的唯一方法。 通過實現 Comparable 介面,一個類表明它的例項有一個自然序( natural ordering )。對實現 Comparable 介面的物件所組成的陣列排序非常簡

javaComparable介面實現自定義排序

除了利用資料庫的sql語句排序還可以利用java的Comparable介面自定義排序。 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Emplo

java實現Comparable介面和Comparator介面,並重寫compareTo方法和compare方法

實現Comparable介面和Comparator介面,並重寫compareTo方法和compare方法 2016年08月11日 14:39:25 蘇尹 閱讀數:10772更多 個人分類: 學習筆記 實體類:java.lang.Comparable(介面) + coma

java 類比較大小(實現Comparable介面

import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 兩個類要想比較大小,

java實現自定義排序(實現Comparable介面

        排序的演算法,大家都不陌生,有氣泡排序、選擇排序、插入排序,快速排序等等。如果現在有學生類,學校添加了很多學生,要你給學生按照學號大小排序,你會怎麼排? 學生類   Student {int stuID;    String stuName;   int sc

Java排序 Comparable實現Comparable介面

1、首先新建第一個Student類/** * 排序測試 通過實現Comprable的compareTo方法進行排序 */public class Student implements Comparable<Student>{ private String n

java 對ArrayList排序,實現Comparable介面

import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io