Guide de la gamme de goyaves

1. Vue d'ensemble

Dans ce tutoriel, nous montrerons comment utiliser l' interface RangeMap de Google Guava et ses implémentations.

Un RangeMap est un type spécial de mappage de plages non vides disjointes à des valeurs non nulles. En utilisant des requêtes, nous pouvons rechercher la valeur de n'importe quelle plage particulière de cette carte.

L'implémentation de base de RangeMap est un TreeRangeMap . En interne, la carte utilise un TreeMap pour stocker la clé en tant que plage et la valeur en tant qu'objet Java personnalisé.

2. RangeMap de Google Guava

Voyons comment utiliser la classe RangeMap .

2.1. Dépendance de Maven

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

 com.google.guava guava 29.0-jre 

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

3. Création

Certaines des façons dont nous pouvons créer une instance de RangeMap sont:

  • Utilisez la méthode create de la classe TreeRangeMap pour créer une carte mutable:
RangeMap experienceRangeDesignationMap = TreeRangeMap.create();
  • Si nous avons l'intention de créer une carte de plage immuable, utilisez la classe ImmutableRangeMap (qui suit un modèle de générateur):
RangeMap experienceRangeDesignationMap = new ImmutableRangeMap.builder() .put(Range.closed(0, 2), "Associate") .build(); 

4. Utilisation

Commençons par un exemple simple montrant l'utilisation de RangeMap .

4.1. Récupération basée sur l'entrée dans une plage

Nous pouvons obtenir une valeur associée à une valeur dans une plage d'entiers:

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

Remarque:

  • La méthode fermée de la classe Range suppose que la plage de valeurs entières est comprise entre 0 et 2 (les deux inclus)
  • La plage dans l'exemple ci-dessus se compose d'entiers. Nous pouvons utiliser une plage de n'importe quel type, tant qu'elle implémente l' interface Comparable telle que String , Character , décimales à virgule flottante, etc.
  • RangeMap renvoie Null lorsque nous essayons d'obtenir la valeur d'une plage qui n'est pas présente dans la carte
  • Dans le cas d'un ImmutableRangeMap , une plage d'une clé ne peut pas chevaucher une plage d'une clé qui doit être insérée. Si cela se produit, nous obtenons une exception IllegalArgumentException
  • Les clés et les valeurs du RangeMap ne peuvent pas être nulles . Si l'un d'entre eux est nul, nous obtenons une NullPointerException

4.2. Suppression d'une valeur basée sur une plage

Voyons comment nous pouvons supprimer des valeurs. Dans cet exemple, nous montrons comment supprimer une valeur associée à une plage entière. Nous montrons également comment supprimer une valeur basée sur une plage de clés partielle:

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

Comme on peut le voir, même après avoir partiellement supprimé des valeurs d'une plage, nous pouvons toujours obtenir les valeurs si la plage est toujours valide.

4.3. Étendue de la plage de clés

Dans le cas où nous voudrions savoir quelle est l'étendue globale d'un RangeMap , nous pouvons utiliser la méthode span :

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

Lorsque nous voulons sélectionner une pièce dans un RangeMap , nous pouvons utiliser la méthode subRangeMap :

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

Cette méthode retourne l'intersection de RangeMap avec le paramètre Range donné .

4.5. Obtenir une entrée

Enfin, si nous recherchons une entrée à partir d'un RangeMap , nous utilisons la méthode getEntry :

@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
    
      experienceEntry = experienceRangeDesignationMap.getEntry(10); assertEquals(Range.closed(9, 15), experienceEntry.getKey()); assertEquals("Executive Director", experienceEntry.getValue()); }
    

5. Conclusion

Dans ce didacticiel, nous avons illustré des exemples d'utilisation de RangeMap dans la bibliothèque Guava. Il est principalement utilisé pour obtenir une valeur basée sur la clé spécifiée comme a de la carte.

L'implémentation de ces exemples peut être trouvée dans le projet GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.