2016-05-16 11 views
0

これは、既に発生している他のJavaソート例外の問題と同じではありません。 Java SEの8.私のコンパレータを使用した:私は万かそこらのオブジェクトのリストでこれを実行するとJava TimSortが例外をスローするIllegalArgumentException:比較メソッドがその汎用コントラクトに違反している

@Override 
public int compare (BusinessObject bo1, BusinessObject bo2) { 
    int scoreComp = Double.compare(bo1.getScore(), bo2.getScore()); 
    if (scoreComp != 0) { 
    return(scoreComp); 
    } 
    String name1 = bo1.getName() == null ? "" : bo1.getName(); 
    String name2 = bo2.getName() == null ? "" : bo2.getName(); 
    return(name1.compareTo(name2)); 
} 

、それは例外:IllegalArgumentExceptionの時間の約25%をスローします。同じデータで再実行すると例外がスローされないことがあります。私は推移性の問題やNaNの問題は見当たりません。何かご意見は?

+0

BusinessObjectは変更可能ですか?どのインスタンスもソート中に突然変異している可能性はありますか? –

+0

これは変更可能ですが、ソート中に他のスレッドは実行されていません。スコアのゲッターはあまりにも複雑であることが判明し、2回の呼び出しで時間の経過とともに異なる値が返される可能性があります。私は単なるBusinessObjectのコンシューマーなので、実際に変更することはできませんが、ソートする前にラップしてスコアをフリーズしようとすることができます。 – SplendidSplinter

+0

"2回の呼び出しで時間の経過とともに異なる値が返される可能性があります。同じオブジェクトの複数の呼び出しが異なる値を返す可能性があるため、比較の契約に違反するため、オブジェクトを"比較 "できません。時間。 –

答えて

0

これはあなたの質問に直接答えるものではありませんが、Java 8では、化合物Camparatorの実装を単純に作成する方法はComparatorです。たとえば、何をしようとしているかは次のようになります。

Comparator.comparingDouble(BusinessObject::getScore) 
      .thenComparing(
       Comparator.nullsFirst(
        Comparator.comparing(BusinessObject::getName)); 
関連する問題