提供非布尔类型的循环条件

3

我需要接受一些正整数,为此我使用以下for循环:

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

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

我知道Java在循环条件中不接受非布尔表达式。但是,如果没有ni,我该如何做到相同的效果? 例如,像这样的东西:

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

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

4
你希望停止条件是什么(即循环应该何时终止)? - Eran
2
所有循环条件都是布尔类型。你要么停止,要么就继续循环。 - Kayaman
你可以使用 in.nextLine() 读取一行字符串,检查该字符串是否为 'exit' 或类似的内容,然后退出循环,否则将该字符串解析为整数并继续处理数字。 - No Em
希望这能对你有所帮助。https://dev59.com/HmIj5IYBdhLWcg3wuXaN - kattoor
1
@NoEm - 如果你只对整数感兴趣,使用in.hasNextInt()作为条件会自动终止任何非整数输入。请看我的答案 :) - charles-allen
4个回答

2
你可以做的事情就是像这样:

您可以做的是:

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

例如。
或者您可以将while (true)if(whatever) break一起使用。
换句话说:您需要一个布尔条件,但是您可以像上面展示的那样在循环体内控制该条件。

这种方法是可行的,但我想尽量减少代码行数和变量使用。你的解决方案需要跟踪布尔值“loop”并进行比较(即“if”语句)。在具有多个循环的大型代码中,我要么必须使用相同的控制变量“loop”(这样可以节省空间,但难以跟踪),要么使用多个变量。 - agentK
在更大的代码中...你遵循干净代码原则,如“单一抽象层”。你绝对不能编写包含多个循环的方法。就这么简单。换句话说:当你真正有兴趣编写漂亮的、易读的干净代码时......那么你会比仅仅关心简单的循环条件要多得多。 - GhostCat
我明白你的意思。我会研究“单一抽象层”原则。实际上,我习惯使用C/C++,想知道如何避开Java的“int不是布尔值”的特性(请参见我对TwoThe答案的评论)。谢谢! - agentK
@agentK 没有问题,但请理解这不仅仅是一个原则。如果你认真对待这个问题,请购买罗伯特·马丁的《代码整洁之道》一书,并愿意花费很多时间思考这个主题。这需要数月的实践才能完全掌握。 - GhostCat
@agentK 我注意到你只能接受到目前为止。我已经启用了点赞功能 - 这样你就可以在所有你认为有帮助的帖子上表达感激之情了。 - GhostCat

1

循环直到输入结束-或-非整数输入(例如“退出”,空行):

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

如果您在IntelliJ中进行测试并想明确指示EOF:Ctrl+D或⌘+D
如果您想将文件作为输入读取:java MyClass < numbers.txt

0

这里有一个使用Scanner类的示例: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();
   }
}

0
我知道Java不允许在循环条件中使用非布尔表达式。 据我所知,没有编程语言允许这样做。循环要么继续,要么停止,这是一个布尔决策,并且需要一个布尔条件。不存在“循环可能继续,我们不知道”的情况。
话虽如此,Java当然要求使用布尔条件来继续或停止循环。你需要回答的问题是:循环何时终止?
有三个选项: 循环永远继续
while (true) 

循环在特定的输入值处停止

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

循环被外部中断

while (running) {
  // ...
}

public void stopLoop() { 
  running= false; 
}

在C语言中,while ( (num = ...) )不会引发编译错误,并且会被解释为布尔类型。我认为这就是OP所说的非布尔类型的意思... - m13r
这是因为在 C 语言中,0 被视为 false。这与选项2完全相同。 - TwoThe
是的,但在这种情况下num的类型为int,而对于Java来说,“不是布尔值”。 - m13r
@TwoThe,恐怕我没有很好地表达我的观点。我想简化我的代码。正如m13r所说,C允许while ( num=in.nextInt() ),但Java不允许,因为在Java中'int'不是'boolean'。hasNextInt()解决了这个问题。 - agentK
1
一个Scanner在System.in上调用hasNextInt()方法返回false的时候是什么情况? - TwoThe
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接