首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从while循环转到if语句

问从while循环转到if语句
EN

Stack Overflow用户
提问于 2017-09-20 22:47:06
回答 3查看 496关注 0票数 0

假设我希望这个代码让用户从三种动物(狗、猫、猪)中挑选一只,然后让计算机回复它发出的任何声音(即“狗”-> "woof")。但是,我希望能够阻止用户输入任何不是狗、猫或猪的其他动物,使用while语句。

当我这样做时,while语句会运行并循环,但是如果输入“狗”,它仍然会打印“那不是一个有效的动物”,当我希望它移到它下面的if语句时。是什么引起的?

代码语言:javascript
复制
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")
        }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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不等于动物”,因此您可以将其写为:

代码语言:javascript
复制
while( !( animal.equalsIgnoreCase("dog") || animal.equalsIgnoreCase("cat") || animal.equalsIgnoreCase("pig") ))
票数 0
EN

Stack Overflow用户

发布于 2017-09-20 23:16:36

让我们来看看这个逻辑

代码语言:javascript
复制
!animal.equalsIgnoreCase("dog") || !animal.equalsIgnoreCase("cat")

这可以表示为NOT(dog) OR NOT(cat)

嗯,如果它是一只狗,它不是一只猫。这使这一说法成为事实。反之亦然。

这句话也是正确的,如果你键入任何东西,因为它不是狗或猫。

相反,您想要编写NOT (dog OR cat)或NOT(dog) AND NOT(cat)

或者,您可以使用while(true)

代码语言:javascript
复制
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.");
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-09-20 23:24:21

我将创建一组可接受的值,这样就可以轻松地添加更多的动物,而不必向while循环中添加更多的逻辑语句。

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46332829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档