Коректно ли я написал код?

Есть задача, из строки извлеч числа, а потом их сложить.

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

Если стоит задача "извлечь" числа из строки, и сложить их, это можно сделать несколькими способами:

  1. Разбить исходную строку по "нецифрам", используя 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

Однако при этом способе будут складываться любые числа, даже если они перемешаны с буквами, т.е. "входят" в слова. Также числа будут складываться без учёта размерностей.

  1. Составить регулярное выражение для подбора нужных чисел (вероятно с указанием размерности, в данном случае рублей): \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();        
}
→ Ссылка