使用NOT .equalsIgnoreCase()的JAVA循环逻辑错误

时间:2013-07-28 20:04:39

标签: java boolean-logic

我正在尝试在while循环中使用equalsIgnoreCase()来尝试检查是否使用NOT(!)运算符写了除写入内容以外的内容。例如:

String temp="A";
boolean x =(!temp.equalsIgnoreCase("a")) ;

看,这适用于while循环。如果它不是A,它将继续循环,但下一行不会

boolean x =(!temp.equalsIgnoreCase("a") || !temp.equalsIgnoreCase("b")) ;

这似乎不再起作用了。无论您输入什么内容,即使它是a或b,也会返回true。因此,当我使用整行代码来检查任何不应该使用的字母时:

while (!temp.equalsIgnoreCase("A") || !(temp.equalsIgnoreCase("B")) ||!temp.equalsIgnoreCase("D")|| !temp.equalsIgnoreCase("P") || !temp.equalsIgnoreCase("S"))
{ ***Do Code***}

它会循环播放任何内容,即使它等于其中一个字母。

如果有多个!temp.equalsIngnoreCase,则代码不能与OR(||)一起使用。

我能让它工作的唯一方法是将OR更改为AND

while (!temp.equalsIgnoreCase("A") && !(temp.equalsIgnoreCase("B")) && !temp.equalsIgnoreCase("D")&& !temp.equalsIgnoreCase("P") && !temp.equalsIgnoreCase("S"))

即使我似乎找到了一个解决方案,我仍然不明白为什么OR不起作用但是确实如此。我删除了NOT以查看是否一切正常,当输入其中一个字母时,它似乎完全循环。

4 个答案:

答案 0 :(得分:3)

  

它会循环播放任何内容,即使它等于其中一个字母。

是的,当然可以。

你要求它继续前进,而不是A 它不是B。那么 AB BA都没有任何内容......如果值等于A那么它就不会等于B所以第一个操作数将保持循环。如果该值等于A,那么它将不等于B,因此第二个操作数将保持循环继续。

您更改为AND的解决方案是正确的 - 您希望值不是while (! (temp.equalsIgnoredCase("A") || temp.equalsIgnoreCase("B") || ...)) 不是{{1}}(即它既不是A 也不是 B)。

或者,你可以在内部使用OR,但在整个事情上放一个NOT:

{{1}}

答案 1 :(得分:2)

  

我仍然不明白为什么OR不起作用但是确实

temp 的任何给定值下,使用||的表达式始终为 true 。因为, temp 不能同时是ab。如果是a,则||的第二部分将为真,如果它等于b或任何其他值,则第一部分将是 true ,因此在两种情况下都使整个表达式为真

使用&&,如果 temp 既不是while也不是true,则a将只有b。< / p>

或者,如果您要针对许多值测试 temp ,则可以将while条件更改为更简单:

while (!"ABDPS".contains(temp.toUpperCase())) {

}

答案 2 :(得分:1)

这是一个错误的逻辑。代码

(!temp.equalsIgnoreCase("A") || !(temp.equalsIgnoreCase("B")) ||!temp.equalsIgnoreCase("D")|| !temp.equalsIgnoreCase("P") || !temp.equalsIgnoreCase("S"))

装置

如果char不是A,不是B,不是D,不是P,还是不是P.它总是评估为真,因为char是A,它既不是B,D,S也不是P.其他人也一样。

如果你想要它是OR逻辑,它应该是:

(!(temp.equalsIgnoreCase("A") || (temp.equalsIgnoreCase("B")) ||temp.equalsIgnoreCase("D")|| temp.equalsIgnoreCase("P") || temp.equalsIgnoreCase("S")))

这意味着,不是当char是A,B,D,S或P

答案 3 :(得分:0)

这完全是关于逻辑的。

A或B意味着当A为真或B为真或两者都为真时为真。

在你的特殊情况下,你的equalsIgnorecase()中的一个可能只能工作,所以你写了类似于重言式的东西,这意味着无限循环。 你可以在这里阅读boole代数:http://en.wikipedia.org/wiki/Boolean_algebra_%28structure%29

有点理论,但它解释了在编写布尔表达式时需要知道的内容。 希望这会有所帮助:)