Útmutató az EnumMap-hoz

1. Áttekintés

EnumMap egy Térkép kizárólagosan megvalósításra van szükség Enum mint kulcsai.

Ebben az oktatóanyagban megvitatjuk a tulajdonságait, a szokásos használati eseteket és azt, hogy mikor kell használnunk.

2. Projekt beállítása

Képzeljen el egy egyszerű követelményt, ahol feltérképeznünk kell a hét napjait az aznapi sporttal:

Hétfő foci kedd kosárlabda szerda túrázás csütörtök karate 

Ehhez használhatunk enumot:

public enum DayOfWeek {HÉTFŐ, KEDD, SZERDA, CSÜTÖRTÖK, PÉNTEK, SZOMBAT, VASÁRNAP}

Amit hamarosan meglátunk, az lesz a térképünk kulcsa.

3. Teremtés

Kezdeni a felfedezést EnumMap, először be kell állítanunk egyet:

EnumMap activityMap = új EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "Foci"); 

És itt van az első különbség valami általánosabb dologban, például HashMap. Vegye figyelembe, hogy a HashMap, a típus paraméterezése elegendő, vagyis megúszhatjuk új HashMap (). Azonban, EnumMap megköveteli a kulcs típusát a konstruktorban.

3.1. EnumMap Copy Constructor

EnumMap két másolat-készítővel is szállít. Az első elvesz egy másikat EnumMap:

EnumMap activityMap = új EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "Foci"); activityMap.put (DayOfWeek.TUESDAY, "Kosárlabda"); EnumMap activityMapCopy = új EnumMap (dayMap); assertThat (activityMapCopy.size ()). isEqualTo (2); assertThat (activityMapCopy.get (DayOfWeek.MONDAY)). isEqualTo ("Foci"); assertThat (activityMapCopy.get (DayOfWeek.TUESDAY)). isEqualTo ("Kosárlabda");

3.2. Térkép Copy Constructor

Vagy, ha van egy nem üres Térkép amelynek kulcsa egy enum, akkor mi is megtehetjük:

Térkép: normalMap = új HashMap (); rendesMap.put (DayOfWeek.MONDAY, "Foci"); EnumMap enumMap = új EnumMap (normalMap); assertThat (enumMap.size ()). isEqualTo (1); assertThat (enumMap.get (DayOfWeek.MONDAY)). isEqualTo ("Foci");

Vegye figyelembe, hogy a térképnek nem üresnek kell lennie EnumMap meg tudja határozni a kulcs típusát egy meglévő bejegyzésből.

Ha a megadott térkép egynél több enum típust tartalmaz, akkor a kivitelező dob ClassCastException.

4. Elemek hozzáadása és visszakeresése

Miután példányosított egy EnumMap, hozzáadhatjuk sportágunkat a put () módszer:

activityMap.put (DayOfWeek.MONDAY, "Foci");

És visszakereséséhez használhatjuk kap():

assertThat (clubMap.get (DayOfWeek.MONDAY)). isEqualTo ("Foci");

5. Az elemek ellenőrzése

Annak ellenőrzésére, hogy van-e meghatározva egy adott napra vonatkozó leképezés, használjuk tartalmazzaKey ():

activityMap.put (DayOfWeek.WEDNESDAY, "túrázás"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isTrue ();

És annak ellenőrzése, hogy egy adott sportág fel van-e kapcsolva az általunk használt kulcsokkal tartalmazzaValue ():

assertThat (activityMap.containsValue ("túrázás")). isTrue (); 

5.1. nulla mint Érték

Most, nulla szemantikailag érvényes értéke a EnumMap.

Társuljunk nulla „semmittevéssel”, és szombatig térképezzük fel:

assertThat (activityMap.containsKey (DayOfWeek.SATURDAY)). isFalse (); assertThat (activityMap.containsValue (null)). isFalse (); activityMap.put (DayOfWeek.SATURDAY, null); assertThat (activityMap.containsKey (DayOfWeek.SATURDAY)). isTrue (); assertThat (activityMap.containsValue (null)). isTrue ();

6. Elemek eltávolítása

Egy adott nap feltérképezése érdekében egyszerűen eltávolítás () azt:

activityMap.put (DayOfWeek.MONDAY, "Foci"); assertThat (activityMap.remove (DayOfWeek.MONDAY)). isEqualTo ("Foci"); assertThat (activityMap.containsKey (DayOfWeek.MONDAY)). isFalse (); 

Amint megfigyelhetjük, eltávolít (kulcs) a kulccsal társított előző értéket adja vissza, vagy nulla ha nem történt a kulcs leképezése.

Mi is választhatunk egy adott nap feltérképezése csak ha az a nap egy adott tevékenységhez van feltérképezve:

activityMap.put (DayOfWeek.Monday, "Foci"); assertThat (activityMap.remove (DayOfWeek.Monday, "túrázás")). isEqualTo (hamis); assertThat (activityMap.remove (DayOfWeek.Monday, "Foci")). isEqualTo (true); 

eltávolítás (kulcs, érték) csak akkor távolítja el a megadott kulcs bejegyzését, ha a kulcs jelenleg a megadott értékhez van hozzárendelve.

7. Gyűjtemény nézetek

Csakúgy, mint a szokásos térképeknél, bármelyikkel EnumMap, 3 különböző nézetünk vagy algyűjteményünk lehet.

Először készítsünk egy új térképet tevékenységeinkről:

EnumMap activityMap = új EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.TÜRTÖRTÖK, "Karate"); activityMap.put (DayOfWeek.WEDNESDAY, "túrázás"); activityMap.put (DayOfWeek.MONDAY, "Foci");

7.1. értékek

Tevékenységi térképünk első nézete értékek () amely, amint a neve is mutatja, a térkép összes értékét visszaadja:

Gyűjtemény értékei = dayMap.values ​​(); assertThat (értékek) .conactExactly ("foci", "túrázás", "karate"); 

Itt jegyezzük meg EnumMap egy rendezett térkép. A. Sorrendjét használja A hét napja enum a bejegyzések sorrendjének meghatározásához.

7.2. keySet

Hasonlóképpen, keySet () a kulcsok gyűjteményét adja vissza, ismét felsorolási sorrendben:

Set keys = dayMap.keySet (); assertThat (kulcsok) .containsExactly (DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY, DayOfWeek.SATURDAY); 

7.3. entrySet

Végül, entrySet () a kulcs és érték párjában adja vissza a leképezést:

assertThat (dayMap.entrySet ()) .conconExactly (új SimpleEntry (DayOfWeek.MONDAY, "Foci"), új SimpleEntry (DayOfWeek.WEDNESDAY, "Túrázás"), új SimpleEntry (DayOfWeek.THURSDAY), "Karate"; 

A térképen történő rendelés minden bizonnyal jól jöhet, és részletesebben bemutatjuk az oktatóanyagunkat, amely összehasonlítja a TreeMap-ot a HashMap-tal.

7.4. Változtathatóság

Ne feledje, hogy az eredeti tevékenységtérképen végrehajtott bármilyen változás tükröződik bármely nézetében:

activityMap.put (DayOfWeek.TUESDAY, "Kosárlabda"); assertThat (értékek). pontosan tartalmaz ("foci", "kosárlabda", "túrázás", "karate"); 

És fordítva; az alnézetekben végrehajtott bármilyen változás tükröződik az eredeti tevékenységtérképen:

értékek.remove ("túrázás"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isFalse (); assertThat (activityMap.size ()). isEqualTo (3); 

Per EnumMapSzerződése Térkép felületen az alnézeteket az eredeti térkép támogatja.

8. Mikor kell használni EnumMap

8.1. Teljesítmény

Használata Enum mivel a kulcs lehetővé teszi néhány extra teljesítmény-optimalizálást, mint egy gyorsabb hash-számítás, mivel az összes lehetséges kulcs előre ismert.

A birtoklás egyszerűsége enum mint kulcsfontosságú EnumMap csak egy sima régi Java-val kell alátámasztani Sor a tárolás és visszakeresés nagyon egyszerű logikájával. Másrészt általános Térkép a megvalósításoknak figyelembe kell venniük azokat az aggályokat, amelyek egy általános objektum kulcsa. Például, HashMap komplex adatstruktúrára és lényegesen összetettebb tárolási és visszakeresési logikára van szüksége a hash ütközés lehetőségének kielégítéséhez.

8.2. Funkcionalitás

Továbbá, amint láttuk, EnumMap rendezett térkép, annyiban, hogy nézetei sorrendben ismétlődnek. A bonyolultabb forgatókönyvek esetén hasonló viselkedést kaphatunk TreeMap vagy LinkedHashMap.

9. Következtetés

Ebben a cikkben a EnumMap a Térkép felület. Amikor dolgozik Enum mint kulcs, EnumMap jól jöhet.

Az oktatóanyagban használt összes példa teljes forráskódja megtalálható a GitHub projektben.