Guava table
1.概述
在本教程中,我們將展示如何使用Google Guava的Table接口及其多種實現。
Guava的Table是一個集合,表示一個表,該表像包含行,列和關聯的單元格值的結構。行和列充當有序鍵對。
2. Google Guava的桌子
讓我們看一下如何使用Table類。
2.1。 Maven依賴
首先,在pom.xml中添加Google的Guava庫依賴項:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
可以在此處檢查依賴項的最新版本。
2.2。關於
如果我們使用核心Java中存在的Collections表示Guava的Table ,那麼結構將是行的映射,其中每一行都包含具有關聯單元格值的列的映射。
表表示一個特殊的映射,其中可以組合方式指定兩個鍵來引用單個值。
這類似於創建地圖地圖,例如Map <UniversityName,Map <CoursesOffered,SeatAvailable >> 。桌子也是代表戰艦遊戲板的理想方式。
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。檢查條目
我們可以查看基於在表中的條目存在:
- 行鍵
- 列鍵
- 行鍵和列鍵
- 值
讓我們看看如何檢查條目的存在:
@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。清除
我們可以通過提供行鍵和列鍵從表中刪除條目:
@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。行鍵到單元格值映射
我們可以通過提供列鍵來獲得鍵表示為行,值表示為CellValue的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。表格的地圖表示
我們可以使用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。單元格值映射的列鍵
我們可以通過提供行鍵來獲取鍵為列且值為值作為CellValue的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的項目,因此應易於導入和運行。