java - 按 Stream API 的频率对集合进行排序
问题描述
大家好,所有使用流的人,有这样一个问题。我有一张表,我想按其中字符出现的频率对其进行排序:
List<String> frequency = new ArrayList<>();
Collections.addAll(frequency, "gg", "ss", "gg", "boy", "girls", "girls", "gg", "boy", "aa", "aa");
我写了这个方法:
return words.stream().limit(limit).map(String::toLowerCase)
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
.entrySet().stream()
.map(entry -> new Pair<>(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
但是已经显示的答案不正确,字符串a完全丢失,字符串gg是一个元素,而boys是一个元素
ss=1
gg=2
girls=2
boy=1
而且我不知道如何按发生频率对它们进行排序。结果应该是这样的:
gg=3
aa=2
boy=2
girls=2
ss=1
如何改进?
解决方案
你可以这样做,
Map<String, Long> wordCount = frequency.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.sorted(Map.Entry.<String, Long>comparingByValue(Comparator.reverseOrder())
.thenComparing(Map.Entry.comparingByKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(e1, e2) -> e2, LinkedHashMap::new));
输出:{gg=3, aa=2, boy=2, girls=2, ss=1}
请注意,这里没有使用 mergeFunction,因为没有键冲突。
推荐阅读
- python-3.x - python glob.glob 不再工作,返回一个空列表
- druid - 德鲁伊规范截断和加载德鲁伊
- asp.net - 带有许多参数的 ASP.NET CORE 路由
- mysql - SQL Lag() 查找日期时间差异
- featuretools - 使用高级原语?
- kubernetes - KEDA 支持 statefulset 扩展吗?
- angular - Angular Flex:使用带有网格选项的 fxLayoutGap 时,mat-dialog-content 的高度不正确
- python - 将前一行两列的乘积附加到下一行
- python - Python subshell 和 Linux shell 如何产生不同的结果?
- jquery - 如何将加载程序与消息分开