Útmutató a Guava RangeMap-hoz

1. Áttekintés

Ebben az oktatóanyagban megmutatjuk, hogyan kell használni a Google Guava programot RangeMap interfész és megvalósításai.

A RangeMap egy speciális fajta leképezés a diszjunkt nem üres tartományoktól a nem null értékekig. Lekérdezések segítségével megkereshetjük a térkép bármely adott tartományának értékét.

A program alapvető megvalósítása RangeMap egy TreeRangeMap. Belsőleg a térkép a TreeMap hogy a kulcsot tartományként, az értéket pedig bármely egyedi Java objektumként tárolja.

2. Google Guava's RangeMap

Vessünk egy pillantást a RangeMap osztály.

2.1. Maven-függőség

Kezdjük azzal, hogy hozzáadjuk a Google Guava könyvtárfüggőségét a pom.xml:

 com.google.guava guava 29.0-jre 

A függőség legfrissebb verziója itt ellenőrizhető.

3. Teremtés

Néhány olyan módszer, amellyel létrehozhatunk egy példányt RangeMap vannak:

  • Használja a teremt módszer a TreeRangeMap osztály egy mutatható térkép létrehozásához:
RangeMap experienceRangeDesignationMap = TreeRangeMap.create ();
  • Ha megváltoztathatatlan tartománytérképet kívánunk létrehozni, használjuk a ImmutableRangeMap osztály (amely építői mintát követ):
RangeMap experienceRangeDesignationMap = new ImmutableRangeMap.builder () .put (Range.closed (0, 2), "Associate") .build (); 

4. Használata

Kezdjük egy egyszerű példával, amely bemutatja a RangeMap.

4.1. Lekérés egy tartományon belüli bemenet alapján

Az egész számtartományon belüli értékhez társított értéket kaphatunk:

@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), "alelnök"); experienceRangeDesignationMap.put (Range.closed (9, 15), "ügyvezető igazgató"); assertEquals ("alelnök", experienceRangeDesignationMap.get (6)); assertEquals ("ügyvezető igazgató", experienceRangeDesignationMap.get (15)); }

Jegyzet:

  • A zárva módszere Hatótávolság osztály azt feltételezi, hogy az egész értékek tartománya 0 és 2 között van (mindkettő beleértve)
  • A Hatótávolság a fenti példában egész számokból áll. Bármilyen típusú tartományt használhatunk, amennyiben megvalósítja a Hasonló interfész, például Húr, karakter, lebegőpontos tizedesjegyek stb.
  • RangeMap visszatér Nulla amikor megpróbáljuk megkapni az értéket egy olyan tartományhoz, amely nincs jelen a térképen
  • Abban az esetben, ha ImmutableRangeMap, egy kulcs tartománya nem fedheti át a beillesztendő kulcs tartományát. Ha ez megtörténik, akkor kapunk egy IllegalArgumentException
  • Mind a kulcsok, mind az értékek a RangeMap nem lehet nulla. Ha bármelyikük az nulla, kapunk egy NullPointerException

4.2. Érték eltávolítása a Hatótávolság

Nézzük meg, hogyan távolíthatjuk el az értékeket. Ebben a példában bemutatjuk, hogyan lehet eltávolítani egy teljes tartományhoz tartozó értéket. Bemutatjuk azt is, hogy hogyan lehet eltávolítani egy értéket egy részleges kulcstartomány alapján:

@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 (Tartomány.zárva (6, 8), "alelnök"); experienceRangeDesignationMap.put (Range.closed (9, 15), "ügyvezető igazgató"); experienceRangeDesignationMap.remove (Tartomány.zárva (9, 15)); experienceRangeDesignationMap.remove (Tartomány.zárva (1, 4)); assertNull (experienceRangeDesignationMap.get (9)); assertEquals ("Associate", experienceRangeDesignationMap.get (0)); assertEquals ("Senior Associate", experienceRangeDesignationMap.get (5)); assertNull (experienceRangeDesignationMap.get (1)); }

Mint látható, még az értékek részleges eltávolítása után is megkapjuk az értékeket, ha a tartomány még érvényes.

4.3. Kulcs tartománya

Abban az esetben, ha szeretnénk megtudni, hogy a RangeMap vagyis használhatjuk a span módszer:

@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 (Tartomány.zárva (6, 8), "alelnök"); experienceRangeDesignationMap.put (Range.closed (9, 15), "ügyvezető igazgató"); experienceRangeDesignationMap.put (Range.closed (16, 30), "ügyvezető igazgató"); Tartomány experienceSpan = experienceRangeDesignationMap.span (); assertEquals (0, experienceSpan.lowerEndpoint (). intValue ()); assertEquals (30, experienceSpan.upperEndpoint (). intValue ()); }

4.4. Első a SubRangeMap

Amikor ki akarunk választani egy alkatrészt a RangeMap, használhatjuk a subRangeMap módszer:

@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), "alelnök"); experienceRangeDesignationMap .put (Range.closed (8, 15), "ügyvezető igazgató"); experienceRangeDesignationMap .put (Range.closed (16, 30), "ügyvezető igazgató"); RangeMap pieredzesSubRangeDesignationMap = tapasztalatRangeDesignationMap.subRangeMap (Tartomány.zárva (4, 14)); assertNull (experienceSubRangeDesignationMap.get (3)); assertTrue (experienceSubRangeDesignationMap.asMapOfRanges (). értékek () .containsAll (Arrays.asList ("ügyvezető igazgató", "alelnök", "ügyvezető igazgató")); }

Ez a módszer a. Metszéspontját adja vissza RangeMap az adottval Hatótávolság paraméter.

4.5. Szerzés egy Belépés

Végül, ha egy Belépés a-tól RangeMap, használjuk a getEntry módszer:

@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), "alelnök"); experienceRangeDesignationMap.put (Range.closed (9, 15), "ügyvezető igazgató"); Térkép. Belépés experienceEntry = experienceRangeDesignationMap.getEntry (10); assertEquals (Tartomány.zárva (9, 15), élményEntry.getKey ()); assertEquals ("ügyvezető igazgató", experienceEntry.getValue ()); }

5. Következtetés

Ebben az oktatóanyagban példákat illusztráltunk a RangeMap a guavai könyvtárban. Főleg arra használatos, hogy a térképen a -ként megadott kulcs alapján értéket kapjon.

Ezeknek a példáknak a megvalósítása megtalálható a GitHub projektben - ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.