双属性上的比较器排序无法满足其一般契约

Comparator sorting on a double attribute fails to satisfy its general contract

我的 class 实现 Comparator<ClassName> .

我的要求是将 ArrayList<Hw4b> myList; 按双精度类型字段 rNumber 的降序排序。我正在调用 Collections.sort(myList,this);

我总是

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract! at 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;    
} 

我正在使用 Java 8

无需自己编写 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());

一种使用 java-8 功能完成任务的解决方案。

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

这应该按 rNumber.

降序排列

你得到那个异常的原因是因为你需要处理 Double.NaN。正如其他人所建议的那样,只需利用 Double.compare(o1.rNumber, o2.rNumber) 而不是为双精度值编写自己的比较方法。