グアバテーブルへのガイド

グアバ表のガイド

1. 概要

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

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

2. Google GuavaのTable

Tableクラスの使用方法を見てみましょう。

2.1. メーベン依存

pom.xmlにGoogleのGuavaライブラリの依存関係を追加することから始めましょう。


    com.google.guava
    guava
    21.0

依存関係の最新バージョンはhereで確認できます。

2.2. 約

コアJavaに存在するCollectionsを使用してGuavaのTableを表す場合、構造は行のマップになり、各行には関連するセル値を持つ列のマップが含まれます。

Tableは、2つのキーを組み合わせて指定して、単一の値を参照できる特別なマップを表します。

これは、Map<UniversityName, Map<CoursesOffered, SeatAvailable>>などのマップのマップを作成するのと似ています。 Tableは、戦艦のゲームボードを表すのにも最適な方法です。

3. 作成

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

  • 内部でLinkedHashMapを使用するクラスHashBasedTablecreateメソッドを使用する:

    Table universityCourseSeatTable
      = HashBasedTable.create();
  • 行キーと列キーを自然な順序で並べ替えたり、コンパレータを指定したりする必要があるTableが必要な場合は、createメソッドを使用してTableのインスタンスを作成できます。内部でTreeMapを使用するTreeBasedTableと呼ばれるクラス:

    Table universityCourseSeatTable
      = TreeBasedTable.create();
  • 行キーと列キーが事前にわかっていて、テーブルサイズが固定されている場合は、クラスArrayTablecreateメソッドを使用します。

    List universityRowTable
      = Lists.newArrayList("Mumbai", "Harvard");
    List courseColumnTables
      = Lists.newArrayList("Chemical", "IT", "Electrical");
    Table universityCourseSeatTable
      = ArrayTable.create(universityRowTable, courseColumnTables);
  • 内部データが変更されないTableの不変インスタンスを作成する場合は、ImmutableTableクラスを使用します(ビルダーパターンに従って作成します)。

    Table universityCourseSeatTable
      = ImmutableTable. builder()
      .put("Mumbai", "Chemical", 120).build();

4. を使う

Tableの使用法を示す簡単な例から始めましょう。

4.1. 検索

行キーと列キーがわかっている場合、行と列キーに関連付けられた値を取得できます。

@Test
public void givenTable_whenGet_returnsSuccessfully() {
    Table 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内のエントリの存在を確認できます。

  • 行キー

  • 列キー

  • 行キーと列キーの両方

エントリの存在を確認する方法を見てみましょう。

@Test
public void givenTable_whenContains_returnsSuccessfully() {
    Table 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 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 universityCourseSeatTable
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);

    Map universitySeatMap
      = universityCourseSeatTable.column("IT");

    assertThat(universitySeatMap).hasSize(2);
    assertThat(universitySeatMap.get("Mumbai")).isEqualTo(60);
    assertThat(universitySeatMap.get("Harvard")).isEqualTo(120);
}

4.5. Tableのマップ表現

columnMapメソッドを使用して、Map<UniversityName, Map<CoursesOffered, SeatAvailable>>表現を取得できます。

@Test
public void givenTable_whenColumnMap_returnsSuccessfully() {
    Table universityCourseSeatTable
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);

    Map> 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 universityCourseSeatTable
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);

    Map 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 universityCourseSeatTable
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);

    Set universitySet = universityCourseSeatTable.rowKeySet();

    assertThat(universitySet).hasSize(2);
}

4.8. 個別の列キーを取得する

columnKeySetメソッドを使用して、テーブルからすべての列キーを取得できます。

@Test
public void givenTable_whenColKeySet_returnsSuccessfully() {
    Table universityCourseSeatTable
      = HashBasedTable.create();
    universityCourseSeatTable.put("Mumbai", "Chemical", 120);
    universityCourseSeatTable.put("Mumbai", "IT", 60);
    universityCourseSeatTable.put("Harvard", "Electrical", 60);
    universityCourseSeatTable.put("Harvard", "IT", 120);

    Set courseSet = universityCourseSeatTable.columnKeySet();

    assertThat(courseSet).hasSize(3);
}

5. 結論

このチュートリアルでは、GuavaライブラリのTableクラスのメソッドを説明しました。 Tableクラスは、行、列、および関連するセル値を含む構造体のようなテーブルを表すコレクションを提供します。

上記の例に属するコードはthe GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。