这个逻辑语句(Android)出了什么问题?

时间:2013-01-10 21:33:57

标签: android logic

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

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

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

似乎适用于y但不是x有趣的案例。

Confused.com! :)

3 个答案:

答案 0 :(得分:5)

尝试

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

等效地你可以做

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

这来自deMorgan定律适用于你的逻辑。

我相信这些更接近你对你想要的英语描述。

修改

为了消除困惑,让我们分析一下你英文描述的最后部分的逻辑:

  

...但仅当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)`为false,它的否定为真。因此,您的代码评估为true。

  2. "y".equals(componentType) is true. This means the negation is false. It also means that“x”.equals(componentType)`为false,它的否定为true。因此,您的代码评估为true。

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

  4. 请注意,在两种情况下,您的代码的评估结果为真1.和2.这不会提供与您的英语说明相同的结果。

答案 1 :(得分:0)

你有一个'('在你的“x”条件之前不应该存在。然后从整个if语句的末尾删除其中一个。你应该将那些属于一起的条件包装在“ ()“因为这样读起来很混乱。

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

答案 2 :(得分: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"); 

这样可以更容易理解并减少谬误。