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.


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