对double属性进行的比较器排序无法满足其一般合同

时间:2017-05-06 00:05:29

标签: java sorting arraylist collections comparator

我的班级实施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

2 个答案:

答案 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());

答案 1 :(得分:1)

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

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

这应该按rNumber降序排序。