1. 概要

このチュートリアルでは、GoogleGuavaのTableインターフェースとその複数の実装の使用方法を示します。

GuavaのTableは、行、列、および関連するセル値を含む構造のようなテーブルを表すコレクションです。 行と列は、順序付けられたキーのペアとして機能します。

2. GoogleGuavaのテーブル

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 は、単一の値を参照するために2つのキーを組み合わせて指定できる特別なマップを表します。

これは、たとえば、マップのマップを作成することに似ています。 地図 >>テーブルは、戦艦のゲームボードを表すのにも最適な方法です。

3. 作成

Tableのインスタンスは複数の方法で作成できます。

  • 内部でLinkedHashMapを使用するクラスHashBasedTablecreateメソッドを使用します。
    Table<String, String, Integer> universityCourseSeatTable 
      = HashBasedTable.create();
  • Table が必要で、その行キーと列キーを自然な順序で並べ替えたり、コンパレータを提供したりする必要がある場合は、を使用してTableのインスタンスを作成できます。内部でTreeMapを使用するTreeBasedTableというクラスからのcreateメソッド:
    Table<String, String, Integer> universityCourseSeatTable
      = TreeBasedTable.create();
    
  • 行キーと列キーが事前にわかっていて、テーブルサイズが固定されている場合は、クラスArrayTablecreateメソッドを使用します。
    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 方法:

@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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。