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

我没有find这样的多图构build…当我想要这样做时,我遍历地图,并填充多图。 还有其他的方法吗?

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]}

假设你有

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

这是我为我的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; } 

和一个不可变的版本:

 /** * 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(); } 

这个问题有点老,但我想我会给一个更新的答案。 使用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]}

更新:对于你所要求的,我认为你将需要回落到Multimap.putAll

下面的代码没有Google的Guava库。 它被用作键值和sorting顺序的双重值

 Map<Double,List<Object>> multiMap = new TreeMap<Double,List<Object>>(); for( int i= 0;i<15;i++) { List<Object> myClassList = multiMap.get((double)i); if(myClassList == null) { myClassList = new ArrayList<Object>(); multiMap.put((double) i,myClassList); } myClassList.add("Value "+ i); } List<Object> myClassList = multiMap.get((double)0); if(myClassList == null) { myClassList = new ArrayList<Object>(); multiMap.put( (double) 0,myClassList); } myClassList.add("Value Duplicate"); for (Map.Entry entry : multiMap.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " +entry.getValue()); }