私は次のコードを書きました:
_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であるということです。この問題を解決するにはどうすればよいですか?
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;
}
}
組み込みメソッド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がすべてに等しいことを意味します。
Java 1.8以降も使用できます
Comparator.comparingDouble(p -> p.getY())
メソッド compare
はint
を返す必要があります。次のいずれかの数値です。
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);
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
モデルクラスの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;
}
たとえば、整数に変換する前に、これらのdouble値に適切な係数を掛けることができます。あなたの場合は小数点以下1桁なので、10が良い要因です。
return (int)(p1.getY()*10 - p2.getY()*10);
Double min = Arrays.stream(myArray).min(Double::compare).get();