国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - java中排序報:Comparison method violates its general contract異常的解決

java中排序報:Comparison method violates its general contract異常的解決

2020-11-20 10:26Pulpcode Java教程

這篇文章主要給大家介紹了關于java中排序報:Comparison method violates its general contract異常的解決方法,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

前言

上周線上的一段排序java代碼出現了一個Comparison method violates its general contract,在解決這個問題的途中學到了一些知識這里總結分享一下。

異常原因

這個排序導致的異常將會在java7以上的版本出現,所以如果你的JDK從6升級到了7或者8,那一定要小心此異常。

在java7的兼容列表中,就有對此排序不兼容的說明:

?
1
2
3
4
5
6
Area: API: Utilities
Synopsis: Updated sort behavior for Arrays and Collections may throw an IllegalArgumentException
Description: The sorting algorithm used by java.util.Arrays.sort and (indirectly) by java.util.Collections.sort has been replaced. The new sort implementation may throw an IllegalArgumentException if it detects a Comparable that violates the Comparable contract. The previous implementation silently ignored such a situation.
If the previous behavior is desired, you can use the new system property, java.util.Arrays.useLegacyMergeSort, to restore previous mergesort behavior.
Nature of Incompatibility: behavioral
RFE: 6804124

我從資料中查閱到java7開始引入了Timsort的排序算法。我之前一直以為大部分標準庫的內置排序算法都是快速排序。現在才得知很多語言內部都使用Timsort排序。隨后我在wiki百科上找到了這樣一句話:

t was implemented by Tim Peters in 2002 for use in the Python programming language.

所以這個排序自然是以他命名的。

隨后我又在網上找到了這樣一張圖排序比較的圖:

java中排序報:Comparison method violates its general contract異常的解決

可以發現,Timsort在表現上比QuickSort還要好。

這篇博客不去詳細討論Timsort的實現(看上去這個算法還挺復雜的),我可能會寫另一篇博客單獨討論Timsort,簡單來說Timsort結合了歸并排序和插入排序。這個算法在實現過程中明確需要:嚴格的單調遞增或者遞減來保證算法的穩定性。

java中排序報:Comparison method violates its general contract異常的解決

  • sgn(compare(x, y)) == -sgn(compare(y, x))
  • ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0
  • compare(x, y)==0 implies that sgn(compare(x, z))==sgn(compare(y, z)) for all z

看上去很像離散數學課中學習的集合的對稱性,傳遞性的關系。

所以異常的原因是因為排序算法不夠嚴謹導致的,實際上業務上的代碼經常不如純技術上的嚴謹。比如對于這樣一個算法:

選出航班中的最低價

那如果兩個相等低價同時存在,按照尋找最低價的邏輯如果這么寫:

?
1
2
3
if (thisPrice < lowPrice){
 lowPrice = thisPrice;
}

那低價這個位置就是“先到先得”了。

但如果這么實現:

?
1
2
3
if(thisPrice <= lowPrice){
 lowPrice = thisPrice;
}

那后面的低價就會覆蓋前面的,變成了“后來者居上”。編程中經常遇到先到先得和后來者居上這兩個問題。

所以對于上面那個需要提供嚴謹的判斷大小比較函數實現。所以如果是這樣的:

?
1
return x > y ? 1 : -1;

那么就不符合此條件。

不過我們邏輯要比這個復雜,其實是這樣一個排序條件。按照:

  • 價格進行排序,如果價格相等則起飛時間靠前的先排。
  • 如果起飛時間也相等,就會按照:
  • 非共享非經停>非經停>非共享>經停的屬性進行優先級選擇,如果這些屬性都全部相等,才只能算是相等了。

所以這個判斷函數的問題是:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public compareFlightPrice(flightPrice o1, flightPrice o2){
 // 非經停非共享
 if (o1.getStopNumber() == 0 && !o1.isShare()) {
 return -1;
 } else if (o2.getStopNumber() == 0 && !o2.isShare()) {
 return 1;
 } else {
 if (o1.getStopNumber() == 0) {
  return -1;
 } else if (o2.getStopNumber() == 0) {
  return 1;
 } else {
  if (!o1.isShare()) {
  return -1;
  } else if (!o2.isShare()) {
  return 1;
  } else {
  if (o1.getStopNumber() > 0) {
   return -1;
  } else if (o2.getStopNumber() > 0) {
   return 1;
  } else {
   return 0;
  }
  }
 }
 }
}

這個函數有明顯的先到先得的問題,比如對于compareFlightPrice(a, b) ,如果ab都是非共享非經停,那么這個就會把a排到前面,但如果調用compareFlightPrice(b, a) ,b又會排到前面,所以必須判斷a是非共享非經停且b不是非共享非經停,才能讓a排在前面。

當然除了改比較函數,還有一個解決方式是:給jvm添加啟動參數。

?
1
-Djava.util.Arrays.useLegacyMergeSort=true

還需要注意的是,并不一定你的集合中存在相等的元素,并且比較函數不符合上面的嚴謹定義,就一定會穩定浮現此異常,實際上我們在生產環境出現此異常的概率很小,畢竟java并不會蠢到先去把整個數組都校驗一遍,實際上它是在排序的過程中發現你不符合此條件的。所以有可能某種集合順序讓你剛好繞過了此判斷。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.pulpcode.cn/2017/06/18/comparison-method-violates-its-general-contractfor-sort/

延伸 · 閱讀

精彩推薦
529
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲国产一区二区三区四区 | 成人av网站在线观看 | 久久中国| 国产成人精品综合 | 在线成人 | 超碰在线91 | 国产精品第一区 | 国产 欧美 日产久久 | www.国产 | 黄色毛片在线看 | 日韩一区二区三区电影在线观看 | 激情久久久 | 国产中文字幕在线观看 | 91中文在线观看 | 成人av免费在线播放 | 欧美日韩视频一区二区 | 亚洲午夜精品毛片成人播放器 | 自拍第1页 | 日韩在线免费观看视频 | 噜噜噜噜噜在线视频 | 免费观看日韩一级片 | 视频一区二区三区在线播放 | 成人欧美一区二区三区色青冈 | 精品综合久久 | 色女网 | 91网站免费 | 国产区精品 | 天天看天天爽 | 国产麻豆一区二区三区四区 | 黄色片免费观看 | 国产人免费人成免费视频 | 性高湖久久久久久久久aaaaa | 中文字幕在线播放一区 | 国产中文字幕在线 | 成人在线播放网站 | 国产一区二区在线免费观看 | 久久久久久国产精品mv | 久久av一区二区三区 | 日韩美一级 | 99在线免费观看 | 免费看黄的视频网站 |