【问题标题】:Provide loop conditions that are not Boolean提供非布尔值的循环条件
【发布时间】:2018-01-24 07:57:50
【问题描述】:

我需要接受一些我使用 for 循环的正整数,如下所示:

Scanner in = new Scanner(System.in);
for(int i=0; i<n; i++) { 
    num = in.nextInt(); 
    //do something with num
}

这需要我 (a) 事先知道整数的数量 n (b) 使用计数器 i

我知道 Java 不接受循环条件中的非布尔表达式。但是如果没有 ni,我该怎么做呢? 例如,类似:

while( (num = in.nextInt()) ) {
   //do something with num
}

任何类型的循环(for/while/do-while)都可以。

【问题讨论】:

  • 您希望停止条件是什么(即循环何时终止)?
  • 所有循环条件都是布尔值。要么停止,要么不停止循环。
  • 您可以使用 in.nextLine() 将一行读取为字符串,检查该字符串是否为“退出”或类似的内容,然后退出循环,否则将该字符串解析为整数并继续处理你的号码。
  • 希望对您有所帮助.. stackoverflow.com/questions/19950713/…
  • @NoEm - 如果您只对整数感兴趣,使用 in.hasNextInt() 作为条件会在 ANY 非整数输入时自动终止。看我的回答:)

标签: java loops boolean conditional java.util.scanner


【解决方案1】:

你可以做的事情是这样的:

boolean loop = true;
while (loop) {
  int num = in.nextInt();
  ... do something with n
  if (whatever) loop = false;
}

例如。

或者您将while (true)if (whatever) break 一起使用。

换句话说:您需要一个布尔条件,但您可以在循环体中控制该条件,如上所示。

【讨论】:

  • 此方法有效,但我想尽量减少 LOC 和变量的使用。您的解决方案需要跟踪布尔“循环”以及比较(即“如果”)。在具有多个循环的较大代码中,我要么必须使用相同的控制变量“循环”(这样可以节省空间但难以跟踪),要么使用多个变量。
  • 在较大的代码中......您遵循干净的代码原则,例如“单层抽象”。您只需从不编写包含多个循环的方法。就是这么简单。换句话说:当你真的对编写漂亮的、人类可读的干净代码感兴趣时......那么你担心的不仅仅是简单的循环条件。
  • 我明白你的意思。我将研究“单层抽象”原则。实际上我已经习惯了 C/C++ 并且想知道如何绕过 Java 的“int is not boolean”功能(请参阅我对 TwoThe 答案的评论)。谢谢!
  • @agentK 欢迎您。但请理解,这不仅仅是一个原则。当你认真对待这一点时,给自己买一本罗伯特马丁的“清洁代码”。并且愿意花很多时间思考这个话题。这需要几个月的练习才能完全掌握。
  • @agentK 我注意到你只能接受到目前为止。让您也可以投票 - 这样您就可以对所有您认为有帮助的帖子表示感谢。
【解决方案2】:

循环直到输入结束 -or- 非整数输入(例如“exit”,空白行):

while(in.hasNextInt()) {
    int num = in.nextInt();
}

如果您在 IntelliJ 中进行测试并想明确指出 EOF:Ctrl+D or ⌘+D
如果您想读取文件作为输入:java MyClass &lt; numbers.txt

【讨论】:

    【解决方案3】:

    这是一个如何使用扫描器类的示例:https://www.tutorialspoint.com/java/util/scanner_nextint.htm

    您应该使用hasNext() 方法结束循环并使用hasNextInt() 方法检查整数:

    public class ScannerDemo {
       public static void main(String[] args) {
           String s = "Hello World! 3 + 3.0 = 6.0 true ";
    
           // create a new scanner with the specified String Object
           Scanner scanner = new Scanner(s);
    
           // find the next int token and print it
           // loop for the whole scanner
           while (scanner.hasNext()) {
    
               // if the next is a int, print found and the int
               if (scanner.hasNextInt()) {
                   System.out.println("Found :" + scanner.nextInt());
               }
    
               // if no int is found, print "Not Found:" and the token
               System.out.println("Not Found :" + scanner.next());
           }
    
           // close the scanner
           scanner.close();
       }
    }
    

    【讨论】:

      【解决方案4】:

      我知道 Java 不接受循环条件中的非布尔表达式。

      据我所知,没有任何编程语言允许这样做。循环要么继续,要么不继续,这是一个布尔决定,需要一个布尔条件。没有“循环可能会继续,我们不知道”。

      既然如此,Java - 当然 - 需要一个布尔条件来继续或不继续。您需要回答的问题是:循环何时终止?

      共有三个选项:

      循环永远继续

      while (true) 
      

      循环在一个特殊的输入值处停止

      while ((num = in.readInt()) != 0)
      

      循环从外部中断

      while (running) {
        // ...
      }
      
      public void stopLoop() { 
        running= false; 
      }
      

      【讨论】:

      • 在 C 中 while ( (num = ...) ) 不会引发编译错误,并且会被解释为布尔值。我认为这就是 OP 所说的非布尔值......
      • 这是因为在 C 中 0 被认为是 false 这与选项 2 完全相同。
      • 是的,但在这种情况下,num 的类型为 int,对于 java “不是布尔值”
      • @TwoThe 恐怕我没有很好地理解我的观点。我想简化我的代码。正如 m13r 所说,C 允许 while ( num=in.nextInt() ),但 Java 不允许,因为“int”在 Java 中不是“布尔值”。 hasNextInt() 解决了这个问题。
      • System.in 上的 Scanner 的 hasNextInt() 何时返回 false?
      猜你喜欢
      • 2016-01-14
      • 1970-01-01
      • 2013-05-15
      • 2019-03-01
      • 2021-07-10
      • 2011-08-01
      • 2018-12-13
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多