提供非布尔值的循环条件
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 不接受循环条件中的非布尔表达式。但是如果没有 n 和 i,我该怎么做呢? 例如,类似:
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 < 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?以上是关于提供非布尔值的循环条件的主要内容,如果未能解决你的问题,请参考以下文章