我的班级实施Comparator<ClassName>
。
我的要求是按照名为ArrayList<Hw4b> myList;
的双重类型字段的降序对rNumber
进行排序。我正在调用Collections.sort(myList,this);
我总是得到
线程中的异常&#34; main&#34; 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;
}
我正在使用Java 8
答案 0 :(得分:3)
没有必要为此自己编写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());
答案 1 :(得分:1)
使用某些java-8功能完成任务的一种解决方案。
ArrayList <Hw4b> myList = new ArrayList<>();
Collections.sort(myList, Comparator.comparingDouble(Hw4b::getrNumber).reversed());
这应该按rNumber
降序排序。