2017-05-06 64 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值编写自己的比较方法即可。