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.