假设我希望这个代码让用户从三种动物(狗、猫、猪)中挑选一只,然后让计算机回复它发出的任何声音(即“狗”-> "woof")。但是,我希望能够阻止用户输入任何不是狗、猫或猪的其他动物,使用while语句。
当我这样做时,while语句会运行并循环,但是如果输入“狗”,它仍然会打印“那不是一个有效的动物”,当我希望它移到它下面的if语句时。是什么引起的?
String animal = keyboard.nextLine();
while (!animal.equalsIgnoreCase("dog")||!animal.equalsIgnoreCase("cat")||!animal.equalsIgnoreCase("pig")) {
System.out.println("That isn't a valid animal.");
animal = keyboard.nextLine();
}
if (animal.equals("dog"){
System.out.println("Woof")
}发布于 2017-09-20 23:11:37
!animal.equalsIgnoreCase("dog")的意思是“动物不等于dog”。输入dog时,这个条件是false,因为动物等于dog。
||算子是一个短路算子,这意味着只有当我们无法从左侧到达答案时,才会对右侧进行评估。所以当左边是true (动物不相等的dog)时,我们可以停在那里。但当左侧为false (动物等于dog)时,我们需要检查下一个条件,以确定是否为真。在你的例子中,那是“动物不等于cat”。因为dog不等于cat,所以这是真的,您的代码输出了"That isn't a valid animal."
最简单的解决方法是将||更改为&&,但真正的问题是!a && !b是违反直觉的。您的条件是“dog、cat或pig不等于动物”,因此您可以将其写为:
while( !( animal.equalsIgnoreCase("dog") || animal.equalsIgnoreCase("cat") || animal.equalsIgnoreCase("pig") ))发布于 2017-09-20 23:16:36
让我们来看看这个逻辑
!animal.equalsIgnoreCase("dog") || !animal.equalsIgnoreCase("cat")这可以表示为NOT(dog) OR NOT(cat)
嗯,如果它是一只狗,它不是一只猫。这使这一说法成为事实。反之亦然。
这句话也是正确的,如果你键入任何东西,因为它不是狗或猫。
相反,您想要编写NOT (dog OR cat)或NOT(dog) AND NOT(cat)
或者,您可以使用while(true)
while (true) {
String animal = keyboard.nextLine();
switch (animal) {
case "dog":
System.out.println("Woof");
break;
case "cat":
break;
default:
System.out.println("That isn't a valid animal.");
}
}发布于 2017-09-20 23:24:21
我将创建一组可接受的值,这样就可以轻松地添加更多的动物,而不必向while循环中添加更多的逻辑语句。
HashSet<String> validAnimals = new HashSet<>();
validAnimals.add("dog");
validAnimals.add("cat");
validAnimals.add("pig");
//easy to add more valid animals
String input = keyboard.nextLine();
//only have to call contains() on the set
while(!validAnimals.contains(input.toLowerCase()))
{
System.out.println("That isn't a valid animal.");
input = keyboard.nextLine();
}https://stackoverflow.com/questions/46332829
复制相似问题