Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Java 8:如何收集Map中所有具有相同最大值的键列表_创想鸟

Java 8:如何收集Map中所有具有相同最大值的键列表

Java 8:如何收集Map中所有具有相同最大值的键列表

本教程旨在解决一个常见的数据处理问题:从一个Map中,提取所有与最大整数值相关联的键(String)。特别地,当多个键共享同一个最大值时,我们期望能够收集到所有这些键的列表。

问题描述

假设我们有一个map,其中包含键值对。我们的目标是找到所有值等于map中最大值的键。

示例Map:

final Map map = new HashMap();map.put("first", 50);map.put("second", 10);map.put("third", 50);map.put("fourth", 20);

对于上述示例,Map中的最大值是50。键”first”和”third”都对应这个最大值。因此,我们期望的输出是一个包含[“first”, “third”]的列表。

现有尝试的局限性:

直接使用stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey)通常只能返回一个键,即使存在多个键拥有相同的最大值。例如,它可能返回”third”(取决于流的内部顺序),但会忽略”first”。这不符合我们收集所有最大值键的需求。

立即学习“Java免费学习笔记(深入)”;

解决方案一:使用Java 8 Stream API

此方法利用Java 8的Stream API进行多步处理。核心思想是首先根据值对Map的条目进行分组,然后从这些分组中找出与最大值对应的键列表。

实现思路:

将Map.Entry流转换为Map<Integer, List>,其中键是原始Map中的值,而值是所有对应这些值的键的列表。从这个新的Map中,找到键(即原始值)最大的那个条目。提取该条目中的值(即我们需要的键列表)。

代码示例:

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.stream.Collectors;import static java.util.stream.Collectors.*;public class MaxKeysCollector {    public static List getMaxKeysUsingStream(Map map) {        return map.entrySet()                .stream()                // 步骤1: 按值分组。键是原始值,值是所有对应这些值的键的列表。                // 例如: {50=[first, third], 10=[second], 20=[fourth]}                .collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toList())))                .entrySet()                .stream()                // 步骤2: 找出新Map中键(即原始最大值)最大的条目。                .max(Map.Entry.<Integer, List>comparingByKey())                // 步骤3: 获取该条目的值,即包含所有最大值键的列表。                .orElseThrow(() -> new IllegalStateException("Map cannot be empty to find max keys."))                .getValue();    }    public static void main(String[] args) {        final Map map = new HashMap();        map.put("first", 50);        map.put("second", 10);        map.put("third", 50);        map.put("fourth", 20);        List maxKeys = getMaxKeysUsingStream(map);        System.out.println("Stream API 方法获取的最大值键列表: " + maxKeys); // 预期输出: [first, third] 或 [third, first] (顺序不保证)    }}

代码解析:

groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toList())):这是核心操作。它首先将Map的条目按照它们的值(Map.Entry::getValue)进行分组。对于每个分组,它不是简单地收集Map.Entry,而是通过mapping(Map.Entry::getKey, toList())进一步处理,只收集键并将其放入一个列表中。max(Map.Entry.<Integer, List>comparingByKey()):在生成的新Map(Map<Integer, List>)上,我们再次创建一个流,并使用max操作符,通过比较键(即原始Map中的值)来找到最大的条目。orElseThrow().getValue():如果Map不为空,max操作会返回一个Optional<Map.Entry<Integer, List>>。orElseThrow()用于获取其内部值,然后getValue()提取出该条目中包含的键列表。

注意事项:

此方法涉及两次流迭代。第一次迭代用于分组,第二次迭代用于查找最大分组。虽然第二次迭代的Map通常会比原始Map小,但在数据量非常大的情况下,这可能会带来一定的性能开销。

解决方案二:单次迭代的命令式循环

对于追求极致性能的场景,一个传统的命令式循环通常是最高效的解决方案,因为它只需要对Map进行一次遍历。

实现思路:

初始化一个空列表maxKeys来存储结果。初始化maxValue为Integer.MIN_VALUE,用于跟踪当前遇到的最大值。遍历Map的每个条目。对于每个条目:如果当前条目的值小于maxValue,则跳过(它不可能是最大值)。如果当前条目的值大于maxValue,说明我们找到了一个新的最大值。此时,需要清空maxKeys列表,因为之前收集的键不再是最大值对应的键。更新maxValue为当前条目的值。将当前条目的键添加到maxKeys列表中。

代码示例:

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class MaxKeysCollector {    public static List getMaxKeysUsingLoop(Map map) {        List maxKeys = new ArrayList();        int maxValue = Integer.MIN_VALUE; // 初始化为最小值        for (Map.Entry entry : map.entrySet()) {            int currentValue = entry.getValue();            String currentKey = entry.getKey();            if (currentValue  maxValue) {                // 找到了一个新的最大值,清空之前收集的键                maxKeys.clear();                maxValue = currentValue; // 更新最大值            }            // 如果 currentValue == maxValue,或者 currentValue > maxValue (清空后),则添加当前键            maxKeys.add(currentKey);        }        return maxKeys;    }    public static void main(String[] args) {        final Map map = new HashMap();        map.put("first", 50);        map.put("second", 10);        map.put("third", 50);        map.put("fourth", 20);        map.put("fifth", 60); // 添加一个更大的值测试        List maxKeysLoop = getMaxKeysUsingLoop(map);        System.out.println("命令式循环方法获取的最大值键列表: " + maxKeysLoop); // 预期输出: [fifth]        final Map map2 = new HashMap();        map2.put("first", 50);        map2.put("second", 10);        map2.put("third", 50);        List maxKeysLoop2 = getMaxKeysUsingLoop(map2);        System.out.println("命令式循环方法获取的最大值键列表 (原始示例): " + maxKeysLoop2); // 预期输出: [first, third]    }}

代码解析:

maxValue = Integer.MIN_VALUE;:确保任何Map中的值都能被正确识别为大于或等于初始最大值。if (currentValue maxValue) maxKeys.clear();:这是关键逻辑。当发现一个比当前maxValue更大的值时,意味着之前maxKeys中收集的所有键都不再是最大值对应的键了,因此需要清空列表。maxValue = currentValue;:更新maxValue为新的最大值。maxKeys.add(currentKey);:将当前键添加到maxKeys中。这个操作会在两种情况下发生:currentValue等于maxValue(收集所有相同最大值的键)。currentValue大于maxValue(在清空列表并更新maxValue之后,将新最大值对应的键添加进去)。

性能优势:

此方法只需要对Map进行一次迭代,因此在性能上通常优于Stream API的多步处理方法,尤其是在Map包含大量数据时。

总结与选择

本文提供了两种在Java 8中收集Map中所有具有相同最大值的键列表的方法:

Stream API方法: 简洁、声明性强,利用了groupingBy和max等高级Stream操作。代码可读性较高,但涉及多次迭代,可能在极端性能要求下略逊一筹。命令式循环方法: 性能最优,仅需单次迭代。逻辑清晰,易于理解其执行过程,适用于对性能有严格要求的场景。

在实际开发中,如果Map的数据量不是特别巨大,Stream API方法因其简洁性和声明性通常是更受欢迎的选择。但如果Map可能包含数十万甚至数百万条目,并且性能是首要考虑因素,那么单次迭代的命令式循环将是更明智的选择。

以上就是Java 8:如何收集Map中所有具有相同最大值的键列表的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/69245.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
6款代理商管理系统的综合评测:功能与应用详解
上一篇 2025年11月12日 22:50:41
项目管理有哪些职责
下一篇 2025年11月12日 22:52:05

相关推荐

  • 如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    RayTune通过分布式超参数优化解决大模型训练中的资源调度、搜索效率、实验管理与容错难题,其核心是利用并行化和智能调度(如ASHA、PBT)加速最优配置探索。首先,将训练逻辑封装为可调用函数,并在其中集成分布式训练(如PyTorch DDP);其次,定义超参数搜索空间与资源需求(如每试验2 GPU…

    2026年9月23日 用户投稿
    000
  • mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql子查询常见类型包括标量子查询、行子查询和表子查询,分别返回一行一列、一行多列和多行多列数据;应用场景涵盖where作为过滤条件、from作为派生表、select作为标量列以及dml操作的数据提供。此外,根据与外部查询的关联性分为非关联子查询和关联子查询,前者独立执行一次,后者依赖外部查询每…

    2026年9月23日 用户投稿
    000
  • 硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新

    硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新

    谷歌最新视频生成模型 veo 3.1 来了!今日上手可用。 北京时间 10 月 16 日,谷歌在 Gemini API 中发布了 Veo 3.1 和 Veo 3.1 Fast 付费预览版。模型一上线,就受到了行业的高度关注。毕竟,和前不久发布的 Sora 2 一样,这次 Veo 3.1 也新增了音频…

    2026年9月23日 用户投稿
    100
  • Java Optional与集合结合使用方法

    Optional与集合结合可避免空指针异常。1. 用Optional.ofNullable包装可能为null的集合元素;2. Stream中filter后接findFirst返回Optional,安全查找;3. 对象属性为Optional时,通过flatMap展开提取值;4. 方法返回Optiona…

    2026年9月23日
    100
  • 小说免费阅读网站推荐 全集小说免费在线阅读网官方地址

    为了解决广大书迷寻找免费阅读资源的烦恼,本文精选了几个资源丰富、体验良好的在线小说网站。这些平台提供了海量全集作品,让你无需付费即可轻松追更,畅享阅读的乐趣。 直接观看“☞☞☞☞☞点击小说免费阅读网站首页直达☜☜☜☜☜”; 直接观看“☞☞☞☞☞点击海内外小说、漫画观看APP合集☜☜☜☜☜”; 一、笔…

    2026年9月23日
    000
  • vivo X300 Pro首发定制2亿灭霸长焦 韩伯啸:长焦新王

    9月2日,vivo产品经理韩伯啸再次为即将发布的vivo x300系列预热,此次聚焦于旗舰机型vivo x300 pro的影像能力。 韩伯啸指出,X300 Pro搭载了独家深度定制的2亿HPB“灭霸”长焦镜头,标志着vivo在长焦技术上的又一次飞跃。这颗镜头是蓝厂真正意义上的第四代两亿像素长焦系统,…

    2026年9月23日
    000
  • Java ListIterator如何实现双向遍历

    Java中的ListIterator接口支持双向遍历,即可以从前往后,也可以从后往前遍历列表。这与普通的Iterator只能单向向后遍历不同。ListIterator提供了更灵活的操作方式,特别适用于需要反向访问或在遍历过程中修改列表的场景。 1. ListIterator的基本特性 ListIte…

    2026年9月22日
    100
  • mysql如何分析索引使用 mysql创建索引后的执行计划解读

    mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读

    要分析mysql索引使用和执行计划,核心是通过explain命令查看查询路径,并结合handler_read%状态变量评估索引效率。1. 使用explain命令分析执行计划,关注type、key、extra等列,判断是否高效利用索引;2. 通过show global status like &#82…

    2026年9月22日 用户投稿
    100
  • 解决TCPDF保存文件权限问题的完整指南

    本文旨在解决使用tcpdf在%ignore_a_1%中生成pdf并保存到服务器(’f’模式)时遇到的“permission denied”错误,尤其是在macos环境下。核心问题通常源于不正确的服务器文件路径或目标文件夹缺乏写入权限。教程将详细阐述如何构建正确的绝对文件路径,…

    2026年9月22日
    200
  • mysql怎么添加前缀索引 mysql创建前缀索引的长度选择

    mysql怎么添加前缀索引 mysql创建前缀索引的长度选择mysql怎么添加前缀索引 mysql创建前缀索引的长度选择mysql怎么添加前缀索引 mysql创建前缀索引的长度选择mysql怎么添加前缀索引 mysql创建前缀索引的长度选择

    在mysql中,为长字符串列添加前缀索引的核心目的是优化查询性能并节省存储空间。1. 前缀索引通过仅索引列值的前n个字符实现这一目标;2. 前缀长度的选择需在区分度与存储效率之间取得平衡,理想长度应确保高区分度(如90%以上)且不过度冗余;3. 可通过执行select count(distinct …

    2026年9月22日 用户投稿
    100
  • 《植物大战僵尸:重植版》制作人:价格亲民 未使用AI!

    经典塔防游戏《植物大战僵尸》在问世16年后迎来重磅回归。由PopCap Games精心打造的重制作品——《植物大战僵尸:重植版》将于10月23日正式登陆PlayStation、Xbox、Nintendo Switch以及PC平台。 据The Gamer报道,该游戏执行制作人Jake Neri在采访中…

    2026年9月22日
    200
  • VSCode运行多文件C项目 完整VSCode配置C++开发教程

    要解决#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8运行多文件c项目的问题,核心是正确配置tasks.json、launch.json和settings.json文件以定义编译、调试和项目路径。首先安装c/c++扩展插件和可选的编译…

    2026年9月22日
    000
  • Java集合框架在实际项目中的最佳实践

    合理选择集合类型并预设容量,使用不可变集合保护数据,避免遍历中修改结构,可提升Java程序性能与安全性。 Java集合框架是开发中使用最频繁的工具之一,合理使用能显著提升代码的可读性、性能和稳定性。在实际项目中,遵循一些最佳实践可以避免常见陷阱,提高程序健壮性。 选择合适的集合类型 不同场景应选用最…

    2026年9月22日
    000
  • 全球首发天玑9500!vivo X300发布:4399元起

    全球首发天玑9500!vivo X300发布:4399元起全球首发天玑9500!vivo X300发布:4399元起全球首发天玑9500!vivo X300发布:4399元起全球首发天玑9500!vivo X300发布:4399元起

    10月13日,vivo正式推出了全新旗舰手机——vivo x300,引发广泛关注。 价格方面,该机提供多个配置版本:12GB+256GB售价为4399元,16GB+256GB定价4699元,12GB+512GB为4999元,16GB+512GB则为5299元,顶配的16GB+1TB版本售价5799元…

    2026年9月22日 用户投稿
    000
  • 抖音企业号怎么绑定员工号?绑定员工号有哪些好处?

    抖音企业号绑定员工账号是优化团队协作与提升运营效率的重要方式。通过官方流程,企业可将员工的个人抖音号与企业主体进行关联,实现权限分配与协同管理。 一、如何绑定抖音企业号员工号? 准备前提条件:确保企业号已完成企业认证,且员工所使用的抖音账号处于正常使用状态。管理员需准备好营业执照、员工身份资料等信息…

    2026年9月22日
    000
  • Canva的AI混合工具如何操作?快速设计专业图形与文本的步骤

    Canva的AI混合功能通过Magic Studio将文本、图像生成与智能设计整合,提升创作效率。首先,使用Magic Write生成文案初稿,克服空白页难题;其次,通过Magic Media输入详细描述生成定制化图像,越具体效果越好;再利用Magic Design上传图片或输入文字自动生成多种设计…

    2026年9月22日
    000
  • PHPRestfulAPI怎么开发_PHP构建高效安全的RestfulAPI教程

    答案:本文介绍如何用PHP构建高效安全的Restful API,涵盖设计规范、项目结构、数据库操作、安全机制、统一响应格式及性能优化。遵循Restful风格使用标准HTTP方法与状态码,通过index.php统一入口路由请求至控制器;采用PDO预处理防止SQL注入,结合JWT实现认证授权,确保输入验…

    2026年9月22日
    100
  • MySQL服务无法启动怎么办?常见解决方法

    MySQL服务无法启动怎么办?常见解决方法MySQL服务无法启动怎么办?常见解决方法MySQL服务无法启动怎么办?常见解决方法MySQL服务无法启动怎么办?常见解决方法

    mysql服务无法启动常见原因包括配置错误、端口占用、数据文件损坏或权限问题。解决方法如下:1. 查看错误日志,定位问题根源;2. 检查配置文件是否存在语法错误或路径问题;3. 确认端口(如3306)未被占用;4. 核查数据目录的权限与完整性;5. 必要时修复或重置数据目录,甚至重新安装mysql。…

    2026年9月22日 用户投稿
    100
  • Java TreeMap如何自定义排序规则

    TreeMap默认按键的自然顺序排序,可通过构造函数传入Comparator自定义排序规则。例如字符串可按长度排序:TreeMap map = new TreeMap((s1, s2) -> s1.length() – s2.length()); 对自定义对象如Person可按年龄…

    2026年9月22日
    000
  • 如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程

    如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程

    MLflow通过实验跟踪、可复现的项目封装、标准化模型格式和集中式模型注册表,实现大模型训练的全流程管理。它记录超参数、指标和模型文件,支持分布式环境下的集中日志管理,利用远程跟踪服务器和云存储统一收集数据,并通过模型版本控制与阶段管理提升团队协作与部署效率。 ☞☞☞AI 智能聊天, 问答助手, A…

    2026年9月22日 用户投稿
    000

发表回复

登录后才能评论
关注微信