Google Guava 快速入门 —— 【新集合】Table 类

Google Guava 快速入门.jpg

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了解详情。

二、接口方法

官方文档:https://google.github.io/guava/releases/27.0.1-jre/api/docs/src-html/com/google/common/collect/Table.html

修饰符和类型方法描述
Set<Table.Cell<R,C,V>>cellSet() 
返回以 Table.Cell 为元素的Set集合,类似于 Map.entrySet.
voidclear() 
删除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>.
booleancontains(@Nullable Object rowKey, @Nullable Object columnKey) 
判断Table中是否存在指定行列值的映射关系.
booleancontainsColumn(@Nullable Object columnKey) 
判断Table中是否存在列值.
booleancontainsRow(@Nullable Object rowKey) 
判断Table中是否存在行值.
booleancontainsValue(@Nullable Object value) 
判断Table中是否包含指定的value值.
booleanequals(@Nullable Object obj) 
Compares the specified object with this table for equality.
Vget(@Nullable Object rowKey, @Nullable Object columnKey) 
根据行值和列值获取value值.
inthashCode() 
返回此表的哈希码.
booleanisEmpty() 
如果表不包含映射,则返回true.
Vput(R rowKey, C columnKey, V value) 
在指定row和column处放入value值.
voidputAll(Table<? extends R,? extends C,? extends V> table) 
将指定表中的所有映射复制到此表.
Vremove(@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>.
intsize() 
返回表中的行键/列键/值映射的数量.
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 类

点  赞 (0) 打  赏
分享到: