双属性上的比较器排序无法满足其一般契约
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.rNumber
和 o2.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) 而不是为双精度值编写自己的比较方法。
我的 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.rNumber
和 o2.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) 而不是为双精度值编写自己的比较方法。