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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:21:15