guava中集合(3)

215 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

3.2、Multimap

3.2.1、本质

Multimap是把键映射到任意多个值的一般方式,本质上和map非常相似: Map<K, Collection>,

a → [1, 2,2,1] b → <1,2,3>

3.2.2、常用实现

有Map<K, List>、Map<K, Set> 等多种实现

  • ArrayListMultimap
  • HashMultimap
  • LinkedListMultimap
  • LinkedHashMultimap
  • TreeMultimap

3.2.3、常用方法

image.png

3.2.4、代码示例

HashMultimap<String,String> hashMultimap =  HashMultimap.create();
hashMultimap.put("T1","北京");
hashMultimap.put("T1","上海");
hashMultimap.put("T2","天津");
hashMultimap.put("T3","苏州");
hashMultimap.put("L1","洛阳");
// {T1=[上海, 北京], T2=[天津]}
System.out.println(hashMultimap);

HashMultimap<String,String> hashMultimap2 =  HashMultimap.create();
hashMultimap2.put("T2","杭州");
hashMultimap.putAll(hashMultimap2);
// {T1=[上海, 北京], T2=[杭州, 天津]}
System.out.println(hashMultimap);

// 删除指定key的指定value
hashMultimap.remove("T2","杭州");
// {L1=[洛阳], T1=[上海, 北京], T2=[天津], T3=[苏州]}
System.out.println(hashMultimap);
// 删除指定key全部值
hashMultimap.removeAll("T3");
// {L1=[洛阳], T1=[上海, 北京], T2=[天津]}
System.out.println(hashMultimap);
// 获取指定key对应的集合 [上海, 北京]
System.out.println(hashMultimap.get("T1"));
// [L1=洛阳, T1=上海, T1=北京, T2=天津]
System.out.println(hashMultimap.entries());
// [L1=[洛阳], T1=[上海, 北京], T2=[天津]]
System.out.println(hashMultimap.asMap().entrySet());
// 4
System.out.println(hashMultimap.size());
// 3
System.out.println(hashMultimap.keySet().size());

3.3、BiMap

3.2.1、本质

BiMap<K, V>是特殊的Map,inverse方法可以反转BiMap<K, V>的键反向映射,实现K-V、V-K双向映射。

3.2.2、常用实现

  • HashBiMap
  • EnumBiMap
  • EnumHashBiMap

3.2.3、常见方法

BiMap的方法相对简单 image.png

3.2.4、代码示例

/**
 * 一般情况下,当我们需要维护一个双向kv的时候,可能需要创建两个map
 *
 *  Map<String, Integer> nameToId = Maps.newHashMap();
 *  Map<Integer, String> idToName = Maps.newHashMap();
 *
 *
 *  nameToId.put("Bob", 42);
 *  idToName.put(42, "Bob");
 *
 */
    BiMap<String, String> school = HashBiMap.create();
    school.put("北京","010");
    school.put("上海","021");
    // {北京=010, 上海=021}
    System.out.println(school);
    BiMap<String, String> school2 = HashBiMap.create();
    school2.put("郑州","0371");
    //school2.forcePut("郑州","0371");
    school.putAll(school2);
    // {北京=010, 上海=021, 郑州=0371}
    System.out.println(school);
    
    BiMap<String, String> inverseSchool =  school.inverse();
    // {010=北京, 021=上海, 0371=郑州}
    System.out.println(inverseSchool);
    // [北京, 上海, 郑州]
    System.out.println(inverseSchool.values());