如何从Map<K,Collection<V>>创建多地图<K,V>?

2022-08-31 20:36:23

我没有找到这样的多地图结构...当我想要这样做时,我会遍历地图,并填充多地图。还有别的方法吗?

final Map<String, Collection<String>> map = ImmutableMap.<String, Collection<String>>of(
            "1", Arrays.asList("a", "b", "c", "c"));
System.out.println(Multimaps.forMap(map));

final Multimap<String, String> expected = ArrayListMultimap.create();
for (Map.Entry<String, Collection<String>> entry : map.entrySet()) {
    expected.putAll(entry.getKey(), entry.getValue());
}
System.out.println(expected);

第一个结果是,但我期望{1=[[a, b, c, c]]}{1=[a, b, c, c]}


答案 1

假设你有

Map<String, Collection<String>> map = ...;
Multimap<String, String> multimap = ArrayListMultimap.create();

那么我相信这是你能做的最好的

for (String key : map.keySet()) {
  multimap.putAll(key, map.get(key));
}

或更优化,但更难阅读

for (Entry<String, Collection<String>> entry : map.entrySet()) {
  multimap.putAll(entry.getKey(), entry.getValue());
}

答案 2

这个问题有点老了,但我想我会给出一个更新的答案。使用Java 8,你可以做一些事情,比如

ListMultimap<String, String> multimap = ArrayListMultimap.create();
Map<String, Collection<String>> map = ImmutableMap.of(
                           "1", Arrays.asList("a", "b", "c", "c"));
map.forEach(multimap::putAll);
System.out.println(multimap);

这应该给你,如你所愿。{1=[a, b, c, c]}


推荐