В System.in для Scanner ввожу данные через Enter: 1 2 3 a1 4. Хочу получить сумму чисел, т.е. 10. Слово "а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);
Продвижение своими сайтами как стратегия роста и независимости