2017-05-06 17 views
1

My class implements Comparator<ClassName>Collections.sortを使用してJava 8でArrayListをソート

私の要件は、rNumberというダブルタイプフィールドの降順でArrayList<Hw4b> myList;をソートすることです。 比較方法が一般的な契約に違反しています。私は常にスレッド「メイン」java.lang.IllegalArgumentExceptionがで

例外を取得Collections.sort(myList,this);

を起動しています! 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;  
} 

if条件を変更しようとしましたが、全く並べ替えません。何か助けていただければ幸いです。私はJava 8を使用しています。

+0

この機能を間違った方法で使用することができます。 –

答えて

1

一つの解決策を。

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は、単純なこれらのコンパレータは、1行に書くことができます:

myList.sort((o1, o2) -> Double.compare(o2.rNumber, o1.rNumber)); 

または:のjava-8の機能の一部を使用して、あなたのタスクを達成する

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値の独自のcompareメソッドを書くのではなく、他の人が示唆したように、

関連する問題