Как посчитать числа из строки на Java?

Рейтинг: -1Ответов: 2Опубликовано: 04.04.2023

Подскажите, как посчитать числа из строки?

public class ParseIntegers {

private static final List<String> WORDS = Arrays.asList(
                    "JDK 17 has released on 14 September 2021 with 10 new features, 2 feature 
                     removals and 2 feature deprecations.".split(" "));

    public static void main(String[] args) {
        Iterator<String> words = WORDS.iterator();
        int sum = 0;
        System.out.println("Sum is " + sum);
    }
}

Ответы

▲ 1Принят

Просто до кучи добавлю вариант, который скорее всего будет самый быстрый по скорости и оптимальный по памяти.

Можно просто идти по строке и собирать число на лету, как только собрано - добавлять в сумму. Код:

private static int getSum(String str) {
    int ind = 0;
    int sum = 0;
    while (ind < str.length()) {
        int num = 0;
        while (ind < str.length() && !Character.isDigit(str.charAt(ind))) ind++;
        while (ind < str.length() && Character.isDigit(str.charAt(ind))) {
            num *= 10;
            num += str.charAt(ind) - '0';
            ind++;
        }
        sum += num;
    }
    return sum;
}

Проверка

String string = "JDK 17 has released on 14 September 2021 with 10 new features, 2 feature removals and 2 feature deprecations.";
System.out.println(getSum(string));

Вывод

2066
▲ 1

Насколько я понял, вам нужно посчитать сумму чисел, имеющихся в строке. Прежде всего, это можно сделать, даже не превращая строку в массив строк, а просто используя Scanner для исходной строки:

String string = "JDK 17 has released on 14 September 2021 with 10 new features, 2 feature removals and 2 feature deprecations.";
Scanner scanner = new Scanner(string);
scanner.useDelimiter("\\s");
int sum = 0;
while (scanner.hasNext()) {
    if (scanner.hasNextInt()) {
        sum += scanner.nextInt();
    } else {
        scanner.next();
    }
}
System.out.println(sum);

Если всё же оперировать массивом строк, то нам понадобится метод Integer::parseInt.
Вот вариант с прохождением по массиву строк "вручную" и с использованием регулярных выражений для проверки того, является ли очередная строка правильным числом, чтобы метод не бросал исключений:

int sum = 0;
for (String word : WORDS) {
    if (word.matches("\\d+")) {
        sum += Integer.parseInt(word);
    }
}
System.out.println(sum);

Однако самый короткий вариант - подключить к этому делу Stream API:

int sum = WORDS.stream()
           .filter(word -> word.matches("\\d+"))
           .mapToInt(Integer::parseInt)
           .sum();
System.out.println(sum);

Во всех трёх случаях результат:

2066