Коректно ли я написал код?
Есть задача, из строки извлеч числа, а потом их сложить.
public class Loader {
public static void main(String[] args)
{
String text = "Вася заработал 5000 рублей, Петя - 7563 рубля, а Маша - 30000 рублей";
int spaceIndex = text.indexOf('5');
int spaceIndex1 = text.indexOf('7');
int spaceIndex2 = text.indexOf("30");
String num1 = text.substring(15,19);
String num2 = text.substring(35,39);
String num3 = text.substring(56,61);
int firstNum = Integer.parseInt(num1);
int secondNum = Integer.parseInt(num2);
int thirdNum = Integer.parseInt(num3);
int sum = firstNum + thirdNum;
System.out.println(sum);
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
}
}
Ответы (2 шт):
Автор решения: Дмитрий
→ Ссылка
Как по мне, это вообще не решение. Любое изменение исходной строки приводит к исключению, а какой смысл писать программу, которая может сложить только этих конкретных 3 числа только в этой конкретной строке? Сложите их на калькуляторе.
private final static Pattern pattern = Pattern.compile("[0-9]+");
public static void main(String[] args) {
String text = "Вася заработал 5000 рублей, Петя - 7563 рубля, а Маша - 30000 рублей";
List<Integer> allNumbers = findAllNumbers(text);
int sum = allNumbers.stream().mapToInt(v->v).sum();
System.out.println(sum);
allNumbers.forEach(System.out::println);
}
private static List<Integer> findAllNumbers(String text) {
Matcher matcher = pattern.matcher(text);
List<Integer> numbers = new ArrayList<>();
while (matcher.find()) numbers.add(Integer.valueOf(matcher.group()));
return numbers;
}
Автор решения: Nowhere Man
→ Ссылка
Если стоит задача "извлечь" числа из строки, и сложить их, это можно сделать несколькими способами:
- Разбить исходную строку по "нецифрам", используя
String::split, при этом нужно отфильтровать возможные пустые строки:
public static int sum(String str) {
return Arrays.stream(str.split("\\D+")) // Stream<String>
.filter(s -> !s.isEmpty()) // убрать пустые строки
.mapToInt(Integer::parseInt) // IntStream
.sum();
}
System.out.println(sum("Вася заработал 5000 рублей, Петя - 7563 рубля, а Маша - 30000 рублей"));
// -> 42563
Однако при этом способе будут складываться любые числа, даже если они перемешаны с буквами, т.е. "входят" в слова. Также числа будут складываться без учёта размерностей.
- Составить регулярное выражение для подбора нужных чисел (вероятно с указанием размерности, в данном случае рублей):
\b(\d+)\s+руб
Затем следует использовать метод Matcher::results, возвращающий поток совпадений Stream<MatchResult>.
public static int sum(String str) {
return Pattern.compile("\\b(\\d+)\\s+руб")
.matcher(str)
.results()
.map(mr -> mr.group(1)) // взять содержимое группы 1: \d+
.mapToInt(Integer::parseInt)
.sum();
}