Guava常用的集合扩展

做过Java开发的码农,应该对Guava库非常熟悉。Guava是由谷歌开源的Java库,Guava库日益强大,涉及到Java开发的方方面面,用以帮助Java码农更高效的开发。

​ 此篇来介绍下Guava包中常用的几种对Java集合的扩展。

Multimap

​ 这是对Map的扩展,Map是一对一的映射,一键对一值,那当我们想一键对应多个值时怎么办?

​ 由于Map的值是Object类型,所以我们肯定写过Map<String, List<Map<String, Object>>这种结构,这确实可以达到目的。

但是这种结构写起来很繁杂,大家应该有所感触。

此处仅以HashMultimap实现类当做示例:

public void test1() {
  Multimap<String, String> map = HashMultimap.create();
  map.put("language", "Java");
  map.put("language", "php");
  map.put("language", "python");
  map.put("language", "c++");
  log.info("编程语言: {}", map.get("language"));
}

输出:

guava.MultiMapTest - 编程语言: [Java, php, python, c++]

返回的是一个集合;该map的其他方法都见名知意,易于使用。

BiMap

​ 通常使用Map结构都是通过键查找对应的值,对于要通过值查找键就必须循环比较了;

BiMap此类型就提供了keyvalue的双向映射,便于通过value查找key,要注意的是BiMap结构要求keyvalue都是唯一的。

此处仅以HashBiMap实现类作为示例:

public void test2() {
  BiMap<String, String> biMap = HashBiMap.create();
  biMap.put("language", "Java");
  // 同key时, value会覆盖之前的
  biMap.put("language", "php");
  // 同value时, key强制覆盖之前的
  biMap.forcePut("test", "Java");
  System.out.println("原始BiMap -- " + biMap);

  BiMap<String, String> inverse = biMap.inverse();
  System.out.println("inverse翻转之后 -- " + inverse);
}

输出:

原始BiMap -- {language=php, test=Java}
inverse翻转之后 -- {php=language, Java=test}

Table

​ Map提供了一对一的映射,Table则提供二对一的映射

此处仅以HashBasedTable实现类为示例:

public void test3() {
  Table<String, String, Object> table = HashBasedTable.create();
  table.put("row1", "column1", "value1");
  table.put("row1", "column2", "value2");
  table.put("row1", "column3", "value3");
  Map<String, Object> row1 = table.row("row1");
  System.out.println("根据rowKey取值 --  " + row1);

  Map<String, Object> column1 = table.column("column1");
  System.out.println("根据columnKey取值  -- " + column1);
}

输出:

根据rowKey取值 --  {column1=value1, column2=value2, column3=value3}
根据columnKey取值  -- {row1=value1}

Multiset

multiset可获取某个元素的个数

public void test5() {
  Multiset<String> multiset = HashMultiset.create();
  multiset.add("a");
  multiset.add("b");
  multiset.add("a");
  System.out.println("multiset集合  -- " + multiset);
  System.out.println("multiset大小  -- " + multiset.size());
  System.out.println("a个数 -- " + multiset.count("a"));
  System.out.println("b个数 -- " + multiset.count("b"));
}

输出:

multiset集合  -- [a x 2, b]
multiset大小  -- 3
a个数 -- 2
b个数 -- 1
上一篇:P2869 [USACO07DEC]Gourmet Grazers G


下一篇:set/multiset