[英]How to create a Multimap<K,V> from a Map<K, Collection<V>>?
我沒有找到這樣的多圖構造......當我想這樣做時,我遍歷地圖,並填充多圖。 還有其他方法嗎?
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());
}
這個問題有點老了,但我想我會給出一個更新的答案。 使用 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]}
。
這是我為我的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();
}
更新:對於您所問的問題,我認為您將需要回到Multimap.putAll
。
您可以使用com.google.common.collect.Multimaps.flatteningToMultimap
作為您的流收集器。
給定地圖:
Map<Integer, Collection<String>> map = Map.of(
1, List.of("a", "b", "c"),
2, List.of("d", "e", "f"));
您可以執行以下操作:
Multimap<Integer, String> multimap = map.entrySet().stream()
.collect(flatteningToMultimap(Map.Entry::getKey, it -> it.getValue().stream(), HashMultimap::create));
以下代碼沒有 Google 的 Guava 庫。 它用於雙值作為鍵和排序順序
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());
}
LinkedListMultimap<String, String> mm = map.entrySet()
.stream()
.collect(
() -> LinkedListMultimap.create(map.size()),
(m, e) -> m.putAll(e.getKey(), e.getValue()),
(m1, m2) -> m1.putAll(m2));
還有另一種方法可以使用: Multimaps#newMultimap
如果您使用的是擴展List
或Set
,文檔建議使用特殊方法Multimaps#newListMultimap
和Multimaps#newSetMultimap
。
Multimaps.newListMultimap(myMap, ArrayList::new);
Multimaps.newSetMultimap(myMap, HashSet::new);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.