Table 接口
Table 代表一个特殊的映射,其中两个键可以在组合的方式被指定为单个值。它类似于创建映射的映射。
通常来说,当你想使用多个键做索引的时候,你可能会用类似 Map<FirstName, Map<LastName, Person>>
的实现,这种方式很丑陋,使用上也不友好。
Guava为此提供了新集合类型 Table
,它有两个支持所有类型的键:”行”和”列”,类似效果:Map
--> Table
--> rowKey+columnKye+value
一、接口声明
以下是 com.google.common.collect.Table<R,C,V>
接口的声明:
@GwtCompatiblepublic interface Table<R, C, V> {
R - the type of the table row keys
C - the type of the table column keys
V - the type of the mapped values
1、子接口:
RowSortedTable
2、实现类:
Table 有如下几种实现:
HashBasedTable
:本质上用HashMap<R, HashMap<C, V>>
实现;TreeBasedTable
:本质上用TreeMap<R, TreeMap<C,V>>
实现;ImmutableTable
:本质上用ImmutableMap<R, ImmutableMap<C, V>>
实现;注:ImmutableTable对稀疏或密集的数据集都有优化。ArrayTable
:要求在构造时就指定行和列的大小,本质上由一个二维数组实现,以提升访问速度和密集Table的内存利用率。ArrayTable与其他Table的工作原理有点不同,请参见Javadoc了解详情。
二、接口方法
修饰符和类型 | 方法描述 |
---|---|
Set<Table.Cell<R,C,V>> | cellSet() 返回以 Table.Cell |
void | clear() 删除Table中所有的行列映射关系. |
Map<R,V> | column(C columnKey) 返回指定columnKey下的所有rowKey与value映射. |
Set<C> | columnKeySet() 返回所有的columnKey. |
Map<C,Map<R,V>> | columnMap() 返回已columnKey为外层map键值的Map<r,map |
boolean | contains(@Nullable Object rowKey, @Nullable Object columnKey) 判断Table中是否存在指定行列值的映射关系. |
boolean | containsColumn(@Nullable Object columnKey) 判断Table中是否存在列值. |
boolean | containsRow(@Nullable Object rowKey) 判断Table中是否存在行值. |
boolean | containsValue(@Nullable Object value) 判断Table中是否包含指定的value值. |
boolean | equals(@Nullable Object obj) Compares the specified object with this table for equality. |
V | get(@Nullable Object rowKey, @Nullable Object columnKey) 根据行值和列值获取value值. |
int | hashCode() 返回此表的哈希码. |
boolean | isEmpty() 如果表不包含映射,则返回true. |
V | put(R rowKey, C columnKey, V value) 在指定row和column处放入value值. |
void | putAll(Table<? extends R,? extends C,? extends V> table) 将指定表中的所有映射复制到此表. |
V | remove(@Nullable Object rowKey, @Nullable Object columnKey) 删除指定行列的value值. |
Map<C,V> | row(R rowKey) 返回指定rowKey下的所有columnKey与value映射. |
Set<R> | rowKeySet() 返回所有的rowKey. |
Map<R,Map<C,V>> | rowMap() 返回以rowkey为外层map键值的Map<r,map |
int | size() 返回表中的行键/列键/值映射的数量. |
Collection<V> | values() 返回各行各列中所有的value值. |
三、示例
public class TableTest extends TestCase { /** * 双键的 Map --> Table --> rowKey+columnKye+value */ @Test public void test1() { Table<Object, Object, Object> table = HashBasedTable.create(); table.put("jack", "java", 98); table.put("jack", "php", 65); table.put("jack", "ui", 80); table.put("jack", "mysql", 86); // 遍历 Set<Table.Cell<Object, Object, Object>> cells = table.cellSet(); cells.forEach(c -> System.out.println(c.getRowKey() + "-" + c.getColumnKey() + " : " + c.getValue())); /** * 执行结果 * * jack-java : 98 * jack-php : 65 * jack-ui : 80 * jack-mysql : 86 */ } public void test2() { //Table<R,C,V> == Map<R,Map<C,V>> /* * Company: IBM, Microsoft, TCS * IBM -> {101:Mahesh, 102:Ramesh, 103:Suresh} * Microsoft -> {101:Sohan, 102:Mohan, 103:Rohan } * TCS -> {101:Ram, 102: Shyam, 103: Sunil } * * */ Table<String, String, String> table = HashBasedTable.create(); // 使用员工详细信息初始化表 table.put("IBM", "101", "Mahesh"); table.put("IBM", "102", "Ramesh"); table.put("IBM", "103", "Suresh"); table.put("Microsoft", "111", "Sohan"); table.put("Microsoft", "112", "Mohan"); table.put("Microsoft", "113", "Rohan"); table.put("TCS", "121", "Ram"); table.put("TCS", "122", "Shyam"); table.put("TCS", "123", "Sunil"); // 获取与IBM对应的Map Map<String, String> ibmMap = table.row("IBM"); System.out.println("IBM员工名单"); for (Map.Entry<String, String> entry : ibmMap.entrySet()) { System.out.println("Emp Id: " + entry.getKey() + ", Name: " + entry.getValue()); } System.out.println(); // 获取表格的所有唯一键 Set<String> employers = table.rowKeySet(); System.out.print("Employers: "); employers.forEach(e -> System.out.print(e + " ")); System.out.println("\n"); // 得到一个对应102的Map Map<String, String> EmployerMap = table.column("102"); for (Map.Entry<String, String> entry : EmployerMap.entrySet()) { System.out.println("Employer: " + entry.getKey() + ", Name: " + entry.getValue()); } } public void test3() { Table<String, Integer, Integer> table = HashBasedTable.create(); 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(); } } }
四、相关文章
未经允许请勿转载:程序喵 » Google Guava 快速入门 —— 【新集合】Table 类