Gids voor Guava RangeMap

1. Overzicht

In deze tutorial laten we zien hoe je de Google Guava's kunt gebruiken RangeMap interface en de implementaties ervan.

EEN RangeMap is een speciaal soort mapping van disjuncte niet-lege bereiken naar niet-null-waarden. Met behulp van zoekopdrachten kunnen we de waarde opzoeken voor een bepaald bereik in die kaart.

De basisimplementatie van RangeMap is een TreeRangeMap. Intern maakt de kaart gebruik van een TreeMap om de sleutel op te slaan als een bereik en de waarde als een aangepast Java-object.

2. Google Guava's RangeMap

Laten we eens kijken hoe u de RangeMap klasse.

2.1. Afhankelijkheid van Maven

Laten we beginnen met het toevoegen van de Guava-bibliotheekafhankelijkheid van Google in het pom.xml:

 com.google.guava guave 29.0-jre 

De laatste versie van de afhankelijkheid kan hier worden gecontroleerd.

3. Creëren

Enkele manieren waarop we een instantie van RangeMap zijn:

  • Gebruik de creëren methode van de TreeRangeMap class om een ​​veranderlijke kaart te maken:
RangeMap experienceRangeDesignationMap = TreeRangeMap.create ();
  • Als we van plan zijn een onveranderlijke bereikkaart te maken, gebruik dan de ImmutableRangeMap class (die een bouwerspatroon volgt):
RangeMap experienceRangeDesignationMap = nieuwe ImmutableRangeMap.builder () .put (Range.closed (0, 2), "Associate") .build (); 

4. Met behulp van

Laten we beginnen met een eenvoudig voorbeeld dat het gebruik van RangeMap.

4.1. Ophalen op basis van invoer binnen een bereik

We kunnen een waarde krijgen die is gekoppeld aan een waarde binnen een bereik van gehele getallen:

@Test openbare ongeldig gegevenRangeMap_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 ("Uitvoerend directeur", experienceRangeDesignationMap.get (15)); }

Opmerking:

  • De Gesloten methode van de Bereik class gaat ervan uit dat het bereik van gehele getallen tussen 0 en 2 ligt (beide inclusief)
  • De Bereik in het bovenstaande voorbeeld bestaat uit gehele getallen. We kunnen een reeks van elk type gebruiken, zolang het de Vergelijkbaar interface zoals Draad, Karakter, drijvende-komma decimalen etc.
  • RangeMap geeft terug Nul wanneer we proberen de waarde te krijgen voor een bereik dat niet aanwezig is in de kaart
  • In het geval van een ImmutableRangeMap, kan een bereik van één sleutel niet overlappen met een bereik van een sleutel die moet worden ingevoegd. Als dat gebeurt, krijgen we een IllegalArgumentException
  • Zowel sleutels als waarden in het RangeMap kan niet zijn nul. Als een van hen dat is nul, we krijgen een NullPointerException

4.2. Een waarde verwijderen op basis van een Bereik

Laten we eens kijken hoe we waarden kunnen verwijderen. In dit voorbeeld laten we zien hoe u een waarde verwijdert die aan een volledig bereik is gekoppeld. We laten ook zien hoe u een waarde verwijdert op basis van een gedeeltelijk sleutelbereik:

@Test openbare leegte gegevenRangeMap_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)); }

Zoals te zien is, kunnen we zelfs nadat we waarden gedeeltelijk uit een bereik hebben verwijderd, de waarden krijgen als het bereik nog steeds geldig is.

4.3. Bereik van sleutelbereik

Voor het geval we zouden willen weten wat de totale overspanning van een RangeMap is, kunnen we de span methode:

@Test openbare leegte gegevenRangeMap_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"); Bereik experienceSpan = experienceRangeDesignationMap.span (); assertEquals (0, experienceSpan.lowerEndpoint (). intValue ()); assertEquals (30, experienceSpan.upperEndpoint (). intValue ()); }

4.4. Een SubRangeMap

Als we een partij willen selecteren uit een RangeMap, kunnen we de subRangeMap methode:

@Test openbare ongeldig gegevenRangeMap_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 ervarenSubRangeDesignationMap = experienceRangeDesignationMap.subRangeMap (Range.closed (4, 14)); assertNull (ervarenSubRangeDesignationMap.get (3)); assertTrue (ervarenSubRangeDesignationMap.asMapOfRanges (). waarden () .containsAll (Arrays.asList ("Executive Director", "Vice President", "Executive Director"))); }

Deze methode retourneert het snijpunt van de RangeMap met het gegeven Bereik parameter.

4.5. Een Binnenkomst

Eindelijk, als we op zoek zijn naar een Binnenkomst van een RangeMap, wij gebruiken de getEntry methode:

@Test openbare ongeldig gegevenRangeMap_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"); Kaart experienceEntry = experienceRangeDesignationMap.getEntry (10); assertEquals (Range.closed (9, 15), experienceEntry.getKey ()); assertEquals ("Uitvoerend directeur", experienceEntry.getValue ()); }

5. Conclusie

In deze zelfstudie hebben we voorbeelden geïllustreerd van het gebruik van de RangeMap in de Guava-bibliotheek. Het wordt voornamelijk gebruikt om een ​​waarde op te halen op basis van de sleutel die is opgegeven als a van de kaart.

De implementatie van deze voorbeelden is te vinden in het GitHub-project - dit is een op Maven gebaseerd project, dus het moet gemakkelijk kunnen worden geïmporteerd en uitgevoerd zoals het is.