Ú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.