グアバテーブルへのガイド
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を使用するクラスHashBasedTableのcreateメソッドを使用します。
Table<String, String, Integer> universityCourseSeatTable = HashBasedTable.create();
- Table が必要で、その行キーと列キーを自然な順序で並べ替えたり、コンパレータを提供したりする必要がある場合は、を使用してTableのインスタンスを作成できます。内部でTreeMapを使用するTreeBasedTableというクラスからのcreateメソッド:
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. テーブルのマップ表現
私たちは得ることができます地図
@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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。