Search code examples
javaregexstringjava-stream

Codingbat challenge: sumNumbers Stream API Solution


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 if a char is one of the chars 0, 1, ..., 9. Integer.parseInt(string) converts a string to an int.)

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 ?


Solution

  • 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())));
    }
    

    Output

    123
    44
    18
    

    Here is a link to test the code with the expected output:

    https://www.jdoodle.com/iembed/v0/rRS