You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java 8 Stream实现重复字符串中指定字符的计数?

用Java 8 Stream实现重复字符串中'd'的统计

嗨,我来帮你修正这个Stream实现的问题!你已经走对了大半,只是最后处理剩余字符的部分搞错了——n % s.length()是剩余需要截取的字符长度,不是其中'd'的数量,得专门统计这部分里的'd'才行。

问题分析

你的基础循环逻辑是完全正确的:

  1. 先统计原字符串中'd'的总数,乘以完整重复的次数(n / s.length())
  2. 再统计原字符串前n % s.length()个字符里的'd'数量,加到总数里

但你原来的Stream代码最后直接加了剩余长度,这显然不对,得把剩余部分的'd'单独统计出来。

修正后的Stream实现

这里有两种写法,你可以根据可读性选择:

分步清晰版

public long countD(String s, int n) {
    // 统计原字符串中'd'的数量
    long dCountPerFullString = s.chars().filter(c -> c == 'd').count();
    // 完整重复部分的总'd'数
    long fullRepeatsTotal = dCountPerFullString * (n / s.length());
    // 剩余需要截取的字符长度
    int remainingCharsLength = n % s.length();
    // 统计剩余部分的'd'数
    long remainingDCount = s.chars()
                            .limit(remainingCharsLength) // 只取前remainingCharsLength个字符
                            .filter(c -> c == 'd')
                            .count();
    // 总和
    return fullRepeatsTotal + remainingDCount;
}

链式一行版

如果喜欢更紧凑的写法,也可以把所有逻辑串起来:

public long countD(String s, int n) {
    return s.chars().filter(c -> c == 'd').count() * (n / s.length())
           + s.chars().limit(n % s.length()).filter(c -> c == 'd').count();
}

验证示例

用你给出的例子s = "dda",n = 10来测试:

  • 原字符串'd'的数量是2,完整重复次数是3(10/3=3),所以完整部分是2*3=6
  • 剩余长度是1(10%3=1),原字符串前1个字符是'd',所以剩余部分是1
  • 总和6+1=7,和你预期的结果一致!

这样就完美匹配你原来循环的逻辑啦,用Stream也实现了高效的统计。

内容的提问来源于stack exchange,提问作者Ibrahim Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:14:36