如果for循环中的Statement仅返回true一次?

时间:2011-04-28 05:02:47

标签: java for-loop if-statement

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语句不正确?为什么呢?

5 个答案:

答案 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())