平面表结构 -- Table

2017-04-12 13:41:44   最后更新: 2017-04-12 13:41:44   访问数量:173




在前面的博文中,我们介绍了 guava 的 Multimap 容器

Key 可重复的 Map -- Multimap

Multimap 是一种键可重复出现的 Map 容器,可以看作是实现了 Map<K, List<V>> 功能的容器

在实际的使用中,有时我们还需要 Map<K, Map<T, V>> 这样的结构,例如,我们的一个超市中有多个货架,货架上有水果,我们需要通过货架 ID、对应货架上的水果 ID 获取到某种水果的信息,这样的数据结构如果用 Map<K, Map<T, V>> 这样的容器来存储和表示就显得非常丑陋了

Guava 提供的 Table 容器解决了这个问题

Guava 的 Table 是一个三元组,每一条记录需要用两个 Key 进行索引,也可以看做是一个 Map<K, Map<T, V>> 结构,每一个 V 的确定都必须提供 K 和 T 类型的两个键值

但是,Table<R, C, V> 比 Map<K, Map<T, V>> 要更加灵活,从 Table 的名字可以看出,Table 实际上是一个表的结构,R (row) 指定了表的横坐标,C (column) 指定了表的纵坐标

 

如上所述,Table<R, C, V> 描述了一个表结构,因此他提供了这张表的行、列等各种操作:

Table 提供的方法
方法说明
boolean contains(R r, C c)判断表中的某个点是否存在
boolean containsRow(R r)判断表中是否存在对应行
boolean containsColumn(C c)判断表中是否存在对应列
boolean containsValue(V v)判断表中是否存在对应的值
V get(R r, C c)获取表中对应行列上的值
boolean size()返回表中值的个数
void clear()清空表
V put(R r, C c, V v)在对应点插入数据
void putAll(Table var1)将传入的 Table 的所有元素插入当前 Table 中
V remove(R r, C c)删除表中对应点
Map row(R var1)获取指定行
Map column(C var1)获取指定列
Set> cellSet()获取 Cell 的 Set,用于遍历
Set rowKeySet()获取行坐标构成的 Set
Set columnKeySet()获取列坐标构成的 Set
Collection values()获取值的集合
Map> rowMap()获取对应的 Map> 结构
Map> columnMap()获取对应的 Map> 结构

 

上面介绍的 Table 中的方法中包含了 cellSet() 方法,它返回的 Table.Cell<R, C, V> 类型与 Map.Entry 类型非常类似,也是用于遍历的:

public interface Cell<R, C, V> { @Nullable R getRowKey(); @Nullable C getColumnKey(); @Nullable V getValue(); boolean equals(@Nullable Object var1); int hashCode(); }

 

 

Table 是一个接口,定义了上述的一系列操作,他拥有以下实现类:

Table 的实现类
实现底层 Map 实现
HashBasedTableHashMap>
TreeBasedTableTreeMap>
ImmutableTableImmutableMap>
ArrayTable通过二维数组实现,必须在构建时提供行列的大小

 

package com.techlog.test.testspring.service; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table; import java.util.Arrays; import java.util.List; import java.util.Map; /** * Created by techlog on 2017/4/3. */ public class WorkMain { private final static List<Fruit> FRUITS = Arrays.asList(new Fruit(101, "apple", 1), new Fruit(102, "bnana", 1), new Fruit(103, "apple", 2), new Fruit(104, "pear", 3), new Fruit(105, "pear", 1), new Fruit(106, "watermellon", 2), new Fruit(107, "orange", 3), new Fruit(108, "tomato", 2), new Fruit(109, "tomato", 3) ); public static void main(String[] argv) { Table<Long, Long, Fruit> fruitTable = HashBasedTable.create(); for (Fruit fruit : FRUITS) { fruitTable.put(fruit.getWerahouseId(), fruit.getId(), fruit); } for (Long warehouseId : fruitTable.rowKeySet()) { Map<Long, Fruit> fruitMap = fruitTable.row(warehouseId); System.out.println(warehouseId + " 号库区存放有如下水果:"); for (Map.Entry<Long, Fruit> fruitEntry : fruitMap.entrySet()) { System.out.println("水果 id: " + fruitEntry.getKey() + ", 水果名称: " + fruitEntry.getValue().getName()); } System.out.println(""); } } } class Fruit { private long id; private String name; private long werahouseId; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getWerahouseId() { return werahouseId; } public void setWerahouseId(long werahouseId) { this.werahouseId = werahouseId; } Fruit(long fruitId, String name, long werahouseId) { this.name = name; this.werahouseId = werahouseId; this.id = fruitId; } }

 

 

打印出了:

1 号库区存放有如下水果:

水果 id: 101, 水果名称: apple

水果 id: 102, 水果名称: bnana

水果 id: 105, 水果名称: pear

 

2 号库区存放有如下水果:

水果 id: 103, 水果名称: apple

水果 id: 106, 水果名称: watermellon

水果 id: 108, 水果名称: tomato

 

3 号库区存放有如下水果:

水果 id: 104, 水果名称: pear

水果 id: 107, 水果名称: orange

水果 id: 109, 水果名称: tomato

 






技术帖      龙潭书斋      容器      java      column      面向对象      map      table      google      guava      row     


京ICP备15018585号