53

私は次のコードを書きました:

public class NewClass2 implements Comparator<Point>
{
    public int compare(Point p1, Point p2)
    {
        return (int)(p1.getY() - p2.getY());
    }
}

2 つの倍精度数が3.2 - 3.1あるとします。 の差は です0.1。ただし、数値を int にキャストすると、違いは になり0ます。これは正しくありません。

したがってcompare()、int ではなく double を返す必要があります。問題は、私のgetXフィールドが倍精度であることです。どうすればこの問題を解決できますか?

4

10 に答える 10

128

組み込みメソッド Double.compare() を使用することをお勧めします。double 値が等しくなる範囲が必要な場合は、最初に chcek を使用できます。

return Double.compare(p1.getY(), p2.gety());

また

if(Math.abs(p1.getY()-p2.getY()) < ERR) return 0;    
return Double.compare(p1.getY(), p2.gety());

< と > を使用する際の問題は、どちらの場合も NaN が false を返し、一貫性のない処理が行われる可能性があることです。たとえば、NaN は何とも等しくないと定義されていますが、@suihock と @Martinho のソリューションでは、いずれかの値が NaN の場合、メソッドは毎回 0 を返し、NaN がすべてに等しいことを意味します。

于 2010-11-22T08:58:34.133 に答える
75

戻る必要はありませんdouble

インターフェイスは、Comparator比較される要素の順序を確立するために使用されます。を使用するフィールドを持つことdoubleは、この順序付けとは無関係です。

あなたのコードは問題ありません。

申し訳ありませんが、私は間違っていました。質問をもう一度読んでください。これが必要なものです。

public class NewClass2 implements Comparator<Point> {
    public int compare(Point p1, Point p2) {
        if (p1.getY() < p2.getY()) return -1;
        if (p1.getY() > p2.getY()) return 1;
        return 0;
    }    
}
于 2010-11-22T03:36:32.343 に答える
10

メソッドcompareは を返す必要がありintます。次のいずれかの数値です。

  • 最初の値が 2 番目の値より小さい場合は 0未満
  • 2 つの値が等しい場合はゼロ等しい
  • 最初の値が 2 番目の値より大きい場合は 0より大きい

を返す必要はありませんdouble。インターフェイスを実装するには、 を返す必要があります。上で概説したルールに従って、正しい を返せばよいだけです。intComparatorint

あなたが言ったように、0.1の差は0になるので、単純にintからキャストすることはできません。これを簡単に行うことができます:

public int compare(Point p1, Point p2)
{
    double delta= p1.getY() - p2.getY();
    if(delta > 0) return 1;
    if(delta < 0) return -1;
    return 0;
}

ただし、浮動小数点値の比較は常に面倒なので、次のような特定の範囲内で比較する必要があります (この質問を参照)。

public int compare(Point p1, Point p2)
{
    double delta = p1.getY() - p2.getY();
    if(delta > 0.00001) return 1;
    if(delta < -0.00001) return -1;
    return 0;
}
于 2010-11-22T03:34:52.227 に答える
6

Java 8 では非常に便利です。好きなように誰でも選択できます。

Comparator<someClass> cp = (a, b) ->  Double.compare(a.getScore(), b.getScore());

Comparator<someClass> cp = Comparator.comparing(someClass::getScore);

Comparator<someClass> cp = Comparator.comparingDouble(someClass::getScore);
于 2018-06-28T13:35:44.277 に答える
0
Double min  = Arrays.stream(myArray).min(Double::compare).get();
于 2018-01-29T16:45:08.680 に答える