Guide du RangeSet Goyave

Guide du RangeSet Goyave

1. Vue d'ensemble

Dans ce didacticiel, nous montrerons comment utiliser l'interfaceRangeSet de Google Guava et ses implémentations.

UnRangeSet est un ensemble comprenant zéro ou plusieurs plages non vides et déconnectées. Lors de l'ajout d'une plage à unRangeSet mutable, toutes les plages connectées sont fusionnées tandis que les plages vides sont ignorées.

L'implémentation de base deRangeSet est unTreeRangeSet.

2. RangeSet de Google Guava

Voyons comment utiliser la classeRangeSet.

2.1. Dépendance Maven

Commençons par ajouter la dépendance de la bibliothèque Guava de Google dans lespom.xml:


    com.google.guava
    guava
    21.0

La dernière version de la dépendance peut être vérifiéehere.

3. Création

Explorons quelques-unes des façons dont nous pouvons créer une instance deRangeSet.

Tout d'abord, nous pouvons utiliser la méthodecreate de la classeTreeRangeSet pour créer un ensemble mutable:

RangeSet numberRangeSet = TreeRangeSet.create();

Si nous avons déjà des collections en place, utilisez la méthodecreate de la classeTreeRangeSet pour créer un ensemble mutable en passant cette collection:

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

Enfin, si nous devons créer un ensemble de plages immuable, utilisez la classeImmutableRangeSet (création qui suit un modèle de générateur):

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

4. Usage

Commençons par un exemple simple qui montre l'utilisation deRangeSet.

4.1. Ajout à une plage

Nous pouvons vérifier si l'entrée fournie se situe dans une plage présente dans l'un des éléments de la plage d'un ensemble:

@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));
}

Remarques:

  • La méthodeclosed de la classeRange suppose que la plage de valeurs entières est comprise entre 0 et 2 (les deux inclus)

  • LesRange dans l'exemple ci-dessus sont des entiers. Nous pouvons utiliser une plage constituée de n'importe quel type tant qu'elle implémente l'interfaceComparable telle queString,Character, décimales à virgule flottante, etc.

  • Dans le cas d'unImmutableRangeSet, un élément de plage présent dans l'ensemble ne peut pas chevaucher un élément de plage que l'on aimerait ajouter. Si cela se produit, nous obtenons unIllegalArgumentException

  • La plage d'entrée à unRangeSet ne peut pas être nulle. Si l'entrée estnull, nous obtiendrons unNullPointerException

4.2. Suppression d'une plage

Voyons comment nous pouvons supprimer des valeurs d'unRangeSet:

@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));
}

Comme on peut le constater, après la suppression, nous pouvons toujours accéder aux valeurs présentes dans n’importe quel élément de la plage restant dans l’ensemble.

4.3. Gamme Span

Voyons maintenant quelle est la durée globale d'unRangeSet:

@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. Obtenir une sous-plage

Si nous souhaitons obtenir une partie deRangeSet basée sur unRange donné, nous pouvons utiliser la méthodesubRangeSet:

@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. Méthode de complément

Ensuite, récupérons toutes les valeurs sauf celle présente dansRangeSet, en utilisant la méthodecomplement:

@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. Intersection avec une plage

Enfin, lorsque nous voulons vérifier si un intervalle de plage présent enRangeSet croise certaines ou toutes les valeurs d'une autre plage donnée, nous pouvons utiliser la méthodeintersect:

@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. Conclusion

Dans ce tutoriel, nous avons illustré lesRangeSet de la bibliothèque Guava à l'aide de quelques exemples. LeRangeSet est principalement utilisé pour vérifier si une valeur se situe dans une certaine plage présente dans l'ensemble.

L'implémentation de ces exemples peut être trouvée dansthe GitHub project - c'est un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.