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等于所有东西.
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)
Jan*_*jsi 12
从Java 1.8开始,您也可以使用
Comparator.comparingDouble(p -> p.getY())
Run Code Online (Sandbox Code Playgroud)
该方法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)
我只想扩展 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)
它在 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)