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
相关产品推荐
相关产品推荐

