如何反转存在重复值的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
相关产品推荐
相关产品推荐

