Leitfaden für Guava RangeMap

Leitfaden für Guava RangeMap

1. Überblick

In diesem Tutorial zeigen wir Ihnen, wie Sie dieRangeMap-Schnittstelle von Google Guava und ihre Implementierungen verwenden.

ARangeMap ist eine spezielle Art der Zuordnung von disjunkten nicht leeren Bereichen zu Nicht-Null-Werten. Mithilfe von Abfragen können wir den Wert für einen bestimmten Bereich in dieser Karte ermitteln.

Die grundlegende Implementierung vonRangeMap istTreeRangeMap. Intern verwendet die Map einTreeMap, um den Schlüssel als Bereich und den Wert als jedes benutzerdefinierte Java-Objekt zu speichern.

2. RangeMapvon Google Guava

Schauen wir uns an, wie die KlasseRangeMapverwendet wird.

2.1. Maven-Abhängigkeit

Beginnen wir mit dem Hinzufügen der Google-Abhängigkeit von der Guava-Bibliothek inpom.xml:


    com.google.guava
    guava
    21.0

Die neueste Version der Abhängigkeit kann inhere überprüft werden.

3. Erstellen

Einige der Möglichkeiten, wie wir eine Instanz vonRangeMap erstellen können, sind:

  • Verwenden Sie die Methodecreate aus der KlasseTreeRangeMap, um eine veränderbare Zuordnung zu erstellen:

RangeMap experienceRangeDesignationMap
  = TreeRangeMap.create();
  • Wenn Sie eine unveränderliche Bereichszuordnung erstellen möchten, verwenden Sie die KlasseImmutableRangeMap (die einem Builder-Muster folgt):

RangeMap experienceRangeDesignationMap
  = new ImmutableRangeMap.builder()
  .put(Range.closed(0, 2), "Associate")
  .build();

4. Verwenden von

Beginnen wir mit einem einfachen Beispiel, das die Verwendung vonRangeMap zeigt.

4.1. Abruf basierend auf Eingaben innerhalb eines Bereichs

Wir können einen Wert erhalten, der einem Wert in einem Bereich von ganzen Zahlen zugeordnet ist:

@Test
public void givenRangeMap_whenQueryWithinRange_returnsSucessfully() {
    RangeMap 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));
}

Hinweis:

  • Dieclosed-Methode derRange-Klasse geht davon aus, dass der Bereich der ganzzahligen Werte zwischen 0 und 2 liegt (beide einschließlich).

  • DasRange im obigen Beispiel besteht aus ganzen Zahlen. Wir können einen Bereich eines beliebigen Typs verwenden, solange er dieComparable-Schnittstelle implementiert, z. B.String,Character, Gleitkomma-Dezimalstellen usw.

  • RangeMap gibtNull zurück, wenn wir versuchen, den Wert für einen Bereich abzurufen, der in der Karte nicht vorhanden ist

  • Im Fall vonImmutableRangeMap kann sich ein Bereich eines Schlüssels nicht mit einem Bereich eines Schlüssels überschneiden, der eingefügt werden muss. In diesem Fall erhalten wirIllegalArgumentException

  • Sowohl Schlüssel als auch Werte inRangeMap dürfen nichtnull sein. Wenn einer von ihnennull, ist, erhalten wirNullPointerException

4.2. Entfernen eines Wertes basierend auf einemRange

Mal sehen, wie wir Werte entfernen können. In diesem Beispiel wird gezeigt, wie ein Wert entfernt wird, der einem gesamten Bereich zugeordnet ist. Wir zeigen auch, wie ein Wert basierend auf einem Teilschlüsselbereich entfernt wird:

@Test
public void givenRangeMap_whenRemoveRangeIsCalled_removesSucessfully() {
    RangeMap 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));
}

Wie zu sehen ist, können wir die Werte auch nach teilweisem Entfernen von Werten aus einem Bereich abrufen, wenn der Bereich noch gültig ist.

4.3. Spannweite des Tastenbereichs

Wenn wir wissen möchten, wie groß die Gesamtspanne vonRangeMap ist, können wir die Methodespan verwenden:

@Test
public void givenRangeMap_whenSpanIsCalled_returnsSucessfully() {
    RangeMap 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 experienceSpan = experienceRangeDesignationMap.span();

    assertEquals(0, experienceSpan.lowerEndpoint().intValue());
    assertEquals(30, experienceSpan.upperEndpoint().intValue());
}

4.4. SubRangeMap erhalten

Wenn wir einen Teil ausRangeMap auswählen möchten, können wir die MethodesubRangeMap verwenden:

@Test
public void givenRangeMap_whenSubRangeMapIsCalled_returnsSubRangeSuccessfully() {
    RangeMap 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 experiencedSubRangeDesignationMap
      = experienceRangeDesignationMap.subRangeMap(Range.closed(4, 14));

    assertNull(experiencedSubRangeDesignationMap.get(3));
    assertTrue(experiencedSubRangeDesignationMap.asMapOfRanges().values()
      .containsAll(Arrays.asList("Executive Director", "Vice President", "Executive Director")));
}

Diese Methode gibt den Schnittpunkt vonRangeMap mit dem angegebenen ParameterRange zurück.

4.5. Entry erhalten

Wenn wir schließlich nachEntry vonRangeMap suchen, verwenden wir die MethodegetEntry:

@Test
public void givenRangeMap_whenGetEntryIsCalled_returnsEntrySucessfully() {
    RangeMap 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, String> experienceEntry
      = experienceRangeDesignationMap.getEntry(10);

    assertEquals(Range.closed(9, 15), experienceEntry.getKey());
    assertEquals("Executive Director", experienceEntry.getValue());
}

5. Fazit

In diesem Tutorial haben wir Beispiele für die Verwendung vonRangeMap in der Guava-Bibliothek veranschaulicht. Es wird hauptsächlich verwendet, um einen Wert basierend auf dem als a angegebenen Schlüssel von der Karte zu erhalten.

Die Implementierung dieser Beispiele finden Sie inthe GitHub project - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und unverändert auszuführen sein.