private List<Double[]> bestPoints(List<Double[]> includedPoints) {
List<Double[]> bestPoints = new ArrayList<Double[]>();
int a = includedPoints.size();
for (int i = 0; i < a; i++) {
Double[] tempPoint = includedPoints.get(i);
if (tempPoint[2] == maxCount) {
bestPoints.add(new Double[] {tempPoint[0], tempPoint[1]});
}
}
return bestPoints;
}
在这种情况下
a = 17
maxCount = 2.0
和
在这种情况下,{p>tempPoint[2]
每次都是2.0
但调试器显示
bestPoints.add(new Double [] {tempPoint [0],tempPoint [1]});
只运行一次,好像if语句不正确?为什么呢?
答案 0 :(得分:3)
你很可能做一个参考等于而不是比较等于。使用大写字母版本的数字类型时,应使用one.equals(two)
。
确保tempPoint[2]
的值完全 2.0
。作为double
,它们很可能接近但不相等。
您也可能会发现使用foreach循环更容易理解:
private List<Double[]> bestPoints(List<Double[]> includedPoints) {
List<Double[]> bestPoints = new ArrayList<Double[]>();
for (Double[] tempPoint : tempPoints) {
if (tempPoint[2] == maxCount) {
bestPoints.add(new Double[] { tempPoint[0], tempPoint[1] });
}
}
return bestPoints;
}
如果值始终是整数,则在检查相等性之前强制转换它们(例如,(long)tempPoint[2] == (long)maxCount
)。如果你想要来自double
的精确匹配,那么继续你正在做的事情(确保正确类型的相等检查,取决于maxCount),但是如果你想接近匹配(如果小数点)是关注而不是预定义的常量),然后使用epsilon值:
public static boolean doubleEquals(double val1, double val2, double epsilon)
{
return Math.abs(val1 - val2) < epsilon;
}
public static boolean doubleEquals(double val1, double val2)
{
return doubleEquals(val1, val2, 1e-5);
}
显然指定一个对你有意义的epsilon值。
答案 1 :(得分:1)
在您尝试匹配Double对象的引用的情况下,您应该使用if(tempPoint [2] .compareTo(maxCount)== 0)。
答案 2 :(得分:1)
因为您使用的是“java.lang.Double”。它们是物体。假设maxCount也是Double
比较两个对象使用
equals()方法
d1.equals(d2)
另一种选择是使用“compareTo())
d1.compareTo(d2)
如果d1在数值上等于d2,则值为0;如果d1在数值上小于d2,则小于0的值;如果d1在数值上大于d2,则值大于0.
在这里阅读更多内容 http://download.oracle.com/javase/6/docs/api/java/lang/Double.html
答案 3 :(得分:0)
要比较两个双原语值,请使用Double类的compare(double d1,double d2)方法。这是一种静态方法。如果两个值相等则返回0,如果d1小于d2则返回小于0的值,如果d1大于d2,则返回大于0的值。
答案 4 :(得分:0)
如果您确定tempPoint[2]
始终是new Double(2.0)
,并且maxCount
是原始双倍,例如double maxCount = 2.0;
而不是Double maxCount = new Double(2.0)
,if条件应该成功。否则,您可以使用if (tempPoint[2].equals(maxCount))
而不是if (tempPoint[2].doubleValue() == maxCount.doubleValue())