web-dev-qa-db-ja.com

ダブルタイプのコンパレータ

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

_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_になりますが、これは正しくありません。

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

38
user472221

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;
    }    
}
66
dteoh

組み込みメソッド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がすべてに等しいことを意味します。

102
Peter Lawrey

Java 1.8以降も使用できます

Comparator.comparingDouble(p -> p.getY())
12
Jan Dolejsi

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

  • 少ない最初の値がlessの場合、ゼロよりも小さい。
  • 等しいゼロに、2つの値が等しいの場合。
  • Greaterは、最初の値がgreaterの場合、ゼロよりも大きい。

doubleを返すためにneedをしないでください。 mustintを返し、Comparatorインターフェイスを実装します。上記で説明したルールに従って、正しいintを返す必要があります。

先ほど言ったように、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;
}

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);
3
QM.py

JDK 8のPeter Lawreyの回答を拡張したい場合は、次のようにします。

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

ラムダ式を使用して非常に簡単にこのコンパレータを定義できます

(Point p1,Point p2) -> Double.compare(p1.getY(), p2.gety())  

さらに良いことに、次のようなメンバー参照を使用できます。

Double::compare
3
Miguel Durazo

モデルクラスのdouble値の新しいコンパレータでDouble.compare(/**double value 1*/, /**double value 2*/);を使用します。

public static List<MyModel> sortByDouble(List<MyModel> modelList) {
        Collections.sort(modelList, new Comparator<MyModel>() {
            @Override
            public int compare(MyModels1, MyModels2) {
                double s1Distance = Double.parseDouble(!TextUtils.isEmpty(s1.distance) ? s1.distance : "0");
                double s2Distance = Double.parseDouble(!TextUtils.isEmpty(s2.distance) ? s2.distance : "0");
                return Double.compare(s1Distance, s2Distance);
            }
        });
        return modelList;
    }
1
Ready Android

たとえば、整数に変換する前に、これらのdouble値に適切な係数を掛けることができます。あなたの場合は小数点以下1桁なので、10が良い要因です。

return (int)(p1.getY()*10 - p2.getY()*10);
0
HasnainMamdani
Double min  = Arrays.stream(myArray).min(Double::compare).get();
0
Stan Sokolov