链接地址:http://www.xx566.com/detail/147.html
上一篇,我们学习了Collections(六)BiMap与HashBiMap,BiMap 是一种特殊的key-value双向关联的数据结构,通过BiMap我们可以通过键值获取value值,是对Map的逆向设计,本篇继续进行Guava Collections库的学习,学习一种Guava新定义的数据结构:Table,主要是用来解决 Map<R,Map<C,V>>这种复杂集合的遍历及value的获取。
Table类似于关系型数据库的表结构或二维表格:有行和列,行和列唯一确定一个记录值。Table是Guava定义的一个接口,是一种由一对键值唯一确 定一个value值的数据结构,行值RowKey,列值ColumnKey和value值。翻开源码,我们看到Table内部维护了一个Cell接 口,Cell接口是用于快速获取rowKey和columnKey和value的入口,类似于Map中的Map.Entry。接下来,我们简单的说明一下 接口中各个方法的作用,如下:
contains(@Nullable Object rowKey, @Nullable Object columnKey):判断Table中是否存在指定行列值的映射关系
containsRow(@Nullable Object rowKey):判断Table中是否存在行值
containsColumn(@Nullable Object columnKey):判断Table中是否存在列值
containsValue(@Nullable Object value):判断Table中是否包含指定的value值
clear():删除Table中所有的行列映射关系
get(@Nullable Object rowKey, @Nullable Object columnKey):根据行值和列值获取value值
put(R rowKey, C columnKey, V value):在指定row和column处放入value值
remove(@Nullable Object rowKey, @Nullable Object columnKey):删除指定行列的value值
row(R rowKey):返回指定rowKey下的所有columnKey与value映射
column(C columnKey):返回指定columnKey下的所有rowKey与value映射
cellSet():返回以Table.Cell<R, C, V>为元素的Set集合,类似于Map.entrySet
rowKeySet():返回所有的rowKey
columnKeySet():返回所有的columnKey
values():返回各行各列中所有的value值
rowMap():返回以rowkey为外层map键值的Map<R,Map<C,V>>
columnMap():返回已columnKey为外层map键值的Map<R,Map<C,V>>
与Map接口的重要实现HashMap一样,Table接口也有的一种重要实现HashBasedTable,翻开源码,内部提供了create()静态工厂方法的实现和一些重要的方法,如下:
create():返回一个空的HashBasedTable
create( int expectedRows, int expectedCellsPerRow):构造具有期望行列值的Table映射关系的HashBasedTable
create( Table<? extends R, ? extends C, ? extends V> table):构造与指定Table有相同行列映射关系的HashBasedTable
contains( @Nullable Object rowKey, @Nullable Object columnKey):Table中是否存在指定rowKey和columnKey的映射关系
containsColumn(@Nullable Object columnKey):Table中是否包含指定的columnkey
containsRow(@Nullable Object rowKey):Table中是否包含指定的rowKey
containsValue(@Nullable Object value):Table中是否包含指定的value
get(@Nullable Object rowKey, @Nullable Object columnKey):获取Table中指定行列值的映射关系
remove( @Nullable Object rowKey, @Nullable Object columnKey):删除Table中指定行列值的映射关系
最后,我们简单的通过一段代码来学习一下Table提供的APIs,代码如下:
package guava; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table; import org.junit.Test; import java.util.Map; import java.util.Set; /** * Table:Map<R,Map<C,V>>数据结构 * User: Realfighter * Date: 2014/10/14 * Time: 22:07 */ public class TableTest { @Test public void testTable() { //create():返回一个空的HashBasedTable Table<String, Integer, Integer> table = HashBasedTable.create(); /** * put(R rowKey, C columnKey, V value): * 在指定row和column处放入value值 */ table.put("A", 1, 100); table.put("A", 2, 101); table.put("B", 1, 200); table.put("B", 2, 201); /** * contains(Object rowKey, Object columnKey): * Table中是否存在指定rowKey和columnKey的映射关系 */ boolean containsA3 = table.contains("A", 3); //false boolean containColumn2 = table.containsColumn(2); //true boolean containsRowA = table.containsRow("A"); //true boolean contains201 = table.containsValue(201); //true /** * remove(Object rowKey,Object columnKey): * 删除Table中指定行列值的映射关系 */ table.remove("A", 2); /** * get(Object rowKey, Object columnKey): * 获取Table中指定行列值的映射关系 */ table.get("B", 2); /** * column(C columnKey):返回指定columnKey下的所有rowKey与value映射 */ Map<String, Integer> columnMap = table.column(2); /** * row(R rowKey):返回指定rowKey下的所有columnKey与value映射 */ Map<Integer, Integer> rowMap = table.row("B"); /** * 返回以Table.Cell<R, C, V>为元素的Set集合 * 类似于Map.entrySet */ Set<Table.Cell<String, Integer, Integer>> cells = table.cellSet(); for (Table.Cell<String, Integer, Integer> cell : cells) { //获取cell的行值rowKey cell.getRowKey(); //获取cell的列值columnKey cell.getColumnKey(); //获取cell的值value cell.getValue(); } } }