Guava-Multimap

Multimap

参考

multimap

工作中频繁的要实现Map\

a -> 1
a -> 2
b -> 3
  • 可将其视为单值key到一个collection,正如:
a -> [1, 2, 4]
b -> [3]
c -> [5]

其中第一种的理解更恰当,下面的分析基于此。

Construction

最常使用的是ListMultimapSetMultimap, keys分别map到ListSet

Construction

创建Multimap最直接的方法是用MultimapBuilder,可以直接配置keys和values的形式:

// creates a ListMultimap with tree keys and array list values
ListMultimap<String, Integer> treeListMultimap =
    MultimapBuilder.treeKeys().arrayListValues().build();

// creates a SetMultimap with hash keys and enum set values
SetMultimap<Integer, MyEnum> hashEnumMultimap =
    MultimapBuilder.hashKeys().enumSetValues(MyEnum.class).build();

也可以用实现类的create()方法,相比更推荐使用MultimapBuilder

Modifying

[Multimap.get(key)](http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Multimap.html#get-K-) 返回响应key的values的一个view。对于ListMultimap返回List,对于SetMultimap返回Set
修改Multimap:

Set<Person> aliceChildren = childrenMultimap.get(alice);
aliceChildren.clear();
aliceChildren.add(bob);
aliceChildren.add(carol);

其他修改方法

SignatureDescriptionEquivalent
put(K,V)添加一个valuemultimap.get(key).add(value)
putAll(K, Iterable)在key下放入每个valuesIterables.addAll(multimap.get(key), values)
remove(K, V)从key下移除一个valuemultimap.get(key).remove(value)
removeAll(K)Removes all values associated with the key key.Once this method returns, key will not be mapped to any values, so it will not appear in keySet(), asMap(), or any other views.multimap.get(key).clear()
replaceValues(K, Iterable)multimap.get(key).clear(); Iterables.addAll(multimap.get(key), values)

Views

支持一些很有用的views:

  • asMapMultimap<K, V>视为Map<K, Collection<V>>,返回这个Map支持remove,可以修改返回的这个map,但不支持putputAll。对于不存在key asMap().get(key)将返回null。不可将asMap.get(key)的返回值cast成为对于Set–>SetMultimap,对于List–>ListMulitmap,不支持从ListMultimap到Map

Multimap Is Not A Map

  • Multimap.get(key) 返回non-null,可能是一个空的collection,为了让我们可以放入我们想放入的值
  • 如果更想像Map 一样,返回null,使用asMap 返回一个Map<K, Collection<V>>
  • Multimap.containsKey(key) 只有在该key确实有对应的values时才返回true
  • Multimap.entries() 返回Multimap的所有keys的entries,如果想返回所有key-collection entries,使用asMap.entrySet()
  • Multimap.size() 返回所有entries的数,不是keys去重数,若需要,使用Multimap.keySet().size()返回keys去重数

Implementations

提供很多实现类,在使用Map<K, Collection<V>>的场景中选择使用

ImplementationKeys behave like…Values behave like..
ArrayListMultimapHashMapArrayList
HashMultimapHashMapHashSet
LinkedListMultimap *LinkedHashMap“*LinkedList“*
LinkedHashMultimap**LinkedHashMapLinkedHashSet
TreeMultimapTreeMapTreeSet
ImmutableListMultimapImmutableMapImmutableList
ImmutableSetMultimapImmutableMapImmutableSet

除了immutable实现,其他实现支持null keys和values
\* LinkedListMultimap.entries() 保留non-distinct key values的迭代顺序
** LinkedHashMultimap 保留keys 和values的插入顺序

API

更多信息见API

应用示例

package com.learn.google.guava.ImmutableCollections;

import com.google.common.collect.ListMultimap;
import com.google.common.collect.MultimapBuilder;
import com.google.common.collect.Multiset;

import java.util.Map;

public class MultimapTest {
  public static void main(String[] args) {

    ListMultimap<String, String> hashArrayListMultimap = MultimapBuilder.hashKeys().arrayListValues().build();
    hashArrayListMultimap.put("beijing","haidian");
    hashArrayListMultimap.put("beijing","chaoyang");
    hashArrayListMultimap.put("shannxi","xi'an");

    for (Map.Entry<String, String> entry : hashArrayListMultimap.entries()) {
      System.out.println("key = " + entry.getKey() + "--->" + "value=" + entry.getValue() );
    }

    Multiset<String>  keys = hashArrayListMultimap.keys();
    System.out.print("\nkeys[");
    for (String key : keys) {
      System.out.print(key + " ");
    }
    System.out.println("]");

    //输出:
    //key = shannxi--->value=xi'an
    //key = beijing--->value=haidian
    //key = beijing--->value=chaoyang
    //keys[shannxi beijing beijing ]
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值