Získajte kľúč k hodnote z mapy Java

1. Úvod

V tomto rýchlom výučbe ukážeme tri rôzne prístupy k získaniu kľúča z mapy pre danú hodnotu. Budeme tiež diskutovať o pozitívach a negatívach rôznych riešení.

Ak sa chcete dozvedieť viac o Mapa si môžete pozrieť v tomto článku.

2. Iteratívny prístup

The Mapa rozhranie rozhrania Zbierky Java ponúka metódu tzv entrySet (). Vráti všetky položky alebo páry kľúč - hodnota mapy v a Nastaviť.

Ide o iteráciu s touto vstupnou množinou a vrátenie kľúča, ktorého hodnota sa zhoduje s dodanou hodnotou:

public K getKey (Mapa mapy, hodnota V) {for (Záznam vstupu: map.entrySet ()) {if (entry.getValue (). equals (hodnota)) {return entry.getKey (); }} return null; }

Môže však existovať možnosť, že viac klávesov smeruje na rovnakú hodnotu.

V takom prípade, ak sa nájde zodpovedajúca hodnota, pridáme kľúč k a Nastaviť a pokračujte v slučke. Nakoniec vrátime Nastaviť obsahujúce všetky požadované kľúče:

public Set getKeys (mapa mapy, hodnota V) {Set keys = new HashSet (); pre (Entry entry: map.entrySet ()) {if (entry.getValue (). equals (value)) {keys.add (entry.getKey ()); }} návratove klúče; }

Aj keď ide o veľmi priamu implementáciu, porovnáva všetky položky, aj keď sa všetky zhody nájdu po niekoľkých iteráciách.

3. Funkčný prístup

Po zavedení jazyka Lambda Expressions v prostredí Java 8 to dokážeme urobiť flexibilnejším a čitateľnejším spôsobom. Vstupnú množinu prevádzame na a Prúd a dodáme lambdu na filtrovanie iba tých záznamov s danou hodnotou.

Potom pomocou metódy mapy vrátime a Prúd z kľúčov z filtrovaných položiek:

verejné kľúče streamu (mapa mapy, hodnota V) {návratová mapa .entrySet () .stream () .filter (položka -> hodnota.equals (entry.getValue ())) .map (Map.Entry :: getKey); }

Výhodou vrátenia streamu je, že dokáže uspokojiť široké spektrum potrieb klientov. Volací kód môže vyžadovať iba jeden kláves alebo všetky klávesy smerujúce k dodanej hodnote. Pretože je hodnotenie toku údajov lenivé, klient môže na základe jeho požiadavky riadiť počet iterácií.

Ďalej môže klient prevádzať prúd na ľubovoľnú zbierku pomocou vhodného zberača:

Stream keyStream1 = keys (capitalCountryMap, "Južná Afrika"); Reťazec capital = keyStream1.findFirst (). Get (); Stream keyStream2 = keys (capitalCountryMap, "Južná Afrika"); Nastaviť veľké písmená = keyStream2.collect (Collectors.toSet ());

4. Používanie zbierok Apache Commons

Vyššie uvedené nápady by neboli veľmi užitočné ak potrebujeme volať funkcie veľmi často pre konkrétnu mapu. Zbytočne tak bude opakovane opakovať množinu svojich kľúčov.

V tomto scenári zachovanie ďalšej mapy hodnoty ku kľúčom by malo väčší zmysel, pretože získanie hodnoty kľúča bude trvať neustále.

The Spoločné zbierky knižnica od Apache poskytuje také obojsmerné Mapa zavolal BidiMap. Má pomenovanú metódu getKey () pre získanie kľúča pre danú hodnotu:

BidiMap capitalCountryMap = nový DualHashBidiMap (); capitalCountryMap.put ("Berlín", "Nemecko"); capitalCountryMap.put ("Kapské mesto", "Južná Afrika"); Reťazec capitalOfGermany = capitalCountryMap.getKey ("Nemecko");

Avšak BidiMap ukladá vzťah 1: 1 medzi jeho kľúčmi a hodnotami. Ak sa pokúsime vložiť pár kľúč - hodnota, pre ktorý hodnota už existuje v Mapa, odstráni starý záznam. Inými slovami, aktualizuje kľúč oproti hodnote.

Vyžaduje tiež väčšie množstvo pamäte na uchovanie reverznej mapy.

Viac podrobností o tom, ako používať a BidiMap sú v tomto návode.

5. Používanie služby Google Guava

Môžeme použiť iný obojsmerný smer Mapa zavolal BiMap nájdené v Guave vyvinutom spoločnosťou Google. Táto trieda poskytuje metódu s názvom inverzná () získať hodnotový kľúč Mapa alebo naopak Mapa načítať kľúč na základe danej hodnoty:

HashBiMap capitalCountryMap = HashBiMap.create (); capitalCountryMap.put ("Berlín", "Nemecko"); capitalCountryMap.put ("Kapské mesto", "Južná Afrika"); Reťazec capitalOfGermany = capitalCountryMap.inverse (). Get ("Nemecko");

Páči sa mi to BidiMap, BiMap tiež neumožňuje viac kľúčov odkazujúcich na rovnakú hodnotu. Ak sa pokúsime o taký pokus, hodí to a java.lang.IllegalArgumentException .

Netreba hovoriť, BiMap tiež používa značné množstvo pamäte, pretože musí ukladať inverznú mapu dovnútra. Ak máte záujem dozvedieť sa viac o BiMap, môžete si pozrieť tento návod.

6. Záver

V tomto krátkom článku sme diskutovali o niektorých metódach načítania a Mapy kľúč vzhľadom na hodnotu. Každý prístup má svoje vlastné výhody a nevýhody. Mali by sme vždy brať do úvahy prípady použitia a na základe situácie zvoliť ten najvhodnejší.

Kompletný zdrojový kód pre vyššie uvedený tutoriál je k dispozícii na GitHub.


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