JAVA программа продолжает блокировать терминал для ввода, даже если он не должен принимать ввод

Как насчет этого, если вам не нужны маски с одинаковым количеством символов исходных строк (что более анонимно):

(?<=^.)[^@]*|(?<=@.).*(?=\.[^.]+$)

Например, если вы замените совпадения на ***, результатом будет:

j***@e***.com
0
задан Little_idiot 22 March 2019 в 16:36
поделиться

2 ответа

В первом случае вы выполняете in.read() вне цикла. Во втором случае вы получаете in.read() внутри выполнения цикла.

Помните, что условие цикла вычисляется на каждой итерации, поэтому вы выполняете doinb in.read на каждой итерации.

Может быть, вы хотели это сделать

for(int t=0,tests=<Integer.parseInt(in.readLine());t<tests;t++) {body}

?

0
ответ дан Antoniossss 22 March 2019 в 16:36
поделиться

Согласно Спецификации языка Java :

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. Итерация для оператора

& nbsp; & nbsp; & nbsp; & nbsp; Затем выполняется шаг для итерации, как показано ниже:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; это оценивается. Если результат имеет тип Boolean, он подлежит распаковке без преобразования (§5.1.8).

Другими словами, t < Integer.parseInt(in.readLine()) выполняется один раз за каждую итерацию цикла.

Это лучше объяснено в Java Tutorial :

Оператор for обеспечивает компактный способ итерации по диапазону значений. Программисты часто называют его «циклом for» из-за того, как он многократно повторяется, пока не будет выполнено определенное условие. Общая форма оператора for может быть выражена следующим образом:

for (initialization; termination; increment) {
    statement(s) }

При использовании этой версии оператора for имейте в виду, что:

  • Выражение инициализации инициализирует петля; выполняется один раз, когда начинается цикл.
  • Когда выражение завершения оценивается как ложное, цикл завершается.
  • Выражение приращения вызывается после каждой итерации цикла ; для этого выражения вполне приемлемо увеличивать или уменьшать значение.

Если вы хотите что-то похожее на 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);
});
0
ответ дан Behrang 22 March 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: