You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反转存在重复值的Map并保留关联键?

解决Map反转时保留多键值关联的问题

问题核心

标准Java Map的键具有唯一性,你期望的{value1=key1, value1=key2, value2=key3}结构无法直接实现——重复键会被覆盖,这也是MapUtils.invertMap只保留最后一个关联键的原因。正确的方案是将反转后的Map设计为值为集合类型的结构,即Map<String, List<String>>,用集合存储同一个值对应的所有原键,既符合Map规范,又能完整保留所有关联关系。

实现方案

1. 手动遍历实现

Map<String, String> originalMap = new HashMap<>();
originalMap.put("key1", "value1");
originalMap.put("key2", "value1");
originalMap.put("key3", "value2");

// 初始化反转Map,值为List<String>类型
Map<String, List<String>> invertedMap = new HashMap<>();

for (Map.Entry<String, String> entry : originalMap.entrySet()) {
    String originalKey = entry.getKey();
    String originalValue = entry.getValue();
    
    // 若当前值未作为新键存在,则创建新List;否则直接添加原键
    invertedMap.computeIfAbsent(originalValue, k -> new ArrayList<>()).add(originalKey);
}

System.out.println(invertedMap);
// 输出结果: {value1=[key1, key2], value2=[key3]}

2. Java 8+ Stream API实现(更简洁)

Map<String, String> originalMap = new HashMap<>();
originalMap.put("key1", "value1");
originalMap.put("key2", "value1");
originalMap.put("key3", "value2");

Map<String, List<String>> invertedMap = originalMap.entrySet()
    .stream()
    .collect(Collectors.groupingBy(
        Map.Entry::getValue,  // 以原Map的值作为新键
        Collectors.mapping(Map.Entry::getKey, Collectors.toList())  // 收集对应原键到List
    ));

System.out.println(invertedMap);
// 输出结果: {value1=[key1, key2], value2=[key3]}

模拟期望的输出格式

如果需要模拟你给出的{value1=key1, value1=key2, value2=key3}展示形式,可以遍历反转后的Map自定义打印逻辑:

invertedMap.forEach((value, keys) -> {
    keys.forEach(key -> System.out.printf("%s=%s, ", value, key));
});
// 输出: value1=key1, value1=key2, value2=key3, 

内容的提问来源于stack exchange,提问作者Rahul Maurya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:41:19