我写了以下代码:
public class NewClass2 implements Comparator<Point>
{
public int compare(Point p1, Point p2)
{
return (int)(p1.getY() - p2.getY());
}
}
如果我说有两个双号3.2 - 3.1
,则差异应为0.1
。但是,当我将数字转换为int时,差异最终为0
,这是不正确的。
因此我需要compare()
返回一个double,而不是int。问题是,我的getX
字段是双倍的。我该如何解决这个问题?
答案 0 :(得分:97)
我建议你使用内置方法Double.compare()。如果您需要双值的范围相等,则可以先使用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());
使用&lt;的问题和&gt;是因为NaN在两种情况下都会返回false,导致处理可能不一致。例如NaN被定义为不等于任何东西,即使在@ suihock和@Martinho的解决方案中也是如此,如果任何一个值都是NaN,方法将每次返回0,暗示NaN等于所有东西。
答案 1 :(得分:65)
您无需返回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;
}
}
答案 2 :(得分:11)
从Java 1.8开始,您也可以使用
Comparator.comparingDouble(p -> p.getY())
答案 3 :(得分:8)
方法compare
应返回int
。这是一个数字:
您需要才能返回double
。您必须返回int
以实现Comparator
接口。根据我上面列出的规则,您只需返回正确的int
。
你不能简单地从int转换,就像你说的那样,0.1的差异将导致0.你可以简单地这样做:
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;
}
但是由于浮点值的比较总是很麻烦,你应该在一定范围内进行比较(见this question),如下所示:
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;
}
答案 4 :(得分:2)
我只想扩展Peter Lawrey对JDK 8的回答,如果你这样做:
public class NewClass2 implements Comparator<Point> {
public int compare(Point p1, Point p2) {
return Double.compare(p1.getY(), p2.gety());
}
}
您可以非常轻松地使用lambda表达式定义此比较器
(Point p1,Point p2) -> Double.compare(p1.getY(), p2.gety())
更好的是,你可以使用这样的成员引用:
Double::compare
答案 5 :(得分:1)
在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);
答案 6 :(得分:0)
嗯,你可以在转换成整数之前将这些双精度值乘以适当的因子,例如。在你的情况下,因为它只有一个小数位,所以10将是一个很好的因素;
return (int)(p1.getY()*10 - p2.getY()*10);
答案 7 :(得分:0)
Double min = Arrays.stream(myArray).min(Double::compare).get();
答案 8 :(得分:0)
int compare(Double first, Double second) {
if (Math.abs(first - second) < 1E-6) {
return 0;
} else {
return Double.compare(first, second);
}
}