1概要
このチュートリアルでは、Google Guavaの
RangeMap
インターフェイスとその実装の使い方を説明します。
RangeMap
は、ばらばらでない空の範囲から空でない値への特殊なマッピングです。クエリを使用して、そのマップ内の特定の範囲の値を調べることができます。
RangeMap
の基本的な実装は
TreeRangeMap
です。内部的には、マップは
TreeMap
を使用してキーを範囲として、値を任意のカスタムJavaオブジェクトとして格納します。
2 Google Guavaの
RangeMap
RangeMap
クラスの使い方を見てみましょう。
2.1. Mavenの依存関係
まず、
pom.xml
にGoogleのGuavaライブラリ依存関係を追加します。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
依存関係の最新バージョンはhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22com.google.guava%22%20AND%20a%3A%22guava%22[ここに]。
3作成
RangeMap
のインスタンスを作成する方法のいくつかは以下のとおりです。
-
TreeRangeMap
クラスの
create
メソッドを使用して、
可変マップ:
RangeMap<Integer, String> experienceRangeDesignationMap
= TreeRangeMap.create();
-
不変の範囲マップを作成したい場合は、
ImmutableRangeMap
クラス(これはビルダーパターンに従います):
RangeMap<Integer, String> experienceRangeDesignationMap
= new ImmutableRangeMap.<Integer, String>builder()
.put(Range.closed(0, 2), "Associate")
.build();
4
を使う
RangeMap
の使い方を示す簡単な例から始めましょう。
4.1. 範囲内の入力に基づく検索
整数の範囲内の値に関連付けられた値を取得できます。
@Test
public void givenRangeMap__whenQueryWithinRange__returnsSucessfully() {
RangeMap<Integer, String> experienceRangeDesignationMap
= TreeRangeMap.create();
experienceRangeDesignationMap.put(
Range.closed(0, 2), "Associate");
experienceRangeDesignationMap.put(
Range.closed(3, 5), "Senior Associate");
experienceRangeDesignationMap.put(
Range.closed(6, 8), "Vice President");
experienceRangeDesignationMap.put(
Range.closed(9, 15), "Executive Director");
assertEquals("Vice President",
experienceRangeDesignationMap.get(6));
assertEquals("Executive Director",
experienceRangeDesignationMap.get(15));
}
注意:
-
Range
クラスの
closed
メソッドは整数の範囲を想定しています
0から2までの値(両端を含む)
** 上記の例の
Range
は整数で構成されています。私達は使用するかもしれません
String
、
Character
、浮動小数点数などの
Comparable
インタフェースを実装している限り、任意の型の範囲
範囲の値を取得しようとすると、
RangeMap
は
Null
を返します。
それはマップに存在しません
**
ImmutableRangeMap
の場合、1つのキーの範囲が重なることはありません
挿入する必要があるキーの範囲を指定します。それが起こるならば、我々は得ます
IllegalArgumentException
**
RangeMap
のキーと値の両方を
null
にすることはできません。どちらかなら
そのうちの1つは__nullです。
4.2.
Range
に基づく値の削除
値を削除する方法を見てみましょう。この例では、範囲全体に関連付けられている値を削除する方法を示します。部分的なキー範囲に基づいて値を削除する方法も示します。
@Test
public void givenRangeMap__whenRemoveRangeIsCalled__removesSucessfully() {
RangeMap<Integer, String> experienceRangeDesignationMap
= TreeRangeMap.create();
experienceRangeDesignationMap.put(
Range.closed(0, 2), "Associate");
experienceRangeDesignationMap.put(
Range.closed(3, 5), "Senior Associate");
experienceRangeDesignationMap.put(
Range.closed(6, 8), "Vice President");
experienceRangeDesignationMap.put(
Range.closed(9, 15), "Executive Director");
experienceRangeDesignationMap.remove(Range.closed(9, 15));
experienceRangeDesignationMap.remove(Range.closed(1, 4));
assertNull(experienceRangeDesignationMap.get(9));
assertEquals("Associate",
experienceRangeDesignationMap.get(0));
assertEquals("Senior Associate",
experienceRangeDesignationMap.get(5));
assertNull(experienceRangeDesignationMap.get(1));
}
見てわかるように、範囲から値を部分的に削除した後でも、範囲がまだ有効であれば値を取得できます。
4.3. キー範囲の範囲
RangeMap
の全体的な範囲を知りたい場合は、
span
メソッドを使用します。
@Test
public void givenRangeMap__whenSpanIsCalled__returnsSucessfully() {
RangeMap<Integer, String> experienceRangeDesignationMap = TreeRangeMap.create();
experienceRangeDesignationMap.put(Range.closed(0, 2), "Associate");
experienceRangeDesignationMap.put(Range.closed(3, 5), "Senior Associate");
experienceRangeDesignationMap.put(Range.closed(6, 8), "Vice President");
experienceRangeDesignationMap.put(Range.closed(9, 15), "Executive Director");
experienceRangeDesignationMap.put(Range.closed(16, 30), "Managing Director");
Range<Integer> experienceSpan = experienceRangeDesignationMap.span();
assertEquals(0, experienceSpan.lowerEndpoint().intValue());
assertEquals(30, experienceSpan.upperEndpoint().intValue());
}
4.4.
SubRangeMap
を取得する
RangeMap
から部品を選択したい場合は、
subRangeMap
メソッドを使用します。
@Test
public void givenRangeMap__whenSubRangeMapIsCalled__returnsSubRangeSuccessfully() {
RangeMap<Integer, String> experienceRangeDesignationMap = TreeRangeMap.create();
experienceRangeDesignationMap
.put(Range.closed(0, 2), "Associate");
experienceRangeDesignationMap
.put(Range.closed(3, 5), "Senior Associate");
experienceRangeDesignationMap
.put(Range.closed(6, 8), "Vice President");
experienceRangeDesignationMap
.put(Range.closed(8, 15), "Executive Director");
experienceRangeDesignationMap
.put(Range.closed(16, 30), "Managing Director");
RangeMap<Integer, String> experiencedSubRangeDesignationMap
= experienceRangeDesignationMap.subRangeMap(Range.closed(4, 14));
assertNull(experiencedSubRangeDesignationMap.get(3));
assertTrue(experiencedSubRangeDesignationMap.asMapOfRanges().values()
.containsAll(Arrays.asList("Executive Director", "Vice President", "Executive Director")));
}
このメソッドは、
RangeMap
と指定された
Range
パラメーターの交差部分を返します。
4.5.
Entry
を取得する
最後に、
RangeMap
から
Entry
を探している場合は、
getEntry
メソッドを使用します。
@Test
public void givenRangeMap__whenGetEntryIsCalled__returnsEntrySucessfully() {
RangeMap<Integer, String> experienceRangeDesignationMap
= TreeRangeMap.create();
experienceRangeDesignationMap.put(
Range.closed(0, 2), "Associate");
experienceRangeDesignationMap.put(
Range.closed(3, 5), "Senior Associate");
experienceRangeDesignationMap.put(
Range.closed(6, 8), "Vice President");
experienceRangeDesignationMap.put(
Range.closed(9, 15), "Executive Director");
Map.Entry<Range<Integer>, String> experienceEntry
= experienceRangeDesignationMap.getEntry(10);
assertEquals(Range.closed(9, 15), experienceEntry.getKey());
assertEquals("Executive Director", experienceEntry.getValue());
}
5結論
このチュートリアルでは、Guavaライブラリの
RangeMap
の使用例を示しました。これは主に、マップからとして指定されたキーに基づいて値を取得するために使用されます。
これらの例の実装はhttps://github.com/eugenp/tutorials/tree/master/guava-collections[GitHubプロジェクト]にあります – これはMavenベースのプロジェクトです。そのまま実行します。