Как посчитать числа из строки на Java?
Подскажите, как посчитать числа из строки?
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);
}
}
Ответы (2 шт):
Насколько я понял, вам нужно посчитать сумму чисел, имеющихся в строке. Прежде всего, это можно сделать, даже не превращая строку в массив строк, а просто используя 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
Просто до кучи добавлю вариант, который скорее всего будет самый быстрый по скорости и оптимальный по памяти.
Можно просто идти по строке и собирать число на лету, как только собрано - добавлять в сумму. Код:
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