【问题标题】:How to sum digits in String till specific index in functional way如何以功能方式对字符串中的数字求和直到特定索引
【发布时间】:2020-08-17 21:46:29
【问题描述】:

我想对例如的数字求和。 String 喜欢 "153" 直到索引 2 并收到结果 6 因为 1+5=6。 通常,我会使用经典的循环解决方案,例如检查当前索引是否低于 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;
}

上述方法可以正常工作,但我想将此逻辑重写为 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 -&gt; number.charAt(index) &lt; 2) 我正在接收 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 49

我将不胜感激有关如何修复上述两个解决方案的建议,并接收功能性方法,该方法将总结从字符串到特定索引的数字。

【问题讨论】:

    标签: java functional-programming java-stream java-11


    【解决方案1】:

    你可以这样做:

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

    number.substring(0, 2)
                .chars()
                .map(Character::getNumericValue)
                .sum();
    

    【讨论】:

    • @Haji J 非常感谢您的回复。一件简单的事情,如果我通过过滤器方法添加额外的predicate,例如只对奇数求和怎么办?我为您的第一个示例添加了 .filter(n -> n == 1) 但现在它返回 0。我不知道我今天很累还是看不到关键?干杯
    • 映射后添加..map(Character::getNumericValue).filter(n-&gt;n%2==1)...
    • 天哪,今天就够了,典型的金发时刻。非常感谢您的回复。
    【解决方案2】:

    String.charAt(int) 返回一个字符,然后您将其装箱到Character。此外,您可以使用limit 而不是filter。喜欢,

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

    根据要求为"153" 提供6

    【讨论】:

    • 非常感谢您的回复。它工作正常,但可读性比 Hadi J 解决方案要复杂一些。无论如何,竖起大拇指:)
    猜你喜欢
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2013-08-17
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    相关资源
    最近更新 更多