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

Java 8如何统计单词频次并生成键为次数值为单词列表的Map

问题说明

现有输入文本:

Hello world Hello Stackoverflow

需要输出以单词出现次数为键、对应该频次的所有单词组成的列表为值的Map,元素顺序不作要求,期望输出格式如下:

{2=[Hello], 1=[world,Stackoverflow]}

初始实现代码统计得到的是<单词, 出现次数>结构的Map,输出为{world=1, Hello=2, Stackoverflow=1},需要调整分组逻辑得到目标结构。

实现方案

你已经完成了第一步的单个单词词频统计,只需要在词频统计结果的基础上做一次反向分组即可,完整可运行代码如下:

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class WordFreqGroup {
    public static void main(String[] args) {
        final String input = "Hello world Hello Stackoverflow";
        
        Map<Long, List<String>> output = Arrays.stream(input.split(" "))
                // 第一步:统计每个单词的出现频次
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                // 第二步:反向按频次分组,收集同频次的单词为列表
                .entrySet().stream()
                .collect(Collectors.groupingBy(
                        Map.Entry::getValue,
                        Collectors.mapping(Map.Entry::getKey, Collectors.toList())
                ));

        System.out.println(output);
    }
}

代码运行后输出结果为{1=[world, Stackoverflow], 2=[Hello]},和期望结果结构一致,因为HashMap本身不保证元素顺序,只要键值匹配就符合要求。如果追求代码可读性,也可以把两次收集的结果拆分为两个中间变量存储,逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:45:40