> 出地图>?,java,java-8,hashmap,java-stream"/>

首页 > 解决方案 > 如何创建地图> 出地图>?

问题描述

我正在尝试实现该功能:

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)));
}

但是正如您所看到的,这仅在参数中的映射不包含列表作为值时才有效。

标签: javajava-8hashmapjava-stream

解决方案


我不会为此使用流(如果您想要基于流的解决方案,请检查 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每个元素创建结果。tListlMap.computeIfAbsent

Map.computeIfAbsent如果给定键有一个条目,则返回该值,或者创建该条目并返回其第二个参数指定的值d -> new ArrayList<>()(这里d代表一个虚拟参数,我们不需要它来创建一个新的空列表)。然后,将键k添加到由 . 返回的列表中Map.computeIfAbsent


推荐阅读