在 Java 8 中获取 Map 中所有最大值对应的键列表教程

在 Java 8 中获取 Map 中所有最大值对应的键列表教程

本教程探讨了在 Java 8+ 中如何从 Map 中收集所有具有相同最大值的键列表。文章提供了两种主要方法:一种是利用 Stream API 进行分组和筛选的声明式方案,另一种是单次迭代的命令式优化方案,并对比了它们的优缺点,旨在帮助开发者根据具体场景选择最合适的实现方式。

问题描述

java 开发中,我们经常需要处理键值对数据结构,例如 map。一个常见的需求是找出所有映射到最大值的键。例如,给定一个 map:

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

我们期望的输出是一个包含所有最大值键的 List,即 [“first”, “third”],因为 “first” 和 “third” 都对应着最大值 50。

常见尝试与局限

初学者可能会尝试使用 Stream API 的 max 方法,但这种方法通常只能返回一个最大值对应的键(如果存在多个,则返回其中一个):

// 只能获取一个最大值对应的键final String maxKey = map.entrySet()    .stream()    .max(Map.Entry.comparingByValue())    .map(Map.Entry::getKey)    .orElse(null);System.out.println(maxKey); // 可能会输出 "third" 或 "first",取决于内部迭代顺序

或者尝试对所有条目按值降序排序,但这会返回所有键,而不是仅限于最大值对应的键:

// 返回所有键,按值降序排列final List keysInDescending = map.entrySet()    .stream()    .sorted(Map.Entry.comparingByValue().reversed())    .map(Map.Entry::getKey)    .collect(Collectors.toList());System.out.println(keysInDescending); // 输出 [third, first, second]

这些方法都无法直接满足获取所有最大值键的需求。

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

解决方案一:使用 Java 8 Stream API 进行分组和筛选

此方法利用 Stream API 的强大功能,通过两次迭代实现。第一次迭代将所有键按其值进行分组,第二次迭代则从分组后的 Map 中找出最大值对应的键列表。

import java.util.List;import java.util.Map;import java.util.HashMap;import java.util.stream.Collectors;import static java.util.stream.Collectors.groupingBy;import static java.util.stream.Collectors.mapping;import static java.util.stream.Collectors.toList;public class MaxKeysCollector {    public static List getMaxKeysUsingStreams(Map map) {        if (map == null || map.isEmpty()) {            return List.of(); // 返回空列表或抛出异常,取决于业务需求        }        return map.entrySet()                .stream()                // 1. 按值进行分组:Map<Integer, List>                // 键是值(Integer),值是所有映射到该值的键列表(List)                .collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toList())))                .entrySet()                .stream()                // 2. 找到分组Map中键(即原始值)最大的那个条目                .max(Map.Entry.comparingByKey())                // 3. 如果Map为空,orElseThrow()会抛出NoSuchElementException。                // 更好的做法是处理Optional为空的情况,例如返回一个空列表。                .orElseThrow(() -> new IllegalStateException("Map is empty or contains no entries."))                // 4. 获取该最大条目中的值,即对应的键列表                .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", 30);        List maxKeys = getMaxKeysUsingStreams(map);        System.out.println("Stream API 方案结果: " + maxKeys); // 输出: Stream API 方案结果: [first, third] (顺序可能不同)    }}

解析:

map.entrySet().stream():获取 Map 的所有条目并转换为 Stream。collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toList()))):这是核心步骤。它将 Stream<Map.Entry> 转换为 Map<Integer, List>。groupingBy(Map.Entry::getValue):根据 Map.Entry 的值(即 Integer)进行分组。mapping(Map.Entry::getKey, toList()):对于每个分组,将原始 Map.Entry 的键(String)提取出来,并收集到一个 List 中。.entrySet().stream():将上一步生成的 Map<Integer, List> 再次转换为 Stream<Map.Entry<Integer, List>>。.max(Map.Entry.comparingByKey()):从这个新的 Stream 中,找到键(即原始值)最大的那个条目。.orElseThrow().getValue():获取最大值对应的 List。orElseThrow() 用于处理 Optional 为空的情况,如果原始 Map 为空,则会抛出异常。在实际应用中,建议更优雅地处理此情况,例如在方法开头进行空 Map 检查。

优点: 代码简洁、声明式风格,易于理解其意图。缺点: 进行了两次迭代,对于非常大的 Map 可能会有轻微的性能开销,但通常情况下影响不大。

解决方案二:单次迭代的命令式优化方案

对于性能要求极高的场景,或者当 Map 包含大量数据时,单次迭代的命令式 for 循环通常是最高效的。它在一次遍历中同时追踪当前的最大值和所有与该最大值关联的键。

import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.HashMap;public class MaxKeysCollectorOptimized {    public static List getMaxKeysOptimized(Map map) {        List maxKeys = new ArrayList();        int maxValue = Integer.MIN_VALUE; // 初始化为Integer的最小值,确保任何Map值都能被正确比较        if (map == null || map.isEmpty()) {            return maxKeys; // 返回空列表        }        for (Map.Entry entry : map.entrySet()) {            int currentValue = entry.getValue();            if (currentValue  maxValue) {                // 发现了一个新的更大的值                maxKeys.clear(); // 清空之前收集的键,因为它们不再是最大值                maxValue = currentValue; // 更新最大值            }            // 如果 currentValue == maxValue,则将当前键添加到列表中            // 如果 currentValue > maxValue,在清空后,也需要将当前键添加            maxKeys.add(entry.getKey());        }        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", 30);        List maxKeys = getMaxKeysOptimized(map);        System.out.println("单次迭代优化方案结果: " + maxKeys); // 输出: 单次迭代优化方案结果: [first, third] (顺序可能不同)    }}

解析:

List maxKeys = new ArrayList();:初始化一个 List 来存储结果。int maxValue = Integer.MIN_VALUE;:初始化一个变量 maxValue 为 Integer 的最小值。这是关键,确保 Map 中的任何正值或零值都能被正确识别为大于初始值。遍历 Map 的所有条目:if (currentValue maxValue):如果当前条目的值大于 maxValue,说明我们找到了一个新的最大值。此时,需要清空 maxKeys 列表(因为之前的键不再是最大值),然后更新 maxValue。maxKeys.add(entry.getKey());:如果当前值等于 maxValue(包括 currentValue > maxValue 更新后),则将当前键添加到 maxKeys 列表中。

优点: 性能最佳,只需单次迭代。缺点: 代码是命令式风格,相对于 Stream API 方案,可能在某些人看来可读性稍差。

方案选择与考量

Stream API 方案 (分组和筛选)

适用场景:追求代码的声明式风格、简洁性和函数式编程范式,对极端性能要求不高。优点:代码意图清晰,易于理解。注意事项:处理空 Map 时需要额外注意 orElseThrow() 可能抛出的异常。

单次迭代优化方案

适用场景:对性能有严格要求,处理大规模数据集,或在性能敏感的代码路径中。优点:效率最高,单次遍历。注意事项:代码相对命令式,需要仔细理解其逻辑。

在大多数现代 Java 应用中,Stream API 方案的性能开销通常可以忽略不计,因此可以优先选择其提供的简洁性和可读性。然而,如果经过性能分析发现 Stream API 成为瓶颈,那么单次迭代的优化方案将是更合适的选择。

总结

本文介绍了在 Java 8+ 中获取 Map 中所有最大值对应的键列表的两种主要方法:一种是利用 Stream API 进行分组和筛选,另一种是采用单次迭代的命令式优化方案。两种方法都能正确解决问题,但在代码风格、性能和适用场景上各有侧重。开发者应根据项目的具体需求和性能考量,选择最适合的实现方式。

以上就是在 Java 8 中获取 Map 中所有最大值对应的键列表教程的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月13日 00:53:32
下一篇 2025年11月13日 01:32:17

相关推荐

  • 币圈十大交易所app_虚拟币交易所app官网2025

    在数字资产交易中,选择合适的交易平台至关重要,以下是当前市场上一些具有代表性的虚拟币交易平台。1、Binance:全球交易量领先,提供广泛的交易对和产品,拥有高流动性和市场深度,具备强大的安全措施和合规努力,并构建了完整的生态系统。2、OKX:以衍生品交易见长,具备高性能交易引擎,界面兼顾新手与专业…

    2025年12月8日 好文分享
    000
  • 公认的三大交易所币圈 三大交易所分别是指

    加密货币交易所是数字资产交易的核心平台,主要交易所包括:1.Binance,全球交易量最大的交易所之一,提供多样化的交易产品和服务,并构建了庞大的生态系统;2.OKX,亚洲知名交易平台,在合约交易和现货交易领域具备深厚技术实力,提供创新工具;3.gate.io以支持众多币种著称,提供多样化交易方式并…

    2025年12月8日 好文分享
    000
  • 什么是抄底止盈策略?如何使用?欧易抄底止盈策略使用教学(最新版)

    抄底止盈策略是基于双币理财产品自动进行抄底、止盈赚取票息和币价上涨收益的策略循环套利,并利用基于双币理财的低买和高卖两个方向进行循环投入套利。以下是设置抄底止盈策略的详细步骤 欧易官方注册地址:https://www.okx.com/ OKX APP下载地址:https://download.fpn…

    2025年12月8日 好文分享
    000
  • 灰度上线的Space and Time Trust(SXT)信托是什么?有什么用?

    如果说2024年是比特币现货etf获批、正式开启机构元年的话,那么当时间进入2025年,市场的旋律正悄然转向更为深邃的底层乐章。当大众的目光逐渐从比特币价格的每一次跳动中移开,行业中最敏锐的捕食者——灰度(grayscale),已将它的触角伸向了一个定义未来的新领域。 近日,灰度正式推出了其“Spa…

    2025年12月8日
    000
  • TRON(TRX)是什么?TRX代币经济学、未来价格介绍

    虽然区块链的头条新闻通常关注比特币的价格走势或以太坊的最新升级,但有一个网络已悄然将自己定位为全球数字支付的支柱,为数十亿美元的日常交易提供支持。 本文探讨了 TRON 从内容共享愿景发展成为全球最大的稳定币网络的过程,同时根据最近的发展评估了其独特的技术、不断发展的生态系统和 TRX 的投资前景。…

    2025年12月8日
    000
  • 币圈专业交易平台排行榜2025

    进入数字资产交易领域,选择一个可靠、功能全面且安全的专业交易平台是每位投资者必须面对的核心议题。市场的喧嚣与技术的快速迭代,使得交易平台的综合实力成为衡量其价值的关键标尺。一个卓越的平台不仅仅是提供买卖服务的场所,它更是一个集成了深度流动性、丰富交易产品、尖端技术架构与完善用户服务的综合性金融生态。…

    2025年12月8日 好文分享
    000
  • 币圈公认的十大交易所交易所排名(2025版)

    加密货币交易平台是用户参与数字资产市场的重要入口,选择平台时需综合考虑交易费用、币种数量、用户体验、安全性和合规性等因素。1. Binance以高交易量和广泛的交易对著称,提供多样金融产品及全方位服务;2. OKX在衍生品交易领域突出,支持多种出入金方式并构建一站式服务平台;3. gate.io以丰…

    2025年12月8日 好文分享
    000
  • 如何快速联系欧易官客服?怎么转OKX人工客服?(2025最新/手机和web)

    okx欧易怎么转人工客服?怎么联系okx欧易官方客服呢?okx欧易电话客服在哪? OKX客服支援涵盖多个领域,包括帐号管理、交易问题、资金安全以及平台功能的使用说明,使用者可以透过多种方式联系客服,包括即时聊天、电子邮件和官方社交媒体平台,让使用者快速找到解决方案。 下面,本站小编给大家详细介绍下O…

    2025年12月8日 好文分享
    000
  • 一文详解SPK代币价格及2025年价格预测

    目录 SPK 的首秀代币暴跌背后:空投套利与流动性危机技术优势:Spark Protocol 的三大核心支柱2025 年价格预测:机构观点分歧明显未来挑战:如何在DeFi 红海中突围投资建议:高风险与潜在回报并存未来展望 2025 年6 月17 日,由原makerdao 核心团队打造的spark p…

    2025年12月8日
    000
  • 加密货币行业研究:2025年将有590万个新的Meme代币发行

    目录 方法论2025年将有590万个新的Meme代币发行Memecoin 是 2025 年唯一盈利的加密货币行业 虽然模因币经常被轻率地称为加密货币界的“玩笑币”,但它在2025年取得了非凡的成就:其表现超越了所有其他细分市场。而此时,绝大多数模因币已经销声匿迹。根据chainplay的数据,202…

    2025年12月8日
    000
  • 币圈用户如何选择虚拟币交易app 2025年十大虚拟币交易app排行榜

    币圈用户选择虚拟币交易app时,需要关注平台的安全性、交易费用、币种支持、用户体验及功能多样性。2025年,虚拟币交易市场竞争激烈,各大平台通过技术创新与服务优化吸引用户。本文基于交易量、安全性、用户反馈等维度,列出2025年十大虚拟币交易app排行榜,详细解析各平台特点,助力用户找到适合自己的交易…

    2025年12月8日 好文分享
    000
  • 币安与gate.io交易所全面对比 更适合新手

    %ignore_a_1%平台是数字资产交易的核心场所。对于刚接触加密领域的用户来说,选择一个合适的交易平台至关重要,它关系到交易体验、资产安全和学习成本。全球范围内有众多加密货币交易所,其中币安(binance)和gate.io是广受关注的两家。它们各自拥有庞大的用户群体和独特的服务特点。了解它们的…

    2025年12月8日
    000
  • 2025买U币需要注意什么?高口碑U币交易所推荐

    在2025年考虑购买u币(通常指与美元1:1锚定的稳定币,如usdt、usdc等)时,选择一个可靠且声誉良好的交易平台至关重要。稳定币作为数字资产世界中的桥梁,其稳定性和流动性使其成为许多投资者和交易者的首选。了解不同交易所的特点、安全性以及用户体验,能帮助您做出更明智的决定,规避潜在风险。以下是一…

    2025年12月8日 好文分享
    000
  • 加密货币交易平台最新榜单top10

    数字货币市场的活力日益增强,为全球投资者提供了丰富的交易机会。在这个充满活力的领域,选择一个可靠、安全且功能全面的交易平台至关重要。这些平台是连接用户与数字资产世界的桥梁,其提供的服务水平、安全性以及支持的资产种类直接影响着用户的交易体验和资产安全。本榜单旨在呈现当前市场上表现突出的一些数字货币交易…

    2025年12月8日 好文分享
    000
  • $ 1 $ 1的加密支持者:2025年的Meme Coin Mania

    在2025年,与知名品牌支持者一起探索最佳的加密货币。深入了解模因币热潮,并获得关于拖钓猫、庞克等项目的洞察。 Meme Coin 热潮席卷2025!诸如Bonk、Lofi及热门预售项目正引发关注。让我们深入挖掘那些价格亲民且有名人背书的加密资产。 拖钓猫:值得关注的模因币 Troller Cat(…

    2025年12月8日
    000
  • Solana生态系统开发:2025年蓬勃发展

    探索solana生态系统内强劲的发展势头与不断演化的趋势,聚焦关键项目、市场动态及其在defi、ai和nft领域的日益增长的吸引力。 Solana生态系统发展:2025年的蓬勃崛起 Solana生态正焕发出勃勃生机,进一步巩固其在区块链行业的重要地位。让我们深入了解最新进展、趋势以及塑造其未来的关键…

    2025年12月8日
    000
  • Sahara AI,Binance Listing和Airdrop Mania:什么是嗡嗡声?

    sahara ai的binance列表和airdrop strategy正在加密空间中创造波浪。让我们研究这个分散的ai项目的细节。 Sahara AI最近的Binance上市和空投公告已经通过加密货币社区散发了涟漪,引发了极大的兴趣和猜测。这篇博客文章介绍了推动撒哈拉AI嗡嗡声的核心元素,重点是其…

    2025年12月8日
    000
  • 币安还是火币HTX?新手到专业交易者选择指南 2025

    在蓬勃发展的加密货币市场中,选择一个合适的交易平台对用户至关重要。对于希望在2025年参与数字资产交易的新手或专业交易者来说,币安与火币htx是两个备受关注的选择。理解这两个平台的特性和差异,有助于做出更符合个人需求的决定。 币安 Binance  1. 币安成立于2017年,迅速成长为全球交易量最…

    2025年12月8日
    000
  • 欧易OKX和币安怎么选?2025加密货币交易所对比指南

    在飞速发展的加密货币市场中,选择一个合适的交易平台是每个参与者面临的关键决策。进入2025年,随着市场的成熟和监管环境的变化,主要交易所之间的差异化竞争愈发明显。欧易okx和币安作为全球领先的加密货币交易所,各有其特色和优势。理解它们的服务内容、技术特点和市场定位,对于投资者和交易者至关重要。 欧易…

    2025年12月8日
    000
  • 火币HTX vs 币安:核心优势与劣势详细分析 最新评测

    数字资产交易所在全球金融市场扮演着日益重要的角色,它们是加密货币交易、投资和管理的核心平台。选择一个合适的交易所,关系到交易的便捷性、资金的安全性以及投资机会的多寡。币安和火币htx作为行业内的资深玩家,各自拥有庞大的用户基础和独特的优势。 币安 binance  1. 币安是全球最大的加密货币交易…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信