如何从Map <K,Collection <V >>创建Multimap <K,V>?

sly*_*7_7 43 java multimap guava

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

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);
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*ion 47

假设你有

Map<String, Collection<String>> map = ...;
Multimap<String, String> multimap = ArrayListMultimap.create();
Run Code Online (Sandbox Code Playgroud)

然后我相信这是你能做的最好的事情

for (String key : map.keySet()) {
  multimap.putAll(key, map.get(key));
}
Run Code Online (Sandbox Code Playgroud)

或者更优化,但更难阅读

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

  • 这正是我所做的!请注意,正如Kevin在此处指出的那样http://groups.google.com/group/guava-discuss/browse_thread/thread/255cabbcc70925b3 Multimap是一个Map,然后如果在原始Map中,你有一个空的iterable然后,条目"<key,EMPTY_LIST>"将不会添加到multimap中 (2认同)

Dan*_*iuc 8

这是我为StuffGuavaIsMissing类编写的有用的通用版本.

/**
 * Creates a Guava multimap using the input map.
 */
public static <K, V> Multimap<K, V> createMultiMap(Map<K, ? extends Iterable<V>> input) {
  Multimap<K, V> multimap = ArrayListMultimap.create();
  for (Map.Entry<K, ? extends Iterable<V>> entry : input.entrySet()) {
    multimap.putAll(entry.getKey(), entry.getValue());
  }
  return multimap;
}
Run Code Online (Sandbox Code Playgroud)

一个不可变的版本:

/**
 * Creates an Immutable Guava multimap using the input map.
 */
public static <K, V> ImmutableMultimap<K, V> createImmutableMultiMap(Map<K, ? extends Iterable<V>> input) {
  ImmutableMultimap.Builder<K, V> builder = ImmutableMultimap.builder();
  for (Map.Entry<K, ? extends Iterable<V>> entry : input.entrySet()) {
    builder.putAll(entry.getKey(), entry.getValue());
  }
  return builder.build();
}
Run Code Online (Sandbox Code Playgroud)

  • @Michael嗯我无法想象很多事情*比互联网上发布的免费开源代码片段更不灵活:) (2认同)

Dil*_*ing 7

这个问题有点旧,但我想我会给出一个更新的答案.使用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);
Run Code Online (Sandbox Code Playgroud)

{1=[a, b, c, c]}根据需要,这应该给你.