Guide til Guava RangeMap

1. Oversigt

I denne vejledning viser vi, hvordan du bruger Google Guava RangeMap interface og dets implementeringer.

EN RangeMap er en særlig form for kortlægning fra usammenhængende ikke-tomme områder til værdier, der ikke er nul. Ved hjælp af forespørgsler kan vi slå op på værdien for et bestemt område på det pågældende kort.

Den grundlæggende implementering af RangeMap er en TreeRangeMap. Internt gør kortet brug af en TreeMap at gemme nøglen som et interval og værdien som ethvert brugerdefineret Java-objekt.

2. Google Guava RangeMap

Lad os se på, hvordan du bruger RangeMap klasse.

2.1. Maven afhængighed

Lad os starte med at tilføje Googles Guava-biblioteksafhængighed i pom.xml:

 com.google.guava guava 29.0-jre 

Den seneste version af afhængigheden kan kontrolleres her.

3. Oprettelse

Nogle af de måder, hvorpå vi kan skabe en forekomst af RangeMap er:

  • Brug skab metode fra TreeRangeMap klasse for at oprette et ændret kort:
RangeMap experienceRangeDesignationMap = TreeRangeMap.create ();
  • Hvis vi agter at oprette et uforanderligt områdekort, skal du bruge ImmutableRangeMap klasse (som følger et bygmønster):
RangeMap experienceRangeDesignationMap = ny ImmutableRangeMap.builder () .put (Range.closed (0, 2), "Associate") .build (); 

4. Brug

Lad os starte med et simpelt eksempel, der viser brugen af RangeMap.

4.1. Hentning baseret på input inden for et interval

Vi kan få en værdi tilknyttet en værdi inden for et interval af heltal:

@Test offentligt ugyldigt 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 ("vicepræsident", experienceRangeDesignationMap.get (6)); assertEquals ("administrerende direktør", experienceRangeDesignationMap.get (15)); }

Bemærk:

  • Det lukket metode til Rækkevidde klasse antager området for heltalværdier til at være mellem 0 og 2 (begge inklusive)
  • Det Rækkevidde i eksemplet ovenfor består af heltal. Vi kan bruge en række af enhver type, så længe den implementerer Sammenlignelig interface såsom Snor, Karakter, decimaler med flydende punkt osv.
  • RangeMap vender tilbage Nul når vi prøver at få værdien for et interval, der ikke er til stede på kortet
  • I tilfælde af en ImmutableRangeMap, kan et interval på en nøgle ikke overlappe et interval på en nøgle, der skal indsættes. Hvis det sker, får vi en IllegalArgumentException
  • Både nøgler og værdier i RangeMap kan ikke være nul. Hvis en af ​​dem er nul, vi får en NullPointerException

4.2. Fjernelse af en værdi baseret på en Rækkevidde

Lad os se, hvordan vi kan fjerne værdier. I dette eksempel viser vi, hvordan du fjerner en værdi, der er knyttet til et helt interval. Vi viser også, hvordan du fjerner en værdi baseret på et delvis nøgleområde:

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

Som det kan ses, kan vi selv efter delvis fjernelse af værdier fra et interval stadig få værdierne, hvis området stadig er gyldigt.

4.3. Spændvidde for nøgleområde

I tilfælde af at vi gerne vil vide, hvad den samlede spænding af en RangeMap er, vi kan bruge spændvidde metode:

@Test offentlig ugyldighed 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. At få en SubRangeMap

Når vi vil vælge en del fra en RangeMap, vi kan bruge subRangeMap metode:

@Test offentlig ugyldighed 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 experienceSubRangeDesignationMap = experienceRangeDesignationMap.subRangeMap (Range.closed (4, 14)); assertNull (erfarenSubRangeDesignationMap.get (3)); assertTrue (erfarenSubRangeDesignationMap.asMapOfRanges (). værdier () .containsAll (Arrays.asList ("Executive Director", "Vice President", "Executive Director"))); }

Denne metode returnerer krydset mellem RangeMap med det givne Rækkevidde parameter.

4.5. At få en Indgang

Endelig, hvis vi leder efter en Indgang fra en RangeMap, bruger vi getEntry metode:

@Test offentlig ugyldighed 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"); Kort. Indgang experienceEntry = experienceRangeDesignationMap.getEntry (10); assertEquals (Range.closed (9, 15), experienceEntry.getKey ()); assertEquals ("administrerende direktør", experienceEntry.getValue ()); }

5. Konklusion

I denne vejledning illustrerede vi eksempler på brug af RangeMap i Guava-biblioteket. Det bruges overvejende til at få en værdi baseret på den nøgle, der er angivet som en fra kortet.

Implementeringen af ​​disse eksempler findes i GitHub-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.


$config[zx-auto] not found$config[zx-overlay] not found