Scanner. Как из System.in пропустить ввод начинающийся с букв, а читать ввод начинающийся с цифр?

121
09 апреля 2021, 03:50

В System.in для Scanner ввожу данные через Enter: 1 2 3 a1 4. Хочу получить сумму чисел, т.е. 10. Слово "а1" нужно игнорировать. Как это сделать, к тому же без обработки исключений?

Answer 1
double sum = Stream.of(new Scanner(System.in).nextLine().split("\\s+")).filter(s -> {
            try { 
                Double.parseDouble(s); 
                return true; 
            } catch (Exception e) { 
                return false; 
            }
        }).mapToDouble(Double::valueOf).sum();

1) Считываем строчку new Scanner(System.in).nextLine();
2) Разделяем её по пробелам и превращаем в массив split("\\s+").
3) Создаём стрим Stream.of().
4) Отсеиваем строки, которые не представляют из себя числа filter().
5) Превращаем каждый элемент стрима в число и меняем тип стрима, чтобы можно было найти его сумму mapToDouble(Double::valueOf).
6) Получаем сумму всех элементов стрима sum().

Если уж вы хотите без исключений в методе filter(), его можно записать так:

.filter(s -> s.matches("[-+]?\\d+(?:\\.\\d+)?(?:[eE][-+]?\\d+)?"))

Есть и другой вариант:

Pattern pattern = Pattern.compile("(?<!\\S)[-+]?\\d+(?:\\.\\d+)?(?:[eE][-+]?\\d+)?(?!\\S)");
Matcher matcher = pattern.matcher(new Scanner(System.in).nextLine());
double sum = 0;
while(matcher.find())
    sum += Double.parseDouble(matcher.group());

Здесь с помощью регулярного выражения из строки ищутся числовые подстроки.

Хотя самым простым и быстрым вариантом будет такой:

double sum = 0;
for (String s : new Scanner(System.in).nextLine().split("\\s+"))
    try {
        sum += Double.parseDouble(s);
    } catch (Exception ignored) {}

Но вы почему-то не хотите обрабатывать исключения, хотя в принципе они здесь и не обрабатываются, они игнорируются, но это, скорее, придирка к словам.

Ну можно ещё каким-то таким способом сделать, но это никуда не годится, потому что надо в конце break писать.

Scanner scanner = new Scanner(System.in);
double sum = 0;
while(true) {
    String s = scanner.next();
    if(s.equals("break"))
        break;
    if(s.matches("[-+]?\\d+(.\\d+)?([eE][-+]?\\d+)?"))
        sum += Double.parseDouble(s);
}
System.out.println(sum);
READ ALSO
Logcat: Unknown bits set in runtime_flags: 0x8000 Что вызывает?

Logcat: Unknown bits set in runtime_flags: 0x8000 Что вызывает?

8559-8559/? E/appnameexample: Unknown bits set in runtime_flags: 0x8000

119
(java.io.IOException) Функция не реализована. Please perform full project rebuild (Build | Rebuild Project)

(java.io.IOException) Функция не реализована. Please perform full project rebuild (Build | Rebuild Project)

Только установил Idea в Ubuntu при запуске любого main

113
Как обратиться к вложенному span и передать его значение в переменную?

Как обратиться к вложенному span и передать его значение в переменную?

Нужно обратиться к вложенному тегу <span>, чтобы передать значение (в данном случае 2940 руб), вот разметка:

89
JS после import не вызывается функция

JS после import не вызывается функция

Всем добрый день! Столкнулся вот с такой вещью как модулиЕсть импорт:

79