【译】Google Guava 的 Table 接口介绍

news2024/11/26 22:42:39

原文:https://www.baeldung.com/guava-table

1. 概述

在本教程中,我们将展示如何使用 Google Guava 的 Table 接口及其多个实现。
Guava 的 Table 是一种集合,表示包含行、列和相关单元格值的表结构,行和列充当有序的键对。

2. Google Guava的 Table

让我们看看如何使用 Table 类。

2.1. Maven依赖

首先,在 pom.xml 中添加 Google Guava 库的依赖项:

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>31.0.1-jre</version>
</dependency>

最新版本的依赖项可以在这里查看。

2.2. 核心库中的等价表示

如果我们用 Java 核心库中的 Collections 来表示 Guava 的 Table,那么结构将是一个行的映射,其中每一行包含一个列的映射以及相关的单元格值。
Table 表示一种特殊的映射,其中可以以组合的方式指定两个键来引用单个值。
这类似于创建一个映射的映射,例如 Map<UniversityName, Map<CoursesOffered, SeatAvailable>>。Table 也是表示战舰游戏棋盘的完美方式。

3. 创建

您可以以多种方式创建 Table的实例:

  • 使用类 HashBasedTable中的 create方法,它在内部使用 LinkedHashMap
Table<String, String, Integer> universityCourseSeatTable 
    = HashBasedTable.create();
  • 如果我们需要一个行键和列键按照它们的自然排序或提供比较器进行排序的 Table,可以使用名为TreeBasedTable 的类中的 create 方法创建 Table 的实例,它在内部使用TreeMap
Table<String, String, Integer> universityCourseSeatTable
    = TreeBasedTable.create();
  • 如果我们事先知道行键和列键,并且表的大小是固定的,请使用类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类(创建方式采用构建器模式):
Table<String, String, Integer> universityCourseSeatTable
    = ImmutableTable.<String, String, Integer> builder()
    .put("Mumbai", "Chemical", 120).build();

4. 使用

让我们从一个简单的示例开始,展示如何使用 Table。

4.1. 检索

如果我们知道行键和列键,那么我们可以获取与行键和列键关联的值:

@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);
    }

4.2. 检查元素是否存在

我们可以根据以下方式检查Table中的元素是否存在:

  • 行键
  • 列键
  • 行键和列键都存在

让我们看看如何检查元素是否存在:

@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);
    }

4.3. 删除

我们可以通过提供行键和列键来从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);
    }

4.4. 行键到单元格值的映射

通过提供列键,就可以获取以行键为键、单元格值的 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);
    }

4.5. 表的_Map_表示

我们可以使用 columnMap方法来获得一个Map<UniversityName, Map<CoursesOffered, SeatAvailable>>的表示:

@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);
    }

4.6. 列键到单元格值的映射

我们可以通过提供行键来获取以列键为键,单元格值的 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);
    }

4.7. 获取不重复的行键

我们可以使用 rowKeySet方法从表中获取所有的行键:

@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);
    }

4.8. 获取不重复的列键

我们可以使用 columnKeySet 方法从表中获取所有的列键:

@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);
    }

5. 结论

在本教程中,我们介绍了 Guava 库中 Table 类的方法。Table 类提供了一种集合,表示包含行、列和相关单元格值的表结构。

以上示例的代码可以在GitHub项目中找到,这是一个基于 Maven 的项目,因此可以轻松导入和运行。


创作不易,如果本文对你有帮助,欢迎点赞、收藏加关注,你的支持和鼓励,是我创作的最大动力。
在这里插入图片描述

欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。
https://t.zsxq.com/Z3bAiea 申请时标注来自CSDN。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/587186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React Native开发速记

文章目录 引子React Native适用场景React基础JSX 组件的定义基础APIFlex弹性布局例子: Flex布局实现多行多列 常用UI组件几个核心钩子函数useState用法useEffect典型用法 和原生模块交互调用原生模块方法 调试其它工具UI框架参考资源 引子 软件开发&#xff0c;移动优先&#…

webAJAX概述.

1.1什么是AJAX. Ajax即AsynchronousJavascript And XML&#xff1a;异步数据回调。 使用Ajax技术网页应用能够快速地将更新呈现在用户界面上&#xff0c;不需要重载&#xff08;刷新&#xff09;整个页面【只刷新局部】&#xff0c;这使得程序能够更快地回应用户的操作。、 1…

使用Node. js输出到命令行

目录 1、使用控制台模块的基本输出 2、清除控制台 3、计数元素 4、复位计数 5、打印堆栈跟踪 6、计算花费的时间 7、stdout和stderr 8、为输出着色 9、创建进度条 1、使用控制台模块的基本输出 Node.js提供了一个console模块&#xff0c;它提供了大量非常有用的与命令…

Qt Quick系列(4)—定位元素

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 前言相对布局代码示例示例一示例二示例三示例四示例五示例六 简单"布局器"ColumnRowGridFlow 结语 前言 在Qt Quick中&#xff0c;可以使用以下方式来定位元素&#xff1a;…

需要建立强大的网络响应框架

由于头条新闻充斥着网络攻击&#xff0c;因此企业制定网络响应框架变得前所未有的重要。当今的网络安全形势继续快速发展&#xff0c;黑客行动主义、民族国家支持的网络攻击、勒索软件和其他攻击策略变得更加危险、复杂&#xff0c;组织的防御成本也越来越高。随着企业进行数字…

华为OD机试真题B卷 Java 实现【名字的漂亮度】,附详细解题思路

一、题目描述 给出一个字符串&#xff0c;该字符串仅由小写字母组成&#xff0c;定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。 每个字母都有一个“漂亮度”&#xff0c;范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。 给出多个…

Ex-ChatGPT本地部署+Azure OpenAI接口配置+docker部署服务

Ex-ChatGPT项目分为 Ex-ChatGPT 和 WebChatGPTEnhance 两部分&#xff0c;Ex-ChatGPT启动后是个web服务&#xff0c;通过访问ip端口体验&#xff1b; WebChatGPTEnhance可编译生成一个浏览器插件&#xff0c;Chrome或者Microsoft edge浏览器可以安装该插件&#xff0c;点击该插…

Golang中文件目录操作的实现

目录 文件 文件目录 文件目录操作 读取文件 一、方法一 (file.Read()) 二、方法二 (bufio读取文件) 三、方法三 (ioutil 读取方法) 写入文件 一、方法一 二、方法二 三、方法三 (ioutil写入文件) 复制文件 一、方法一 二、方法二 文件 Golang中&#xff0c;文件是…

python异常处理速通

一.异常处理认识 1.基础认识 开发人员在编写程序时&#xff0c;难免会遇到错误&#xff0c;有的是编写人员疏忽造成的语法错误&#xff0c;有的是程序内部隐含逻辑问题造成的数据错误&#xff0c;还有的是程序运行时与系统的规则冲突造成的系统错误&#xff0c;等等。总的来说…

什么是肖特基二极管

普通二极管是由N型半导体和P型半导体接触制成&#xff0c;交界面形成PN结。 肖特基二极管是由N型半导体和金属接触制成&#xff0c;交界面形成肖特基结。 肖特基结的形成主要是因为N型半导体中的电子更容易逸出进入到金属&#xff0c;从而在接触面N型半导体失去电子形成正离子区…

python:绘制GAM非线性回归散点图和拟合曲线

作者&#xff1a;CSDN _养乐多_ 本文将介绍使用python语言绘制广义线性模型&#xff08;Generalized Additive Model&#xff0c;GAM&#xff09;非线性回归散点图和拟合曲线。并记录了计算RMSE、ubRMSE、R2、Bias的代码。 文章目录 一、GAM非线性回归详解二、代码三、计算RM…

docker 镜像/容器的打包、导出、导入

目录 一、将变动过的容器打包生成新的镜像 二、对镜像进行导出导入 1、将镜像导出为一个镜像img文件 2、将img镜像文件导入&#xff0c;复制出一个完全一样镜像 三、对容器进行导入导出 1、将容器导出为一个镜像tar文件 2、将镜像tar文件导入&#xff0c;生成一个新镜像…

Linux本地搭建GitLab服务器 - 内网穿透远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自cpolar极点云文章&#xff1a;Linux搭建GitLab私有仓库&#xff0c;并内网穿透实…

vite构建的项目如何修改element Plus的主题样式

安装element plus 安装icon pnpm install element-plus pnpm install element-plus/icons-vue main.ts配置 icon的使用https://element-plus.gitee.io/zh-CN/component/icon.html#%E7%BB%93%E5%90%88-el-icon-%E4%BD%BF%E7%94%A8 import { createApp } from vue import ./sty…

【工具】vscode的常用插件之git插件

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

计算机视觉cv模型最新进展速看:

华为诺亚实验室等研究者提出动态分辨率网络 DRNet 深度卷积神经网络通畅采用精细的设计&#xff0c;有着大量的可学习参数&#xff0c;在视觉任务上实现很高精 确度要求。为了降低将网络部署在移动端成本较高的问题&#xff0c;近来发掘在预定义架构上的冗余 已经取得了巨大的…

Midjourney AI绘画中文教程详解(完整版)模型、命令、参数与各种高级用法

我有一种预感&#xff0c;您一下子看不完这篇内容&#xff0c;您得【收藏】一下&#xff0c;以便下次接着看~~ Midjourney AI绘画中文教程&#xff0c;Midjourney是一款2022年3月面世的AI绘画工具&#xff0c;创始人是David Holz。 只要输入想到的文字&#xff0c;就能通过人…

数据库sqlserver-----触发器的插入,更新和删除

在学习触发器之前&#xff0c;先弄清DDL,DML,DQL,DCL的区别: http://t.csdn.cn/Le3wA 触发器就是当执行某个事件的时候触发另一个事件的执行&#xff0c;根据事件的触发时间可分为 before和after Before与After区别&#xff1a;before&#xff1a;(insert、update)可以对new…

数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)

目录 题目描述 输入示例 输出示例 解题思路 解题方法&#xff08;C语言&#xff09; 解析 题目描述 有序的二叉树遍历可以用堆栈以非递归的方式实现。 例如&#xff1a; 假设遍历一个节点数为6的二叉树&#xff08;节点数据分别为1到6&#xff09;时&#xff0c; 堆…

immersive-translate 安装,个人觉得一款超级好用的浏览器翻译插件

immersive-translate 安装&#xff0c;个人觉得一款超级好用的浏览器翻译插件 immersive-translate 是什么Github 地址主要特性立即安装使用 immersive-translate immersive-translate 是什么 Immersive Dual Web Page Translation Extension - 沉浸式双语网页翻译扩展。 Git…