讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

Seko
Seko

AI短剧一键生成成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

updream

一键生成高质量推广成片

Java HashMap 怎么反转键值

冬强酱_5198

冬强酱_5198

发布时间:2026-11-15 12:39:47

|

421人浏览过

|

来源于php中文网

原创

java hashmap 反转键值需要遍历原 map,将每个 entry 的 value 作为新 map 的 key,key 作为 value。由于 hashmap 允许重复的 value 但不允许重复的 key,如果原 map 中存在相同的 value,反转后会发生键冲突,导致部分数据丢失。解决此问题的标准做法是使用 collectors.groupingby() 将反转后的 key 映射为 list<v></v>,从而保留所有原始 key。

Java HashMap 怎么反转键值

如何处理反转时的键冲突

当原 Map 中存在多个相同的 Value 时,直接反转会导致后面的 Key 覆盖前面的 Key。为了保留所有原始数据,必须使用 Collectors.toMap() 并指定合并函数,或者使用 Collectors.groupingBy() 将结果收集为列表。推荐使用 groupingBy,因为它能自然地处理一对多的关系,且代码更简洁。

Java HashMap 怎么反转键值

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> original = new HashMap<>();
        original.put("A", 1);
        original.put("B", 2);
        original.put("C", 1); // Value 1 重复

        // 方法1:使用 groupingBy 处理冲突,结果为 Map<Integer, List<String>>
        Map<Integer, List<String>> invertedList = original.entrySet().stream()
                .collect(Collectors.groupingBy(
                        Map.Entry::getValue,
                        Collectors.mapping(Map.Entry::getKey, Collectors.toList())
                ));

        System.out.println("Inverted with List: " + invertedList);
        
        // 方法2:使用 toMap 合并函数,仅保留最后一个 Key(不推荐用于完整反转)
        Map<Integer, String> invertedLast = original.entrySet().stream()
                .collect(Collectors.toMap(
                        Map.Entry::getValue,
                        Map.Entry::getKey,
                        (v1, v2) -> v2 // 冲突时取后者
                ));
        System.out.println("Inverted last only: " + invertedLast);
    }
}

运行上述代码,输出结果为:
Inverted with List: {1=[A, C], 2=[B]}
Inverted last only: {1=C, 2=B}
可以看到,groupingBy 保留了 A 和 C 两个原始 Key,而 toMap 只保留了 C。

如何反转后保持插入顺序

如果需要反转后的 Map 保持原 Map 的插入顺序,应使用 LinkedHashMap 替代普通的 HashMap。在流操作中,可以通过 Collectors.toMap() 的第三个参数指定 Map 的工厂类来实现。这适用于需要按特定顺序访问反转后数据的场景。

JavaScript 测试模式
JavaScript 测试模式

使用 Jest、Vitest 和 Testing Library 实施全面的测试策略,包括单元测试、集成测试和端到端测试,涵盖模拟、测试夹具和测试驱动开发。在编

下载

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

Java HashMap 怎么反转键值

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> original = new LinkedHashMap<>();
        original.put("A", 1);
        original.put("B", 2);
        original.put("C", 3);

        // 反转并保持顺序,结果为 LinkedHashMap<Integer, String>
        Map<Integer, String> invertedOrdered = original.entrySet().stream()
                .collect(Collectors.toMap(
                        Map.Entry::getValue,
                        Map.Entry::getKey,
                        (v1, v2) -> v1,
                        LinkedHashMap::new // 指定使用 LinkedHashMap
                ));

        System.out.println("Inverted ordered: " + invertedOrdered);
    }
}

运行上述代码,输出结果为:
Inverted ordered: {1=A, 2=B, 3=C}
这表明反转后的 Map 保持了原始 Key 的插入顺序。如果原 Map 是普通 HashMap,则顺序不确定。

基于输入中 Value 为 null 的具体问题

当原 Map 中存在 Value 为 null 时,反转操作会抛出 NullPointerException,因为 Map 的 Key 不能为 null。在使用 Collectors.toMap() 或 Collectors.groupingBy() 时,如果 Value 为 null,流操作会尝试将其作为 Key 插入,从而触发异常。因此,在反转前必须过滤掉 Value 为 null 的 Entry,或者在合并函数中处理 null 值(但通常不建议将 null 作为 Key)。

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> original = new HashMap<>();
        original.put("A", 1);
        original.put("B", null); // Value 为 null
        original.put("C", 2);

        try {
            // 直接反转会抛出 NullPointerException
            Map<Integer, String> inverted = original.entrySet().stream()
                    .collect(Collectors.toMap(
                            Map.Entry::getValue,
                            Map.Entry::getKey
                    ));
        } catch (NullPointerException e) {
            System.out.println("Caught NPE due to null value");
        }

        // 正确做法:过滤掉 Value 为 null 的 Entry
        Map<Integer, String> safeInverted = original.entrySet().stream()
                .filter(e -> e.getValue() != null)
                .collect(Collectors.toMap(
                        Map.Entry::getValue,
                        Map.Entry::getKey
                ));

        System.out.println("Safe inverted: " + safeInverted);
    }
}

运行上述代码,输出结果为:
Caught NPE due to null value
Safe inverted: {1=A, 2=C}
通过 filter 操作,我们成功避开了 null 值导致的异常,并得到了正确的反转结果。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

12637

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9742

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

8272

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1324

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1048

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1576

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

3309

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20551

2023.08.03

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn