Java如何获取Map中值元素数量最多的前3个键值对
问题说明
你原有代码的逻辑完全不符合需求:
- 当前流处理的元素是
Map.Entry<String, List<String>>类型,不存在Person类上下文,无法直接调用Person::getLastName - 需求不需要做分组聚合,核心逻辑是统计每个key对应value列表的长度、倒序排序、取Top3后格式化输出。
正确实现代码
import java.util.Comparator; import java.util.Map; import java.util.stream.Collectors; // 业务代码位置 String store = lastByFirst.entrySet() .stream() // 映射为 [名字, 对应姓氏数量] 的键值对 .map(entry -> Map.entry(entry.getKey(), entry.getValue().size())) // 按姓氏数量从大到小倒序排列 .sorted(Comparator.comparingInt(Map.Entry<String, Integer>::getValue).reversed()) // 取排名前3的条目 .limit(3) // 按要求格式拼接单行内容 .map(entry -> String.format("%s: %d", entry.getKey(), entry.getValue())) // 用换行符拼接所有行 .collect(Collectors.joining("\n"));
如果你使用的JDK版本低于9,不支持
Map.entry()静态方法,可以把映射部分的代码替换为new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue().size()),同时导入java.util.AbstractMap包即可。
针对你给出的测试数据,上述代码执行后store的输出完全匹配预期:
Simon: 4 George: 3 Toby: 2
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

