Как суммировать цифры в строке до заданного индекса c функциональным способом - PullRequest
1 голос
/ 03 мая 2020

Я хочу суммировать цифры, например, от. String как "153" до индекса 2 и получения результата 6 из-за 1 + 5 = 6. Как обычно, я бы использовал решение classi c l oop, например, с проверкой, является ли текущий индекс ниже 2:

static int sum(String s){
       int sum = 0;
        for(int i = 0; i < s.length() ; i++){
            if( Character.isDigit(s.charAt(i)) ){
                sum = sum + Character.getNumericValue(s.charAt(i));
            }
        }
        return sum;
}

Вышеописанный подход работает как следует, но я хочу переписать это логи c до Java stream подход.

У меня есть реализация вроде:

  public static int sumDigitsTillIndex(String number) {
    return IntStream.range(0, number.length())
        .filter(i -> i < 2)
        .map(number::charAt)
        .sum();
  }

, и для этого с аргументом 153 я получаю 102, что для меня является неожиданностью.

Я нашел другое, более знакомое решение, например:

   return String
    .valueOf(number)
    .chars()
    .map(Character::getNumericValue)
    .sum();

, которое правильно суммирует числа, но с дополнительным filter методом, например: .filter(index -> number.charAt(index) < 2) Я получаю Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 49

Буду благодарен за предложение о том, как исправить эти два вышеупомянутых решения и получить функциональный подход, который будет суммировать цифры от String до определенного индекса.

Ответы [ 2 ]

6 голосов
/ 03 мая 2020

Вы можете сделать:

number.chars()
      .limit(2)
      .map(Character::getNumericValue)
      .sum();

или

number.substring(0, 2)
            .chars()
            .map(Character::getNumericValue)
            .sum();
2 голосов
/ 03 мая 2020

String.charAt(int) возвращает символ, который вы затем помещаете в Character. Также вместо filter вы можете использовать limit. Например,

return IntStream.range(0, number.length())
        .limit(2)
        .map(i -> Character.digit(number.charAt(i), 10))
        .sum();

Что дает 6 для "153" по запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...