3 回答

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
我不會(huì)為此使用流(如果您想要基于流的解決方案,請(qǐng)檢查 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;
}
上面的代碼迭代輸入映射,并為每個(gè)值的map每個(gè)元素創(chuàng)建結(jié)果。tListlMap.computeIfAbsent
Map.computeIfAbsent如果給定鍵有一個(gè)條目,則返回該值,或者創(chuàng)建該條目并返回其第二個(gè)參數(shù)指定的值d -> new ArrayList<>()(這里d代表一個(gè)虛擬參數(shù),我們不需要它來創(chuàng)建一個(gè)新的空列表)。然后,將鍵k添加到由 . 返回的列表中Map.computeIfAbsent。

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是一種流式處理方式(盡管我的第一直覺是遵循Federico 的解決方案):
private static <T, K> Map<T, List<K>> invertedMapOfList(Map<K, List<T>> m) {
return m.entrySet()
.stream()
.flatMap(e -> e.getValue()
.stream()
.map(v -> new AbstractMap.SimpleEntry<>(e.getKey(), v)))
.collect(Collectors.groupingBy(Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
}

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
希望這能解決您的問題。
private static <T, K> Map<T, List<K>> invertedMap(Map<K, List<T>> m) {
Map<T, List<K>> result = new HashMap<T, List<K>>();
for (K key : m.keySet()) {
for (T value : m.get(key)) {
List<K> kList = null;
if ((kList = result.get(value)) == null) {
kList = new ArrayList<K>();
}
kList.add(key);
result.put(value, kList);
}
}
return result;
}
添加回答
舉報(bào)