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。行鍵到單元格值映射

我們可以通過提供列鍵來獲得鍵表示為行,值表示為CellValueMap表示形式:

@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。單元格值映射的列鍵

我們可以通過提供行鍵來獲取鍵為列且值為值作為CellValueMap表示形式:

@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的項目,因此應易於導入和運行。