Sprievodca po EnumMap

1. Prehľad

EnumMap je a Mapa implementácia, ktorá výlučne trvá Enum ako jeho kľúče.

V tomto výučbe sa dozvieme o jeho vlastnostiach, bežných prípadoch použitia a o tom, kedy by sme ich mali používať.

2. Nastavenie projektu

Predstavte si jednoduchú požiadavku, keď potrebujeme zmapovať dni v týždni so športom, ktorý v ten deň hráme:

Pondelok Futbal Utorok Basketbal Streda Turistika Štvrtok Karate 

Na to by sme mohli použiť enum:

verejné enum DayOfWeek {PONDELOK, UTOROK, STREDA, ŠTVRTOK, PIATOK, SOBOTA, NEDEĽA}

Ktorý uvidíme čoskoro, bude kľúčom pre našu mapu.

3. Tvorba

Aby sme začali skúmať EnumMap, najskôr budeme musieť vytvoriť inštanciu jedného:

EnumMap activityMap = nový EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "Futbal"); 

A tu je náš prvý rozdiel od niečoho bežnejšieho HashMap. Všimnite si, že s HashMap, parametrizácia typu je dostatočná, to znamená, že sa z nej môžeme dostať nová HashMap (). Avšak EnumMap vyžaduje typ kľúča v konštruktore.

3.1. EnumMap Kopírovať konštruktor

EnumMap dodáva sa aj s dvoma konštruktérmi kópií. Prvý berie ďalšie EnumMap:

EnumMap activityMap = nový EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "Futbal"); activityMap.put (DayOfWeek.TUESDAY, "Basketball"); EnumMap activityMapCopy = nový EnumMap (dayMap); assertThat (activityMapCopy.size ()). isEqualTo (2); assertThat (activityMapCopy.get (DayOfWeek.MONDAY)). isEqualTo ("Futbal"); assertThat (activityMapCopy.get (DayOfWeek.TUESDAY)). isEqualTo ("Basketball");

3.2. Mapa Kopírovať konštruktor

Alebo ak máme neprázdny Mapa ktorého kľúčom je enum, potom to môžeme urobiť aj my:

Mapa obyčajnáMapa = nová HashMap (); obycajnaMapa.vystup (DayOfWeek.MONDAY, "Futbal"); EnumMap enumMap = nový EnumMap (obyčajná mapa); assertThat (enumMap.size ()). isEqualTo (1); assertThat (enumMap.get (DayOfWeek.MONDAY)). isEqualTo ("Futbal");

Upozorňujeme, že mapa musí byť neprázdna EnumMap môže určiť typ kľúča z existujúceho záznamu.

Ak zadaná mapa obsahuje viac ako jeden typ výčtu, konštruktor hodí ClassCastException.

4. Pridávanie a načítanie prvkov

Po vytvorení inštancie EnumMap, môžeme náš šport pridať pomocou put () metóda:

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

A na jeho získanie môžeme použiť dostať ():

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

5. Kontrola prvkov

Na kontrolu, či máme pre konkrétny deň definované mapovanie, použijeme containsKey ():

activityMap.put (DayOfWeek.WEDNESDAY, "Turistika"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isTrue ();

A aby sme zistili, či je konkrétny šport priradený k ľubovoľnému použitému kľúču containsValue ():

assertThat (activityMap.containsValue ("Turistika")). isTrue (); 

5.1. nulový ako Hodnota

Teraz, nulový je sémanticky platná hodnota pre EnumMap.

Spojme sa nulový „nerobiť nič“ a mapovať to na sobotu:

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. Odstránenie prvkov

Aby sme zmapovali konkrétny deň, jednoducho odstrániť () to:

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

Ako môžeme pozorovať, odobrať (kľúč) vráti predchádzajúcu hodnotu spojenú s kľúčom, alebo nulový ak by pre kľúč neexistovalo mapovanie.

Môžeme sa tiež rozhodnúť zmapovať konkrétny deň iba ak daný deň je namapovaný na konkrétnu aktivitu:

activityMap.put (DayOfWeek.Monday, "Futbal"); assertThat (activityMap.remove (DayOfWeek.Monday, "Turistika")). isEqualTo (false); assertThat (activityMap.remove (DayOfWeek.Monday, "Futbal")). isEqualTo (true); 

remove (kľúč, hodnota) odstráni položku pre zadaný kľúč, iba ak je kľúč momentálne namapovaný na zadanú hodnotu.

7. Zobrazenia zbierky

Rovnako ako pri bežných mapách, pri akýchkoľvek EnumMap, môžeme mať 3 rôzne zobrazenia alebo čiastkové zbierky.

Najskôr si vytvorme novú mapu našich aktivít:

EnumMap activityMap = nový EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.THURSDAY, "Karate"); activityMap.put (DayOfWeek.WEDNESDAY, "Turistika"); activityMap.put (DayOfWeek.MONDAY, "Futbal");

7.1. hodnoty

Prvý pohľad na našu mapu aktivít je hodnoty () ktorý, ako už názov napovedá, vráti všetky hodnoty na mape:

Hodnoty zbierky = dayMap.values ​​(); assertThat (hodnoty) .obsahuje Presne ("Futbal", "Turistika", "Karate"); 

Tu si všimnite, že EnumMap je zoradená mapa. Používa poradie Deň v týždni enum na určenie poradia záznamov.

7.2. keySet

Podobne keySet () vráti kolekciu kľúčov, opäť v poradí enum:

Nastaviť klávesy = dayMap.keySet (); assertThat (kľúče) .obsahuje Presne (DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY, DayOfWeek.SATURDAY); 

7.3. entrySet

Nakoniec entrySet () vráti mapovanie v pároch kľúča a hodnoty:

assertThat (dayMap.entrySet ()) .containsExactly (nový SimpleEntry (DayOfWeek.MONDAY, „Futbal“), nový SimpleEntry (DayOfWeek.WEDNESDAY, „Turistika“), nový SimpleEntry (DayOfWeek.THURSDAY,)) 

Objednávanie na mape sa vám môže určite hodiť a v našom výučbe, ktorý porovnáva TreeMap s HashMap, sa pozrieme do väčšej hĺbky.

7.4. Premenlivosť

Teraz nezabudnite, že všetky zmeny, ktoré urobíme v pôvodnej mape aktivity, sa prejavia v ktoromkoľvek z jej zobrazení:

activityMap.put (DayOfWeek.TUESDAY, "Basketball"); assertThat (hodnoty) .obsahuje Presne ("Futbal", "Basketbal", "Turistika", "Karate"); 

A naopak; všetky zmeny, ktoré vykonáme, sa zobrazia v pôvodnej mape aktivít:

values.remove ("Turistika"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isFalse (); assertThat (activityMap.size ()). isEqualTo (3); 

Za EnumMapZmluva s Mapa rozhranie, čiastkové zobrazenia sú podporené pôvodnou mapou.

8. Kedy použiť EnumMap

8.1. Výkon

Použitím Enum ako kľúč umožňuje vykonať ďalšiu optimalizáciu výkonu, ako rýchlejší výpočet hodnoty hash, pretože všetky možné kľúče sú známe vopred.

Jednoduchosť mať enum ako kľúčové prostriedky EnumMap musí byť zálohovaný iba obyčajnou starou Javou Pole s veľmi jednoduchou logikou pre ukladanie a vyhľadávanie. Na druhej strane generické Mapa implementácie musia uspokojovať obavy spojené s kľúčovým prvkom generického objektu. Napríklad, HashMap potrebuje komplexnú dátovú štruktúru a podstatne zložitejšiu logiku ukladania a načítania, aby bola zaistená možnosť kolízie hash.

8.2. Funkčnosť

Ako sme tiež videli, EnumMap je usporiadaná mapa v tom, že jej zobrazenia budú iterovať v poradí enum. Aby sme sa dostali k podobnému správaniu pri zložitejších scenároch, môžeme sa pozrieť na TreeMap alebo LinkedHashMap.

9. Záver

V tomto článku sme preskúmali EnumMap implementácia Mapa rozhranie. Pri práci s Enum ako kľúč, EnumMap môže prísť vhod.

Celý zdrojový kód pre všetky príklady použité v tomto tutoriále nájdete v projekte GitHub.


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