代码编织梦想

Guava Table 示例教程

本文带你学习Guava Table 接口及其实现。Guava Table 是类似表格结构的集合,包含行、列以及相应的单元格值。行和列作为有序的键。

概述

如果把Guava Table和java核心类中的集合进行比较,则为行map,且每行包含列map,其中有对应的单元格值。Table表示一个特定的map,有两个key以组合的形式引用单个值。类似场景一个map的map,举例:Map<UniversityName, Map<CoursesOffered, SeatAvailable>>。

依赖

maven依赖如下,读者可以查找对应版本:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>21.0</version>
</dependency>

创建

有多种方式创建其实例:

  • 使用HashBasedTable 类的create方法,其内部使用LinkedHashMap 类:
Table<String, String, Integer> universityCourseSeatTable 
  = HashBasedTable.create();
  • 如果我们需要Table的行key和列key有序(按自然顺序或提供的比较器排序),可以使用TreeBasedTable的create方法,其内部使用TreeMap:
Table<String, String, Integer> universityCourseSeatTable
  = TreeBasedTable.create();
  • 如何事先就确定行key和列可以,且table大小固定,可以使用ArrayTable的create方法:
List<String> universityRowTable 
  = Lists.newArrayList("Mumbai", "Harvard");
List<String> courseColumnTables 
  = Lists.newArrayList("Chemical", "IT", "Electrical");
Table<String, String, Integer> universityCourseSeatTable
  = ArrayTable.create(universityRowTable, courseColumnTables);
  • 如果需要创建不可变的table实例,其内部数据不能修改,可以使用ImmutableTable 类,使用其builder:
Table<String, String, Integer> universityCourseSeatTable
  = ImmutableTable.<String, String, Integer> builder()
  .put("Mumbai", "Chemical", 120).build();

应用

下面通过简单示例说明如何应用Table:

取值

如果确定行key和列key,那么可以通过它们获取关联值:

@Test
public void givenTable_whenGet_returnsSuccessfully() {
    Table<String, String, Integer> universityCourseSeatTable 
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);
 
    int seatCount 
      = universityCourseSeatTable.get("Mumbai", "IT");
    Integer seatCountForNoEntry 
      = universityCourseSeatTable.get("Oxford", "IT");
 
    assertThat(seatCount).isEqualTo(60);
    assertThat(seatCountForNoEntry).isEqualTo(null);
}

检查项是否存在

可以通过下面几种方式检查table的项是否存在:

  • 行key
  • 列key
  • 行key和列key

请看示例:

@Test
public void givenTable_whenContains_returnsSuccessfully() {
    Table<String, String, Integer> universityCourseSeatTable 
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);
 
    boolean entryIsPresent
      = universityCourseSeatTable.contains("Mumbai", "IT");
    boolean courseIsPresent 
      = universityCourseSeatTable.containsColumn("IT");
    boolean universityIsPresent 
      = universityCourseSeatTable.containsRow("Mumbai");
    boolean seatCountIsPresent 
      = universityCourseSeatTable.containsValue(60);
 
    assertThat(entryIsPresent).isEqualTo(true);
    assertThat(courseIsPresent).isEqualTo(true);
    assertThat(universityIsPresent).isEqualTo(true);
    assertThat(seatCountIsPresent).isEqualTo(true);
}

删除

可以通过行key和列key从table中删除项:

@Test
public void givenTable_whenRemove_returnsSuccessfully() {
    Table<String, String, Integer> universityCourseSeatTable
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
 
    int seatCount 
      = universityCourseSeatTable.remove("Mumbai", "IT");
 
    assertThat(seatCount).isEqualTo(60);
    assertThat(universityCourseSeatTable.remove("Mumbai", "IT")).
      isEqualTo(null);
}

获取行key和单元格值的映射map

通过列key 获取行key和单元格值的映射map:

@Test
public void givenTable_whenColumn_returnsSuccessfully() {
    Table<String, String, Integer> universityCourseSeatTable 
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);
 
    Map<String, Integer> universitySeatMap 
      = universityCourseSeatTable.column("IT");
 
    assertThat(universitySeatMap).hasSize(2);
    assertThat(universitySeatMap.get("Mumbai")).isEqualTo(60);
    assertThat(universitySeatMap.get("Harvard")).isEqualTo(120);
}

获取table的map表示

通过使用columnMap方法,可以获取 Map<UniversityName, Map<CoursesOffered, SeatAvailable>> 形式的map结构:

@Test
public void givenTable_whenColumnMap_returnsSuccessfully() {
    Table<String, String, Integer> universityCourseSeatTable 
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);
 
    Map<String, Map<String, Integer>> courseKeyUniversitySeatMap 
      = universityCourseSeatTable.columnMap();
 
    assertThat(courseKeyUniversitySeatMap).hasSize(3);
    assertThat(courseKeyUniversitySeatMap.get("IT")).hasSize(2);
    assertThat(courseKeyUniversitySeatMap.get("Electrical")).hasSize(1);
    assertThat(courseKeyUniversitySeatMap.get("Chemical")).hasSize(1);
}

获取列key和单元格值的映射map

通过行key获取列key和单元格值的映射map:

@Test
public void givenTable_whenRow_returnsSuccessfully() {
    Table<String, String, Integer> universityCourseSeatTable 
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);
 
    Map<String, Integer> courseSeatMap 
      = universityCourseSeatTable.row("Mumbai");
 
    assertThat(courseSeatMap).hasSize(2);
    assertThat(courseSeatMap.get("IT")).isEqualTo(60);
    assertThat(courseSeatMap.get("Chemical")).isEqualTo(120);
}

获取唯一的行key

rowKeySet 方法可以获取所有行key,并自动去重:

@Test
public void givenTable_whenRowKeySet_returnsSuccessfully() {
    Table<String, String, Integer> universityCourseSeatTable
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);
 
    Set<String> universitySet = universityCourseSeatTable.rowKeySet();
 
    assertThat(universitySet).hasSize(2);
}

获取唯一的列key

columnKeySet 方法可以获取所有列key,并自动去重:

@Test
public void givenTable_whenColKeySet_returnsSuccessfully() {
    Table<String, String, Integer> universityCourseSeatTable
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);
 
    Set<String> courseSet = universityCourseSeatTable.columnKeySet();
 
    assertThat(courseSet).hasSize(3);
}

总结

本文我们介绍了Guava中Table类及其常用方法。table提供类似表格的结构,包括行、列以及关联值,在实际项目中非常有用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/neweastsun/article/details/84996250

guava之maps教程_梦想画家的博客-爱代码爱编程_guava map

Guava之Maps教程 本文我们学习Guava Maps对java Map封装和升级,实现强大、简洁应用方式。 首先让我们看看Guava不用new创建HashMap: Map<String, String>

guava新集合-table-爱代码爱编程

2019独角兽企业重金招聘Python工程师标准>>> 当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的Map<FirstName, Map<LastName, Person>>来实现。为此Guava提供了一个新的集合类型-Table集合类型,来支持这种数据结构的使用

Guava 教程-爱代码爱编程

       Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string p

京东 抢购 脚本_JD京东一元购项目-爱代码爱编程

什么是京东一元购:其实京东一元购的原理非常简单,就是买个号(可理解为京东新人小号),用专门的撸货软件,在京东上用一毛或者一块的价格下单买东西。 需要去准备的内容:一台电脑(要求最低配置4核8G)脚本软件我们提供 备注:第一台机器我们会全程远程安装。本质上讲自己是可以学会可以自己操作安装其他的电脑,如果自己学完还不会之后的电脑可以我们代

ecshop小京东积分+现金_如果长期在京东撸货,以下九种省钱方法你一定要知道~...-爱代码爱编程

1、京豆。这个就不用说了,大家都明白,一京豆等于1分钱,可在下单的时候兑换相应的金额。京豆的来源有很多方面,如购物返京豆、签到领京豆、浏览店铺领京豆、抽奖活动领京豆等等,除去购物返京豆,其他全部都领下来,一天大概能领几十个。你可以加我们的客服拉京豆互助群,天天开豆车。 2、精选优惠券。京东人工精挑细选出来的优惠券,优惠力度大,很值得

京东撸货一元购有收的吗好做吗-爱代码爱编程

京东一元购是什么,直接给大家上图吧!简单明了,项目介绍自己某度!这里只讲实操 现在市面上的玩法基本上就是撸券,简单来说就是在新用户在京东上注册系统会送你优惠券然后用优惠券购物。这个玩法适合苹果手机用户(建议6s及以上型号,系统版本低没要求,能越狱就行,越狱话,某宝就能操作,在搭配一张电信4g卡),相当的方便。还有就是安卓手机或者模拟器,在这里我建议大家

google java. 集合_google guava集合之Table-爱代码爱编程

在guava库中还提供了一种二维表结构:Table。使用Table可以实现二维矩阵的数据结构,可以是稀溜矩阵。 我们看一个使用示例:import com.google.common.collect.HashBasedTable;import com.google.common.collect.Table;import java.util.Map;pu

java guava table_guava之Table-爱代码爱编程

Table 双键的 map rowKey+columnKey+value 以学车成绩表来举例 成绩表 方法: 所有的行数据:cellSet(); 所有的学生:rowKeySet(); 所有的课程:columnKeySet(); 所有的成绩:values(); 学生对应的课程和成绩:rowMap();课程为键 或者row(学生)

京东撸货--网上几百元的教程怎样辨别真假?不要被割韭菜-爱代码爱编程

哈喽!大家好!我来自康小康团队,今天来给大家分享一下JD撸货。 现在各大平台都在流传一个比较热门的项目,就是惊 咚撸货,也有人叫做薅羊毛,有很多种叫法,这个东西到底能不能做,是怎么做的,能不能赚到钱。    第一:我们要知道这个撸货是干嘛的? 其实呢,就是通过参加JD平台的新人购活动,去买一些商品。通过这个新人活动,买商品的实际付款金额是比较

网上传的京东撸货为什么那么火?-爱代码爱编程

大家好!我是康小康团队的一名员工,最近京东撸货成为广大网友关注的热点,都说是 “外行看热闹,内行看门道”,很多人不明白京东撸货如何能迅速火遍全网,今天我来给大家聊聊。 京东撸货就是在平台下单到几乎不到一块钱的东西,这个操作需要一定的技术支撑,这些撸回来的货大多是人人都要用到的生活必需品,这些货品都是很容易变现的。有的人一听说要变现就觉得难,当然了这种思维

京东撸货核心法则,6个步骤很详细,拿走不谢!-爱代码爱编程

现在整个互联网门槛越来越高,因为有了门槛导致很多刚接触互联网的人群被割韭菜的越来越多,很多人信心慢慢的加入到了这个领域,却被骗得血本无归,对于互联网创业者的人信任度也越发低下,不过随着各种项目层出不穷,JD撸货到2020年年底被推上了高潮,一直到现在都非常的火爆。 然而真正掌握着技术的还是那群人,没有硬技术的还是拿着老一套层出不穷的割着一茬又一茬韭菜,下

**京东撸货是什么,京东撸货具体怎么玩,能不能赚钱,我来告诉你**-爱代码爱编程

京东撸货是什么,京东撸货具体怎么玩,能不能赚钱,我来告诉你 今天来给大家分享一个我正在操作的一个项目,这个项目个人或者工作室都可以玩,副业兼职的好项目 一、京东项目由来: 京东为了拉取新用户,增加商城流量及优化销售数 据而 给出的新用户福利活动,就例如别的平台如美 团、拼多多、淘宝、天猫等电商平台对新注册用户 都会有首次购物的优惠活动 。商城对新用户

京东撸货小白被“割韭菜”!却不知道是认知出现了问题,究竟该怎样避免入坑?-爱代码爱编程

京东撸货小白被“割韭菜”!可不知是认知出现了问题,到底该怎样避免入坑? 到2021年今天的6月22日,已经是我持续互联网创业6年时间整,昨夜窗外下着小雨,听着外面雨滴滴滴落在空调外机上面的声音,让我思绪万千,回忆起今年第三年的创业京东撸货发生的事情,决定必须狠心写下这篇文章。   今天一大早来到公司,夫妻带着刚出生的小孩,被其他机构“割韭菜”来找

京东撸货如何进入圈子-爱代码爱编程

         对于网赚行业来说京东撸货已经是一个持续运行几年的老项目了,但为什么还是一直在稳定运行呢?他的收益到底怎么样?还适不适合小白入手?投入到底有多少?可行性有多高?变现方式是什么样的?作为一个撸货行业的老鸟,今天就从各个角度来分析一下这些问题,给准备入行的小白一个参考。  第一点先来说这个项目已经有了好几年的历史了,这个项目的起因就是电商平台

京东撸货前期准备流程急设备要求-爱代码爱编程

1硬件设备:电脑一台货苹果手机一部,手机推荐苹果6S以上,系统版本14以下的好操作,如果现有的设备是14的也可以。 电脑的话推荐配置E5系列,可以多开模拟器窗口。64位系统你开启VT功能,其他的无所谓,如果配置不够差一点也能行, 2软件方面,推荐用佐罗,爱丽丝或者爱新机之类的插件,手机越狱后安装,安装好了之后手机不要关机,关机会导致越狱失败,需要重新越

guava常用集合包应用示例_m0_72136664的博客-爱代码爱编程

关于Guava集合包 Guava提供了丰富的集合包,对于业务操作非常友好,本篇文章对比使用Guava集合包和不适用Guava集合包,看看Guava集合包给我们集合操作带来了哪些便利。 集合处理中的应用 对List<对象>进行分组 业务介绍:有一个订单列表,里面包含多个用户的多个订单,我们需要对按照用户对订单列表进行分组

java guava table接口_super sam的博客-爱代码爱编程

Guava Table接口 Table表示一个特殊的Map,其中可以以组合方式指定两个key来引用单个值。它类似于创建Map的Map。 使用添加依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</

干货来袭!京东顶尖架构师手撸vue+springboot神级项目实战手册-爱代码爱编程

前言: 不同终端的兴起,对开发人员的要求越来越高,纯浏览器端的响应式页面已经不能满足用户体验的要求,需要针对不同的终端开发不同的定制版本;为了提升开发效率,前后端分离的需求越来越被重视。 内容简介 本书以实战项目为主线,以理论基础为核心,引导读者渐进式学习Vue+SpringBoot。Spring Boot框架是目前微服务框架的最佳选择之一。Vue+