グアバ表のガイド
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を使用するクラスHashBasedTableのcreateメソッドを使用する:
Table
universityCourseSeatTable = HashBasedTable.create(); -
行キーと列キーを自然な順序で並べ替えたり、コンパレータを指定したりする必要があるTableが必要な場合は、createメソッドを使用してTableのインスタンスを作成できます。内部でTreeMapを使用するTreeBasedTableと呼ばれるクラス:
Table
universityCourseSeatTable = TreeBasedTable.create(); -
行キーと列キーが事前にわかっていて、テーブルサイズが固定されている場合は、クラスArrayTableのcreateメソッドを使用します。
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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。