Есть ли метод Scala API для преобразования Seq [Option [T]] -> Seq [T]
?
Вы можете сделать это вручную с помощью:
seq.filter(_.isDefined).map(_.get)
Интересно, есть ли метод, который делает вышеупомянутое в общем API. импорт java.util.Scanner; открытый класс ConsoleReader {Scanner reader; public ConsoleReader () {...
Итак, я застрял с этим фрагментом кода:
import java.util.InputMismatchException;
import java.util.Scanner;
public class ConsoleReader {
Scanner reader;
public ConsoleReader() {
reader = new Scanner(System.in);
//reader.useDelimiter(System.getProperty("line.separator"));
}
public int readInt(String msg) {
int num = 0;
boolean loop = true;
while (loop) {
try {
System.out.println(msg);
num = reader.nextInt();
loop = false;
} catch (InputMismatchException e) {
System.out.println("Invalid value!");
}
}
return num;
}
}
и вот мой вывод:
Вставьте целое число:
Неверное значение!
Вставьте целое число:
Неверное значение!
...
Согласно javadoc для сканера:
Когда сканер выдает InputMismatchException, сканер не будет передавать токен, который вызвал исключением, так что это может быть извлечены или пропущены через какой-либо другой метод.
Это означает, что если следующий токен не является int
, он выдает InputMismatchException
, но токен остается там. Таким образом, на следующей итерации цикла reader.nextInt()
снова считывает тот же токен и снова генерирует исключение. Что вам нужно, так это использовать его. Добавьте reader.next()
внутри вашего catch
, чтобы использовать токен, который недействителен и должен быть отброшен.
...
} catch (InputMismatchException e) {
System.out.println("Invalid value!");
reader.next(); // this consumes the invalid token
}
Вы также можете попробовать это:
public int readInt(String msg) {
int num = 0;
try {
System.out.println(msg);
num = (new Scanner(System.in)).nextInt();
} catch (InputMismatchException e) {
System.out.println("Invalid value!");
num = readInt(msg);
}
return num;
}
Я бы читал всю строку с помощью Scanner.nextLine(). Затем создайте еще один сканер, который считывает возвращенную строку.
String line = reader.nextLine();
Scanner sc = new Scanner(line);
Это сделало бы ваш пример примерно таким:
public int readInt(String msg) {
int num = 0;
boolean loop = true;
while (loop) {
try {
System.out.println(msg);
String line = reader.nextLine();
Scanner sc = new Scanner(line);
num = sc.nextInt();
loop = false;
} catch (InputMismatchException e) {
System.out.println("Invalid value!");
}
}
return num;
}
Таким образом, у вас есть один сканер, который получает ввод, и другой, который проверяет его, поэтому вам не нужно беспокоиться о читателе, заботящемся о том, чтобы он ввел правильную форму ввода. .
Защитой вашего while-do является переменная 'loop'.
Само исключение выдается до того, как ваш код достигает цикла присваивания = false; Чтобы быть точным, исключение выдается в предыдущем операторе, который равен num = reader.nextInt();
Когда выдается исключение, значение переменной 'loop' равно 'true', но ваш код переходит к блоку catch, а затем повторяет цикл while. -делать. Это while-do никогда не остановится, потому что следующая итерация снова вызовет исключение, снова перейдет к блоку catch и так далее.
Чтобы прервать этот while-do, вам нужно защитить свой while-do другой логической вещью, такой как:
Это можно сделать в блок catch или некоторые другие строки. Но точное решение зависит от ваших спецификаций.