開発者ドキュメント

グアバRangeMapへのガイド


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ベースのプロジェクトです。そのまま実行します。

モバイルバージョンを終了