0

我不明白为什么以下逻辑不起作用:

                if (cursorCount > 1 && (!"x".equals(componentType) || !"y".equals(componentType))){
                        message.append("s");
                    }

因此,如果光标计数超过 1,但仅当 componentType 不等于 x 或 y 时,我想打印 's'。

有趣的是,似乎适用于 y 但不是 x 的情况。

困惑的.com!:)

4

3 回答 3

5

尝试

if (cursorCount > 1 && !("x".equals(componentType) || "y".equals(componentType)))

等效地你可以做

if (cursorCount > 1 && !"x".equals(componentType) && !"y".equals(componentType))

这来自将德摩根定律应用于您的逻辑。

我相信这些更符合您对您想要的东西的英文描述。

编辑:

为了消除混淆,让我们分析一下您英文描述的最后一部分的逻辑:

...但仅当 componentType 不等于 x 或 y 时。

陈述同一件事的另一种方式是“componentType 既不是 x 也不是 y”。为了将它翻译成代码,我们应该更进一步,将这个条件改写为“不是 componentType 是 x 或 comonentType 是 y”。这个最终版本表明正确的布尔公式是

!(A || B)

这与您的原始代码非常不同,其形式为

!A || !B

请注意,我最后的改写更加冗长,但多余的措辞使逻辑更加清晰。

分析逻辑的另一种方法是查看您提供的代码:

!"x".equals(componentType) || !"y".equals(componentType)

让我们看几个例子:

  1. "x".equals(componentType) is true. This means the negation is false. It also means that "y".equals(componentType)` 是假的,它的否定是真的。因此,您的代码计算结果为 true。

  2. "y".equals(componentType) is true. This means the negation is false. It also means that "x".equals(componentType)` 是假的,它的否定是真的。因此,您的代码计算结果为 true。

  3. "x".equals(componentType) nor "y".equals(componentType) 都不是真的。这意味着两个否定都是错误的,并且您的代码评估为错误。

请注意,您的代码在 1. 和 2 两种情况下都为 true。这与您的英文描述所期望的结果不同。

于 2013-01-10T21:36:17.983 回答
0

您的“x”条件之前有一个不应该存在的“(”。然后从整个if语句的末尾删除其中一个。您应该将那些属于一起的条件包装在“()”中,因为它令人困惑哎呀,这样读。

if ((cursorCount > 1 && !"x".equals(componentType)) || (!"y".equals(componentType)))

于 2013-01-10T21:39:13.550 回答
0
if ((cursorCount > 1 && !"x".equals(componentType)) 
|| (cursorCount > 1 && !"y".equals(componentType))) 
  message.append("s");

或者你可以嵌套它们,如果它更容易的话

if (cursorCount > 1)
  if (componentType!="y" || componentType!="x")
    message.append("s"); 

这将使其更容易理解并且减少谬误。

于 2013-01-10T21:41:21.850 回答