【译】Google Guava 的 Table 接口介绍

news/2024/11/28 9:42:30/

原文: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. 检索

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

@Testpublic 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中的元素是否存在:

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

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

@Testpublic 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中删除元素:

@Testpublic 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 映射。

@Testpublic 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>>的表示:

@Testpublic 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 映射:

@Testpublic 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方法从表中获取所有的行键:

@Testpublic 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 方法从表中获取所有的列键:

@Testpublic 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.ppmy.cn/news/105146.html

相关文章

总结883

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;1800基础部分&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;1800线性代数部分并完成错题记录&#xff0c;英语背3篇文章并回诵&#xff0c;检测&#xff0c;一套数学模拟题 每…

中科易安8周年,与你相约联网智能门锁

中科易安与物联网技术发展同频 持续推动安防信息化建设 打造多场景应用的数智化通行解决方案 促进技术与安全精准对接 联网智能门锁技术硬核 中科易安打造集NB-IoT、Sub-1G Cat.1、Wifi、RS485和BLE 5.0 在内的六大通信技术组网方案 以“联网”赋能智能门锁 实现通行数…

跨境电商app开发搭建多语言商城后的运营技巧,一件了解电子商城及运营

跨境电商APP包含&#xff1a;买家端手机H5版本, 电脑Pc网页版本, 安卓苹果App。 一、模式介绍 如需要探讨&#xff0c;请kan 名片。 无货源模式&#xff1a;电商平台上的卖家不需要自己拥有实体的库存&#xff0c;而是通过与供应链服务提供商合作&#xff0c;将订单和支付…

Zabbix API开发实战,创建报警媒介和代码示例(付源码)

Zabbix API开始发挥重要作用&#xff0c;尤其是在Zabbix与第三方软件&#xff08;如配置和事件管理系统&#xff09;的集成以及日常任务的自动化方面。如果没有一些自动化&#xff0c;管理对数千台主机的监控是非常困难的。 API是在Zabbix 1.8中引入的&#xff0c;并且已经被广…

牛客网刷题学习SQL(三)

SQL23 统计每个学校各难度的用户平均刷题数 首先分析题目&#xff1a; 想要计算一些参加了答题的不同学校、不同难度的用户平均答题量 不同学校&#xff1a; group by 学校 不同难度&#xff1a; group by 难度 平均答题量&#xff1a;注意用户去重&#xff0c;还有指定questi…

机器视觉工程师,如何快速找到女朋友攻略(不提供海王模式,需要的朋友得加钱)

视觉人机器视觉培训-缺陷检测项目-食品行业草鸡蛋外观检测 找女朋友,千万不要"守株待兔",更重要的是"主动出击"。 本群主,本UP主,正经人。 某粉丝:你不能出一次差 在当地找一个嘛 我对以上行为坚决不支持, 第一:犯法行为做不得 第二:对自己爱人不忠…

Redis高级篇 - 分布式缓存

分布式缓存 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c…

微服务实战项目-学成在线-内容管理模块(有项目实战实现)

内容管理模块 1 模块需求分析 1.1 什么是需求分析 在百度百科中对需求分析的定义如下&#xff1a; 需求分析也称为软件需求分析、系统需求分析或需求分析工程等&#xff0c;是开发人员经过深入细致的调研和分析&#xff0c;准确理解用户和项目的功能、性能、可靠性等具体要…