文档章节

Guava新集合-Table

Kevin-air
 Kevin-air
发布于 2016/08/05 13:53
字数 521
阅读 27
收藏 0

当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的Map<FirstName, Map<LastName, Person>>来实现。为此Guava提供了一个新的集合类型-Table集合类型,来支持这种数据结构的使用场景。Table支持“row”和“column”,而且提供多种视图。 

示例

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import org.junit.Test;
import java.util.Map;

/**
 * @author Kevin
 * @description
 * @date 2016/8/5
 */
public class TableTest {

    @Test
    public void TableTest() {
        // Map<String,Map<Integer,String>> map;
        // 第一个String为rowKey
        // Integer为columnKey
        // 第二个String为value
        Table<String, Integer, String> aTable = HashBasedTable.create();

        for (char a = 'A'; a <= 'C'; ++a) {
            for (Integer b = 1; b <= 3; ++b) {
                aTable.put(Character.toString(a), b, String.format("%c%d", a, b));
            }
        }
        // init table data
        // {
        //  A={1=A1,2=A2,3=A3},
        //  B={1=B1,2=B2,3=B3},
        //  C={1=C1,2=C2,3=C3}
        // }

        // {A=A2, B=B2, C=C2}
        System.out.println(aTable.column(2));
        // {1=B1, 2=B2, 3=B3}
        System.out.println(aTable.row("B"));
        // B2
        System.out.println(aTable.get("B", 2));
        // false
        System.out.println(aTable.contains("D", 1));
        // true
        System.out.println(aTable.containsColumn(3));
        // true
        System.out.println(aTable.containsRow("C"));

        // 以column为key返回map
        Map<Integer, Map<String, String>> columnMap = aTable.columnMap();
        // {1={A=A1, B=B1, C=C1}, 2={A=A2, B=B2, C=C2}, 3={A=A3, B=B3, C=C3}}
        System.out.println(columnMap);

        // {A={1=A1, 2=A2, 3=A3}, B={1=B1, 2=B2, 3=B3}, C={1=C1, 2=C2, 3=C3}}
        System.out.println(aTable.rowMap());

        // B3
        System.out.println(aTable.remove("B", 3));
    }
}

 Table视图: 
  rowMap()返回一个Map<R, Map<C, V>>的视图。rowKeySet()类似地返回一个Set<R>。 
  row(r)返回一个非null的Map<C, V>。修改这个视图Map也会导致原表格的修改。 
  和列相关的方法有columnMap(), columnKeySet()和column(c)。(基于列的操作会比基于行的操作效率差些) 
  cellSet()返回的是以Table.Cell<R, C, V>为元素的Set。这里的Cell就类似Map.Entry,但是它是通过行和列来区分的。

  Table有以下实现: 
  HashBasedTable:基于HashMap<R, HashMap<C, V>>的实现。 
  TreeBasedTable:基于TreeMap<R, TreeMap<C, V>>的实现。 
  ImmutableTable:基于ImmutableMap<R, ImmutableMap<C, V>>的实现。(注意,ImmutableTable已对稀疏和密集集合做了优化) 
  ArrayTable:ArrayTable是一个需要在构建的时候就需要定下行列的表格。这种表格由二维数组实现,这样可以在密集数据的表格的场合,提高时间和空间的效率。

© 著作权归作者所有

共有 人打赏支持
Kevin-air
粉丝 14
博文 73
码字总数 26587
作品 0
深圳
私信 提问
Guava集合-不可变集合

JDK的Collections.unmodifiableXXX方法实现不可变集合的一些问题:   1.它用起来笨拙繁琐你不得不在每个防御性编程拷贝的地方用这个方法   2.它不安全:如果有对象reference原始的被封装...

Kevin-air
2016/08/04
12
0
Guava一些高效类的使用实践

guava是google的一个强大的工具包,目前已经更新到版本22 https://github.com/google/guava,一直有断断续续的用过一些方法,但是没有系统的撸一遍所有功能 今天参考并发编程网记录一些高效的...

zimingforever
2017/06/15
0
0
Guava用法(一)

Guava用法(一) 前置条件检查:checkArgument,checkElementIndex,checkPositionIndexes几个比较有用的方法使用。 ComparisonChain链式比较器,减少了部分if/else的循环 Java,多个键做索引的...

年少爱追梦
2016/12/26
28
0
Google Guava 笔记

一、引言 Guava 是 google 几个java核心类库的集合,包括集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common ...

qllinhongyu
2014/09/18
0
0
guava集合下四 -新的集合类型

guava中产生了jdk中没有的新集合,而且是广泛使用的,这些都能和jdk中集合框架共存,没有将这些硬结合到jdk的抽象集合。 通常,guava集合实现了jdk的接口,紧密的结合到了一起 Multiset 和传...

writeademo
2018/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
0
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
1
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
3
0
Java并发编程:深入剖析ThreadLocal

ThreadLocal 的理解 ThreadLocal,很多地方叫线程本地变量,或线程本地存储。ThreadLocal为变量在每个线程中都创建了一个副本,每个线程可以访问自己内部的副本变量。===》解决的问题是线程间...

细节探索者
昨天
1
0
【Python3之异常处理】

一、错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^SyntaxError: invalid...

dragon_tech
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部