双重型比较器

时间:2010-11-22 03:29:48

标签: java casting double comparator

我写了以下代码:

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字段是双倍的。我该如何解决这个问题?

9 个答案:

答案 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);
    }
}