2017-05-06 39 views
1

我的類實現了Comparator<ClassName>使用Collections.sort對Java 8中的ArrayList排序

我的要求是在叫rNumber雙類型字段的降序排序ArrayList<Hw4b> myList;。我調用Collections.sort(myList,this);

我總是

異常在線程「主」 java.lang.IllegalArgumentException異常: 比較法違反其總承包!在 java.util.TimSort.mergeHi(TimSort.java:899)

這是我的代碼。

@Override 
public int compare(Hw4b o1, Hw4b o2) { 
     double r1 = o1.rNumber; 
     double r2 = o2.rNumber; 
     if(r2 > r1) 
      return 1; 
     else if(r2 < r1) 
      return -1; 
     else 
      return 0;  
} 

我嘗試,如果條件改變了,但它並沒有在all.Any幫助解決表示讚賞。我正在使用Java 8

+0

您可能以錯誤的方式使用此功能。請參閱[本教程使用詳細信息](https://www.mkyong.com/java8/java-8-lambda-comparator-example/) –

回答

1

一個解決方案,使用了一些Java的8功能完成你的任務。

ArrayList <Hw4b> myList = new ArrayList<>(); 
Collections.sort(myList, Comparator.comparingDouble(Hw4b::getrNumber).reversed()); 

這應該按rNumber降序排序。

+0

就像一個魅力,感謝很多 – Sumanth

+0

很高興它幫助。 ^^。別客氣。 –

3

沒有必要爲此自己編寫if語句。使用Double.compare

@Override 
public int compare(Hw4b o1, Hw4b o2) { 
    return Double.compare(o1.rNumber, o2.rNumber); 
} 

要反轉排序順序,交換的o1.rNumbero2.rNumber的順序。

的Java 8使得這些比較簡單,在一行中寫:

myList.sort((o1, o2) -> Double.compare(o2.rNumber, o1.rNumber)); 

或者:

myList.sort(Comparator.comparingDouble((Hw4b x) -> x.rNumber).reversed()); 
+0

我已經嘗試過您的解決方案,但它按升序排序,我的要求是降序。 – Sumanth

+0

也許'Comparator.comparingDouble(x - > x.rNumber).reversed()' – gyre

2

你得到這個異常的原因是因爲你需要處理Double.NaN。正如其他人所建議的那樣,只要利用使用Double.compare(o1.rNumber,o2.rNumber)而不是爲double值編寫自己的比較方法即可。

相關問題