提供非布尔值的循环条件

Posted

技术标签:

【中文标题】提供非布尔值的循环条件【英文标题】: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() 将一行读取为字符串,检查该字符串是否为“退出”或类似的内容,然后退出循环,否则将该字符串解析为整数并继续处理你的号码。 希望对您有所帮助.. ***.com/questions/19950713/… @NoEm - 如果您只对整数感兴趣,使用 in.hasNextInt() 作为条件会在 ANY 非整数输入时自动终止。看我的回答:) 【参考方案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?

以上是关于提供非布尔值的循环条件的主要内容,如果未能解决你的问题,请参考以下文章

自动类型转换

02 条件

Python第七天_布尔值的应用

布尔&list与条件循环语句与trutle

Python条件布尔值[重复]

Django 通过匹配布尔值进行条件查询