【问题标题】:If Statement in for loop only returns true once?如果for循环中的语句只返回一次true?
【发布时间】:2011-04-28 05:02:46
【问题描述】:
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

tempPoint[2] 在这种情况下每次都是2.0

但调试器显示

bestPoints.add(new Double[] {tempPoint[0], tempPoint[1]});

如果 if 语句不正确,只运行一次?为什么?

【问题讨论】:

  • 确定它是 2.0,而不是 1.999999999...?在double 上使用== 是非常危险的操作。
  • 他没有在 double 上使用 == ...他在 Double 上使用它,这就是问题所在。它是在比较参考值。

标签: java for-loop if-statement


【解决方案1】:

您很可能会执行引用等于而不是比较等于。当使用数字类型的大写字母版本时,您应该使用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)。如果您想要来自doubles 的完全匹配,那么继续您正在做的事情(在确保正确类型的相等检查之后,取决于 maxCount),但是如果您想要 near 匹配(如果小数是关注而不是预定义的常量),然后使用 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 值。

【讨论】:

    【解决方案2】:

    在您尝试匹配 Double 对象的引用的情况下,您应该使用 if(tempPoint[2].compareTo(maxCount)==0)。

    【讨论】:

      【解决方案3】:

      因为您使用的是“java.lang.Double”。它们是对象。假设 maxCount 也是 Double

      比较两个对象使用

      等于()

      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

      【讨论】:

        【解决方案4】:

        要比较两个 double 原始值,请使用 Double 类的 compare(double d1, double d2) 方法。这是一种静态方法。如果两个值相等,则返回 0,如果 d1 小于 d2,则返回小于 0 的值,如果 d1 大于 d2,则返回大于 0 的值。

        【讨论】:

          【解决方案5】:

          如果您非常确定 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())

          【讨论】:

            猜你喜欢
            • 2019-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多