Vodič kroz Guava RangeMap
1. Pregled
U ovom uputstvu pokazat ćemo kako koristiti Google Guava RangeMap sučelje i njegove implementacije.
A RangeMap je posebna vrsta preslikavanja od nepodudarnih nepraznih raspona do ne-null vrijednosti. Koristeći upite, možemo potražiti vrijednost za bilo koji određeni raspon na toj mapi.
Osnovna provedba RangeMap je TreeRangeMap. Interno karta koristi a TreeMap pohraniti ključ kao raspon, a vrijednost kao bilo koji prilagođeni Java objekt.
2. Google Guava RangeMap
Pogledajmo kako koristiti RangeMap razred.
2.1. Ovisnost Mavena
Počnimo s dodavanjem Googleove ovisnosti o knjižnici Guava u pom.xml:
com.google.guava guava 29,0-jre
Najnoviju verziju ovisnosti možete provjeriti ovdje.
3. Stvaranje
Neki od načina na koje možemo stvoriti primjerak RangeMap su:
- Koristiti stvoriti metoda iz TreeRangeMap klase za stvaranje promjenjive karte:
RangeMap experienceRangeDesignationMap = TreeRangeMap.create ();
- Ako namjeravamo stvoriti nepromjenjivu mapu dometa, upotrijebite ImmutableRangeMap klasa (koja slijedi obrazac graditelja):
RangeMap experienceRangeDesignationMap = new ImmutableRangeMap.builder () .put (Range.closed (0, 2), "Associate") .build ();
4. Korištenje
Počnimo s jednostavnim primjerom koji prikazuje upotrebu RangeMap.
4.1. Dohvat temeljen na unosu unutar raspona
Možemo dobiti vrijednost povezanu s vrijednošću unutar raspona cijelih brojeva:
@Test javna praznina givenRangeMap_whenQueryWithinRange_returnsSucessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap.put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap.put (Range.closed (3, 5), "Viši suradnik"); experienceRangeDesignationMap.put (Range.closed (6, 8), "Vice President"); experienceRangeDesignationMap.put (Range.closed (9, 15), "Izvršni direktor"); assertEquals ("potpredsjednik", experienceRangeDesignationMap.get (6)); assertEquals ("izvršni direktor", experienceRangeDesignationMap.get (15)); }
Bilješka:
- The zatvoreno metoda Domet klasa pretpostavlja da je raspon cjelobrojnih vrijednosti između 0 i 2 (obje uključuju)
- The Domet u gornjem primjeru sastoji se od cijelih brojeva. Možemo koristiti niz bilo koje vrste, sve dok implementira Usporedive sučelje poput Niz, Lik, decimale s pomičnim zarezom itd.
- RangeMap vraća se Nula kada pokušavamo dobiti vrijednost za raspon koji nije prisutan na mapi
- U slučaju ImmutableRangeMap, raspon jedne tipke ne može se preklapati s rasponom ključa koji treba umetnuti. Ako se to dogodi, dobit ćemo IlegalArgumentException
- I ključevi i vrijednosti u RangeMap ne može biti null. Ako je netko od njih null, dobivamo a NullPointerException
4.2. Uklanjanje vrijednosti na temelju a Domet
Pogledajmo kako možemo ukloniti vrijednosti. U ovom primjeru pokazujemo kako ukloniti vrijednost povezanu s cijelim rasponom. Također pokazujemo kako ukloniti vrijednost na temelju djelomičnog raspona ključa:
@Test javna praznina givenRangeMap_whenRemoveRangeIsCalled_removesSucessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap.put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap.put (Range.closed (3, 5), "Viši suradnik"); experienceRangeDesignationMap.put (Range.closed (6, 8), "Vice President"); experienceRangeDesignationMap.put (Range.closed (9, 15), "Izvršni direktor"); experienceRangeDesignationMap.remove (Range.closed (9, 15)); experienceRangeDesignationMap.remove (Range.closed (1, 4)); assertNull (experienceRangeDesignationMap.get (9)); assertEquals ("Suradnik", experienceRangeDesignationMap.get (0)); assertEquals ("Viši suradnik", experienceRangeDesignationMap.get (5)); assertNull (experienceRangeDesignationMap.get (1)); }
Kao što se može vidjeti, čak i nakon djelomičnog uklanjanja vrijednosti iz raspona, još uvijek možemo dobiti vrijednosti ako je raspon i dalje valjan.
4.3. Raspon raspona ključeva
U slučaju da bismo željeli znati koliki je ukupni raspon a RangeMap je, možemo koristiti raspon metoda:
@Test javna praznina givenRangeMap_whenSpanIsCalled_returnsSucessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap.put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap.put (Range.closed (3, 5), "Viši suradnik"); experienceRangeDesignationMap.put (Range.closed (6, 8), "Vice President"); experienceRangeDesignationMap.put (Range.closed (9, 15), "Izvršni direktor"); experienceRangeDesignationMap.put (Range.closed (16, 30), "Managing Director"); Raspon experienceSpan = experienceRangeDesignationMap.span (); assertEquals (0, experienceSpan.lowerEndpoint (). intValue ()); assertEquals (30, experienceSpan.upperEndpoint (). intValue ()); }
4.4. Dobivanje a SubRangeMap
Kada želimo odabrati dio iz a RangeMap, možemo koristiti subRangeMap metoda:
@Test javna praznina givenRangeMap_whenSubRangeMapIsCalled_returnsSubRangeSuccessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap .put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap .put (Range.closed (3, 5), "Viši suradnik"); experienceRangeDesignationMap .put (Range.closed (6, 8), "Vice President"); experienceRangeDesignationMap .put (Range.closed (8, 15), "Izvršni direktor"); experienceRangeDesignationMap .put (Range.closed (16, 30), "Managing Director"); RangeMap doživeoSubRangeDesignationMap = experienceRangeDesignationMap.subRangeMap (Range.closed (4, 14)); assertNull (experienceSubRangeDesignationMap.get (3)); assertTrue (experienceSubRangeDesignationMap.asMapOfRanges (). values () .containsAll (Arrays.asList ("izvršni direktor", "potpredsjednik", "izvršni direktor")); }
Ova metoda vraća sjecište RangeMap s danim Domet parametar.
4.5. Dobivanje Ulazak
Napokon, ako tražimo Ulazak od RangeMap, koristimo getEntry metoda:
@Test javna praznina givenRangeMap_whenGetEntryIsCalled_returnsEntrySucessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap.put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap.put (Range.closed (3, 5), "Viši suradnik"); experienceRangeDesignationMap.put (Range.closed (6, 8), "Vice President"); experienceRangeDesignationMap.put (Range.closed (9, 15), "Izvršni direktor"); Karta.Ulaz experienceEntry = experienceRangeDesignationMap.getEntry (10); assertEquals (Range.closed (9, 15), experienceEntry.getKey ()); assertEquals ("izvršni direktor", experienceEntry.getValue ()); }
5. Zaključak
U ovom uputstvu ilustrirali smo primjere korištenja RangeMap u knjižnici Guava. Uglavnom se koristi za dobivanje vrijednosti na temelju ključa navedenog kao a s karte.
Implementacija ovih primjera može se naći u projektu GitHub - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.