如何用Java 8 Stream实现重复字符串中指定字符的计数?
用Java 8 Stream实现重复字符串中'd'的统计
嗨,我来帮你修正这个Stream实现的问题!你已经走对了大半,只是最后处理剩余字符的部分搞错了——n % s.length()是剩余需要截取的字符长度,不是其中'd'的数量,得专门统计这部分里的'd'才行。
问题分析
你的基础循环逻辑是完全正确的:
- 先统计原字符串中'd'的总数,乘以完整重复的次数(
n / s.length()) - 再统计原字符串前
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
相关产品推荐
相关产品推荐

