原文:https://www.baeldung.com/guava-table
1. 概述
在本教程中,我們將展示如何使用 Google Guava 的 Table
接口及其多個實現(xiàn)。
Guava 的 Table
是一種集合,表示包含行、列和相關(guān)單元格值的表結(jié)構(gòu),行和列充當(dāng)有序的鍵對。
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,那么結(jié)構(gòu)將是一個行的映射,其中每一行包含一個列的映射以及相關(guān)的單元格值。
Table 表示一種特殊的映射,其中可以以組合的方式指定兩個鍵來引用單個值。
這類似于創(chuàng)建一個映射的映射,例如 Map<UniversityName, Map<CoursesOffered, SeatAvailable>>
。Table 也是表示戰(zhàn)艦游戲棋盤的完美方式。
3. 創(chuàng)建
您可以以多種方式創(chuàng)建 Table
的實例:
- 使用類
HashBasedTable
中的create
方法,它在內(nèi)部使用LinkedHashMap
:
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
- 如果我們需要一個行鍵和列鍵按照它們的自然排序或提供比較器進(jìn)行排序的
Table
,可以使用名為TreeBasedTable
的類中的create
方法創(chuàng)建Table
的實例,它在內(nèi)部使用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);
- 如果我們打算創(chuàng)建
Table
的不可變實例,其內(nèi)部數(shù)據(jù)永遠(yuǎn)不會改變,請使用ImmutableTable
類(創(chuàng)建方式采用構(gòu)建器模式):
Table<String, String, Integer> universityCourseSeatTable
= ImmutableTable.<String, String, Integer> builder()
.put("Mumbai", "Chemical", 120).build();
4. 使用
讓我們從一個簡單的示例開始,展示如何使用 Table。
4.1. 檢索
如果我們知道行鍵和列鍵,那么我們可以獲取與行鍵和列鍵關(guān)聯(lián)的值:
@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. 檢查元素是否存在
我們可以根據(jù)以下方式檢查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. 獲取不重復(fù)的行鍵
我們可以使用 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. 獲取不重復(fù)的列鍵
我們可以使用 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. 結(jié)論
在本教程中,我們介紹了 Guava 庫中 Table 類的方法。Table 類提供了一種集合,表示包含行、列和相關(guān)單元格值的表結(jié)構(gòu)。
以上示例的代碼可以在GitHub項目中找到,這是一個基于 Maven 的項目,因此可以輕松導(dǎo)入和運(yùn)行。
創(chuàng)作不易,如果本文對你有幫助,歡迎點贊、收藏加關(guān)注,你的支持和鼓勵,是我創(chuàng)作的最大動力。
文章來源:http://www.zghlxwxcb.cn/news/detail-464422.html
歡迎加入我的知識星球,知識星球ID:15165241 一起交流學(xué)習(xí)。
https://t.zsxq.com/Z3bAiea 申請時標(biāo)注來自CSDN。文章來源地址http://www.zghlxwxcb.cn/news/detail-464422.html
到了這里,關(guān)于【譯】Google Guava 的 Table 接口介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!