Leitfaden für Guava RangeSet

Leitfaden für Guava RangeSet

1. Überblick

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

ARangeSet ist eine Menge, die aus null oder mehr nicht leeren, nicht verbundenen Bereichen besteht. Beim Hinzufügen eines Bereichs zu einem veränderlichenRangeSet werden alle verbundenen Bereiche zusammengeführt, während leere Bereiche ignoriert werden.

Die grundlegende Implementierung vonRangeSet istTreeRangeSet.

2. RangeSetvon Google Guava

Schauen wir uns an, wie die KlasseRangeSetverwendet 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. Schaffung

Lassen Sie uns einige Möglichkeiten erkunden, wie wir eine Instanz vonRangeSet erstellen können.

Erstens können wir diecreate-Methode aus der KlasseTreeRangeSet verwenden, um eine veränderbare Menge zu erstellen:

RangeSet numberRangeSet = TreeRangeSet.create();

Wenn bereits Sammlungen vorhanden sind, verwenden Sie die Methodecreate aus der KlasseTreeRangeSet, um eine veränderbare Menge zu erstellen, indem Sie diese Sammlung übergeben:

List> numberList = Arrays.asList(Range.closed(0, 2));
RangeSet numberRangeSet = TreeRangeSet.create(numberList);

Wenn wir einen unveränderlichen Bereichssatz erstellen müssen, verwenden Sie die KlasseImmutableRangeSet(Erstellen nach einem Builder-Muster):

RangeSet numberRangeSet
  = new ImmutableRangeSet.builder().add(Range.closed(0, 2)).build();

4. Verwendungszweck

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

4.1. Hinzufügen zu einem Bereich

Wir können überprüfen, ob die gelieferte Eingabe in einem Bereich liegt, der in einem der Bereichselemente in einem Satz vorhanden ist:

@Test
public void givenRangeSet_whenQueryWithinRange_returnsSucessfully() {
    RangeSet numberRangeSet = TreeRangeSet.create();

    numberRangeSet.add(Range.closed(0, 2));
    numberRangeSet.add(Range.closed(3, 5));
    numberRangeSet.add(Range.closed(6, 8));

    assertTrue(numberRangeSet.contains(1));
    assertFalse(numberRangeSet.contains(9));
}

Anmerkungen:

  • 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 verwenden, der aus einem beliebigen Typ besteht, solange er dieComparable-Schnittstelle implementiert, z. B.String,Character, Gleitkomma-Dezimalstellen usw.

  • Im Fall vonImmutableRangeSet kann sich ein in der Menge vorhandenes Bereichselement nicht mit einem Bereichselement überlappen, das hinzugefügt werden soll. In diesem Fall erhalten wirIllegalArgumentException

  • Die Bereichseingabe inRangeSet darf nicht null sein. Wenn die Eingabenull ist, erhalten wirNullPointerException

4.2. Bereich entfernen

Mal sehen, wie wir Werte ausRangeSet entfernen können:

@Test
public void givenRangeSet_whenRemoveRangeIsCalled_removesSucessfully() {
    RangeSet numberRangeSet = TreeRangeSet.create();

    numberRangeSet.add(Range.closed(0, 2));
    numberRangeSet.add(Range.closed(3, 5));
    numberRangeSet.add(Range.closed(6, 8));
    numberRangeSet.add(Range.closed(9, 15));
    numberRangeSet.remove(Range.closed(3, 5));
    numberRangeSet.remove(Range.closed(7, 10));

    assertTrue(numberRangeSet.contains(1));
    assertFalse(numberRangeSet.contains(9));
    assertTrue(numberRangeSet.contains(12));
}

Wie zu sehen ist, können wir nach dem Entfernen immer noch auf Werte zugreifen, die in einem der im Set verbleibenden Bereichselemente vorhanden sind.

4.3. Reichweite Span

Lassen Sie uns nun sehen, wie groß die Gesamtspanne vonRangeSet ist:

@Test
public void givenRangeSet_whenSpanIsCalled_returnsSucessfully() {
    RangeSet numberRangeSet = TreeRangeSet.create();

    numberRangeSet.add(Range.closed(0, 2));
    numberRangeSet.add(Range.closed(3, 5));
    numberRangeSet.add(Range.closed(6, 8));
    Range experienceSpan = numberRangeSet.span();

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

4.4. Einen Subrange bekommen

Wenn wir einen Teil vonRangeSet basierend auf einem bestimmtenRange erhalten möchten, können wir diesubRangeSet-Methode verwenden:

@Test
public void
  givenRangeSet_whenSubRangeSetIsCalled_returnsSubRangeSucessfully() {

    RangeSet numberRangeSet = TreeRangeSet.create();

    numberRangeSet.add(Range.closed(0, 2));
    numberRangeSet.add(Range.closed(3, 5));
    numberRangeSet.add(Range.closed(6, 8));
    RangeSet numberSubRangeSet
      = numberRangeSet.subRangeSet(Range.closed(4, 14));

    assertFalse(numberSubRangeSet.contains(3));
    assertFalse(numberSubRangeSet.contains(14));
    assertTrue(numberSubRangeSet.contains(7));
}

4.5. Ergänzungsmethode

Als nächstes erhalten wir alle Werte außer dem inRangeSet vorhandenen mit der Methodecomplement:

@Test
public void givenRangeSet_whenComplementIsCalled_returnsSucessfully() {
    RangeSet numberRangeSet = TreeRangeSet.create();

    numberRangeSet.add(Range.closed(0, 2));
    numberRangeSet.add(Range.closed(3, 5));
    numberRangeSet.add(Range.closed(6, 8));
    RangeSet numberRangeComplementSet
      = numberRangeSet.complement();

    assertTrue(numberRangeComplementSet.contains(-1000));
    assertFalse(numberRangeComplementSet.contains(2));
    assertFalse(numberRangeComplementSet.contains(3));
    assertTrue(numberRangeComplementSet.contains(1000));
}

4.6. Schnittpunkt mit einem Bereich

Wenn wir schließlich prüfen möchten, ob sich ein inRangeSet vorhandenes Bereichsintervall mit einigen oder allen Werten in einem anderen bestimmten Bereich überschneidet, können wir die Methodeintersect verwenden:

@Test
public void givenRangeSet_whenIntersectsWithinRange_returnsSucessfully() {
    RangeSet numberRangeSet = TreeRangeSet.create();

    numberRangeSet.add(Range.closed(0, 2));
    numberRangeSet.add(Range.closed(3, 10));
    numberRangeSet.add(Range.closed(15, 18));

    assertTrue(numberRangeSet.intersects(Range.closed(4, 17)));
    assertFalse(numberRangeSet.intersects(Range.closed(19, 200)));
}

5. Fazit

In diesem Tutorial haben wir dieRangeSet der Guava-Bibliothek anhand einiger Beispiele veranschaulicht. DasRangeSet wird hauptsächlich verwendet, um zu überprüfen, ob ein Wert in einen bestimmten Bereich fällt, der in der Menge vorhanden ist.

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