java - 如何创建地图> 出地图>?
问题描述
我正在尝试实现该功能:
private static <T, K> Map<T, List<K> > invertedMap(Map<K, List<T> > m)
例如,如果我有Map<String, List<Integer> >
,
我想创建另一个Map<Integer, List<String> >
.
我写了一些代码:
private static <T, K> Map<T, List<K>> invertedMap(Map<K, T> m) {
return m.keySet().stream()
.collect(Collectors.groupingBy(k -> m.get(k)));
}
但是正如您所看到的,这仅在参数中的映射不包含列表作为值时才有效。
解决方案
我不会为此使用流(如果您想要基于流的解决方案,请检查 nullpointer's answer):
private static <T, K> Map<T, List<K>> invertedMap(Map<K, List<T>> map) {
Map<T, List<K>> result = new LinkedHashMap<>(); // Preserves insertion order
map.forEach((k, l) ->
l.forEach(t -> result.computeIfAbsent(t, d -> new ArrayList<>()).add(k)));
return result;
}
上面的代码迭代输入映射,并为每个值的map
每个元素创建结果。t
List
l
Map.computeIfAbsent
Map.computeIfAbsent
如果给定键有一个条目,则返回该值,或者创建该条目并返回其第二个参数指定的值d -> new ArrayList<>()
(这里d
代表一个虚拟参数,我们不需要它来创建一个新的空列表)。然后,将键k
添加到由 . 返回的列表中Map.computeIfAbsent
。
推荐阅读
- regex - 仅在破折号之间的组中匹配正则表达式
- flutter - 如何在 Dart/Flutter 的构造函数中初始化 Map
- javascript - 简单的 Reduce 功能无法正常工作
- c - C函数返回(null)而不是返回数组
- sql - 如何使用“OR”子句控制 ActiveRecord 查询中的括号位置
- linux - 是否可以在 Bash 的命令行上扩展文件通配符?
- java - 从 TabLayout 添加和删除选项卡
- javascript - BABEL_TRANSFORM_ERROR。属性值期望字符串类型但得到对象
- javascript - 变量作为属性传递而不在反应中呈现
- sparql - 在 SPARQL 中按对象属性查询