Guide de la carte goyave

Guide de la carte goyave

1. Vue d'ensemble

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

UnRangeMap 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 toute plage particulière de cette carte.

L'implémentation de base deRangeMap est unTreeRangeMap. En interne, la carte utilise unTreeMap 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 classeRangeMap.

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éer

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

  • Utilisez la méthodecreate de la classeTreeRangeMap 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 classeImmutableRangeMap (qui suit un modèle de générateur):

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

4. En utilisant

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

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é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 de n'importe quel type, tant qu'elle implémente l'interfaceComparable telle queString,Character, décimales à virgule flottante, etc.

  • RangeMap renvoieNull lorsque nous essayons d'obtenir la valeur d'une plage qui n'est pas présente dans la carte

  • Dans le cas d'unImmutableRangeMap, 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 unIllegalArgumentException

  • Les clés et les valeurs desRangeMap ne peuvent pas être desnull. Si l'un d'entre eux estnull,, nous obtenons unNullPointerException

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

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 constater, même après la suppression partielle des valeurs d’une plage, nous pouvons toujours obtenir les valeurs si la plage est toujours valide.

4.3. Portée de la plage de clés

Dans le cas où nous voudrions savoir quelle est l'étendue globale d'unRangeMap, nous pouvons utiliser la méthodespan:

@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 unSubRangeMap

Lorsque nous voulons sélectionner une pièce parmi unRangeMap, nous pouvons utiliser la méthodesubRangeMap:

@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 renvoie l'intersection desRangeMap avec le paramètreRange donné.

4.5. Obtenir unEntry

Enfin, si nous recherchons unEntry à partir d'unRangeMap, nous utilisons la méthodegetEntry:

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

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

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