双重型比较器

use*_*221 38 java double casting comparator

我写了以下代码:

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

如果我说有两个双号,3.2 - 3.1差异应该是0.1.然而,当我将数字转换为int时,差异最终为0,这是不正确的.

因此我需要compare()返回一个double,而不是int.问题是,我的getX领域是双重的.我怎么解决这个问题?

Pet*_*rey 104

我建议你使用内置方法Double.compare().如果您需要双值的范围相等,则可以首先使用chcek.

return Double.compare(p1.getY(), p2.gety());
Run Code Online (Sandbox Code Playgroud)

要么

if(Math.abs(p1.getY()-p2.getY()) < ERR) return 0;    
return Double.compare(p1.getY(), p2.gety());
Run Code Online (Sandbox Code Playgroud)

使用<和>的问题是NaN在两种情况下都会返回false,从而导致处理可能不一致.例如,NaN被定义为不等于任何东西,即使在@ suihock和@Martinho的解决方案中也是如此,如果任一值是NaN,方法将每次返回0,暗示NaN等于所有东西.

  • Java 7为`Long`和`Integer`一致性添加了compare(). (4认同)
  • 这是[到源代码的链接](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Double.java#lnmr-999 )的Double.compare()查看如何处理`NaN`。 (3认同)

dte*_*eoh 66

你不需要返回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;
    }    
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这将失败于`NaN`和`*_INFINITY` (5认同)

Jan*_*jsi 12

从Java 1.8开始,您也可以使用

Comparator.comparingDouble(p -> p.getY())
Run Code Online (Sandbox Code Playgroud)


R. *_*des 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;
}
Run Code Online (Sandbox Code Playgroud)

但是由于浮点值的比较总是很麻烦,你应该在一定范围内进行比较(参见这个问题),如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)


Mig*_*azo 5

我只想扩展 Peter Lawrey 在 JDK 8 上的回答,如果你这样做的话:

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

你可以很容易地使用 lambda 表达式定义这个比较器

(Point p1,Point p2) -> Double.compare(p1.getY(), p2.gety())  
Run Code Online (Sandbox Code Playgroud)

更好的是,您可以使用这样的成员引用:

Double::compare
Run Code Online (Sandbox Code Playgroud)


QM.*_*.py 5

它在 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);
Run Code Online (Sandbox Code Playgroud)