Есть ли в Scala метод API, который преобразует Seq [Option [T]] в Seq [T]?

Есть ли метод 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;
    }
}

и вот мой вывод:

Вставьте целое число:
Неверное значение!
Вставьте целое число:
Неверное значение!
...

34
задан gparyani 19 April 2019 в 07:19
поделиться

4 ответа

Согласно javadoc для сканера:

Когда сканер выдает InputMismatchException, сканер не будет передавать токен, который вызвал исключением, так что это может быть извлечены или пропущены через какой-либо другой метод.

Это означает, что если следующий токен не является int, он выдает InputMismatchException, но токен остается там. Таким образом, на следующей итерации цикла reader.nextInt() снова считывает тот же токен и снова генерирует исключение. Что вам нужно, так это использовать его. Добавьте reader.next() внутри вашего catch, чтобы использовать токен, который недействителен и должен быть отброшен.

...
} catch (InputMismatchException e) {
    System.out.println("Invalid value!");
    reader.next(); // this consumes the invalid token
} 
58
ответ дан 27 November 2019 в 16:51
поделиться

Вы также можете попробовать это:

   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;
    }
0
ответ дан 27 November 2019 в 16:51
поделиться

Я бы читал всю строку с помощью 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;
    }

Таким образом, у вас есть один сканер, который получает ввод, и другой, который проверяет его, поэтому вам не нужно беспокоиться о читателе, заботящемся о том, чтобы он ввел правильную форму ввода. .

0
ответ дан 27 November 2019 в 16:51
поделиться

Защитой вашего while-do является переменная 'loop'.

Само исключение выдается до того, как ваш код достигает цикла присваивания = false; Чтобы быть точным, исключение выдается в предыдущем операторе, который равен num = reader.nextInt();

Когда выдается исключение, значение переменной 'loop' равно 'true', но ваш код переходит к блоку catch, а затем повторяет цикл while. -делать. Это while-do никогда не остановится, потому что следующая итерация снова вызовет исключение, снова перейдет к блоку catch и так далее.

Чтобы прервать этот while-do, вам нужно защитить свой while-do другой логической вещью, такой как:

  1. Выйти, когда читатель получит символ, отличный от int
  2. Выйти, когда EOF

Это можно сделать в блок catch или некоторые другие строки. Но точное решение зависит от ваших спецификаций.

0
ответ дан 27 November 2019 в 16:51
поделиться
Другие вопросы по тегам:

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