Java Stream词频统计:多规则排序实现与代码优化
单词词频统计功能修复与优化
需求规则
- 过滤长度小于4字符的单词
- 过滤出现频次小于10次的单词
- 排序规则:优先按词频从高到低排序,词频相同则按单词字母升序排序
- 禁止修改方法入参
List<String> lines
原代码问题
- 排序逻辑不完整:仅实现词频倒序,同词频场景下未按字母顺序排序,
thenComparing方法因类型推断问题未生效 - 流操作冗余:累计使用3次独立Stream流,且存在无意义的预排序、中间Map存储等性能损耗
- (隐藏问题)直接调用
lines.toString()会带入List自带的格式字符(方括号、元素分隔逗号),存在统计误差
优化后实现代码
import java.util.*; import java.util.stream.Collectors; public class Words { public String countWords(List<String> lines) { // 按空格拼接所有行文本,避免List.toString()引入的格式字符 String fullText = String.join(" ", lines); String[] words = fullText.split("(?U)\\W+"); return Arrays.stream(words) // 统一转小写后分组统计词频,移除原实现无意义的预排序操作 .collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting())) .entrySet() .stream() // 按规则过滤不符合要求的单词 .filter(entry -> entry.getKey().length() >= 4) .filter(entry -> entry.getValue() >= 10) // 组合排序:先按词频倒序,同词频按字母升序 .sorted(Comparator.<Map.Entry<String, Long>>comparingLong(Map.Entry::getValue) .reversed() .thenComparing(Map.Entry::getKey)) // 直接映射为要求的格式化字符串,无需额外存储中间有序Map .map(entry -> entry.getKey() + " - " + entry.getValue()) // 拼接为最终结果字符串 .collect(Collectors.joining("\n")); } }
关键优化说明
- 排序问题修复:显式指定比较器泛型,避免
thenComparing因泛型推断失败无法生效的问题,组合排序逻辑完全匹配规则要求 - 流操作精简:将原3次流操作缩减为2次,去掉无意义的单词预排序,去掉中间
LinkedHashMap存储环节,排序后直接映射拼接结果,减少内存占用和执行开销 - 修正文本拼接逻辑:用
String.join替代List.toString()做行拼接,避免引入无关格式字符导致的统计错误
内容的提问来源于stack exchange,提问作者fireballun
相关产品推荐
相关产品推荐

