Given the task sumNumbers from CodingBat:
Given a string, return the sum of the numbers appearing in the string, ignoring all other characters. A number is a series of
1
or more digit chars in a row.(Note:
Character.isDigit(char)
tests ifa
char is one of the chars0
,1
, ...,9
.Integer.parseInt(string)
convertsa
string to anint
.)
sumNumbers("abc123xyz") → 123
sumNumbers("aa11b33") → 44
sumNumbers("7 11") → 18
My solution to this problem is the following:
public int sumNumbers(String str) {
int sum = 0;
java.util.regex.Matcher matcher = java.util.regex.Pattern.compile("[0-9]+").matcher(str);
while (matcher.find()) {
sum += Integer.parseInt(matcher.group());
}
return sum;
}
Is it possible to solve this problem using Stream API ?
To keep the stream implementation closer to your original solution you could still employ a Pattern
and Matcher
and then stream the Matcher
's results.
public int sumNumbers(String s) {
return Pattern.compile("\\d+").matcher(s).results()
.collect(Collectors.summingInt(m -> Integer.valueOf(m.group())));
}
123
44
18
Here is a link to test the code with the expected output: