所以我调试了问题的根源。基本上,我正在运行一些测试用例,
int no_of_test = Integer.parseInt(in.readLine());
for(int t = 0;t<no_of_test;t++){//do something}`
工作正常。但是,
for(int t=0;t<Integer.parseInt(in.readLine());t++){//do something}
这里,每次迭代后它一直等待输入。
在python中,我可以做for t in range(int(input())
,并且每次迭代后它都不会阻塞输入,为什么在JAVA中不是这样?我想念什么?
答案 0 :(得分:2)
它一直在等待,因为第二条语句是在每次迭代之前都要检查的条件。
for(int t=0; t<Integer.parseInt(in.readLine()); t++)
声明1:在循环开始之前设置一个变量(int t = 0)。
声明2:定义循环运行的条件。如果条件为true,则循环将重新开始;如果条件为false,则循环将结束。
声明3:每次执行循环中的代码块时,都会增加一个值(t ++)。
循环可以结束的唯一情况是,您不输入就会一直等待很长时间,直到您输入一个,所以这是一个永无止境的循环。
如果您仍想结束循环,请输入非数字的内容。
答案 1 :(得分:1)
使用
for(int t=0;t<Integer.parseInt(in.readLine());t++){//do something}
每次迭代都会重新评估Integer.parseInt(in.readLine())
件。
鉴于
int no_of_test = Integer.parseInt(in.readLine());
for(int t = 0;t<no_of_test;t++){//do something}
Integer.parseInt(in.readLine())
仅被评估一次。
答案 2 :(得分:1)
有不同的代码构造。
在Python示例range()
中是函数。它被调用一次并返回整数序列。因此,循环遍历值的序列。
在Java示例t < Integer.parseInt(in.readLine())
中是循环条件,必须为每次迭代检查它。您的python代码的Java类似物可以是:
IntStream.range(0, Integer.parseInt(in.readLine())).forEach((e) -> {
//...
});
答案 3 :(得分:0)
在第一种情况下,您在循环外执行in.read()
在第二种情况下,您在循环执行中获得了in.read()
。
请记住,循环条件是在每次迭代时求值的,因此您在每次迭代时都处于in.read
状态。
也许您想这样做
for(int t=0,tests=<Integer.parseInt(in.readLine());t<tests;t++) {body}
?
答案 4 :(得分:0)
根据Java Language Specification:
BasicForStatement: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement ForStatementNoShortIf: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf ForInit: StatementExpressionList LocalVariableDeclaration ForUpdate: StatementExpressionList StatementExpressionList: StatementExpression StatementExpressionList , StatementExpression
14.14.1.2。 for语句的迭代
接下来,执行for迭代步骤,如下所示:
如果存在表达式,则对其进行评估。如果结果是 类型为Boolean,则需要进行拆箱转换(第5.1.8节)。
换句话说,t < Integer.parseInt(in.readLine())
在循环的每次迭代中执行一次。
在Java Tutorial中有更好的解释:
for语句提供了一种紧凑的方法来迭代一系列 价值观。程序员经常将其称为“ for循环”,因为 重复循环直到特定条件发生的方式 满意。 for语句的一般形式可以表示为 如下:
for (initialization; termination; increment) { statement(s) }
使用此版本的for语句时,请记住:
- 初始化表达式初始化循环;它会在循环开始时执行一次。
- 当终止表达式的计算结果为false时,循环终止。
- 在每次循环迭代之后调用增量表达式;该表达式增加或 递减值。
如果您想要类似于for t in range(int(input())
的内容,则可以使用Streams API:
import static java.lang.Integer.parseInt;
import static java.lang.System.console;
// option 1
try (final BufferedReader console = new
BufferedReader(new InputStreamReader(System.in))) {
IntStream.range(0, parseInt(console.readLine())).forEach(i -> {
System.out.println(i);
});
}
// option 2 (fails in some IDEs as console() will return null)
IntStream.range(0, parseInt(console().readLine())).forEach(i -> {
System.out.println(i);
});