Nabavite ključ za vrijednost s Java mape

1. Uvod

U ovom brzom vodiču demonstrirat ćemo tri različita pristupa za dohvaćanje ključa s karte za zadanu vrijednost. Također ćemo razgovarati o pozitivnim i negativnim stranama različitih rješenja.

Da biste saznali više o Karta sučelje, možete pogledati ovaj članak.

2. Iterativni pristup

The Karta sučelje Zbirke Java nudi metodu tzv entrySet (). Vraća sve unose ili parove ključ / vrijednost karte u a Postavi.

Ideja je ponoviti ovaj skup unosa i vratiti ključ za koji se vrijednost podudara s isporučenom vrijednošću:

public K getKey (Map map, V value) {for (Entry entry: map.entrySet ()) {if (entry.getValue (). equals (value)) {return entry.getKey (); }} return null; }

Međutim, možda postoji mogućnost da više tipki pokazuje na istu vrijednost.

U tom slučaju, ako se pronađe odgovarajuća vrijednost, dodamo ključ u Postavi i nastavite petlju. Na kraju vraćamo Postavi koji sadrži sve željene ključeve:

javni Postavi getKeys (karta karte, vrijednost V) {Postavi ključeve = novi HashSet (); for (Entry entry: map.entrySet ()) {if (entry.getValue (). equals (value)) {keys.add (entry.getKey ()); }} tipke za povratak; }

Iako je ovo vrlo neposredna primjena, uspoređuje sve unose čak i ako su sva podudaranja pronađena nakon nekoliko ponavljanja.

3. Funkcionalni pristup

Uvođenjem Lambda Expressionsa u Javi 8 to možemo učiniti na fleksibilniji i čitljiviji način. Pretvaramo ulazni skup u Stream i dostavite lambda za filtriranje samo onih unosa s danom vrijednošću.

Tada koristimo metodu karte za vraćanje a Stream ključeva iz filtriranih unosa:

javni ključevi streama (karta karte, V vrijednost) {return map .entrySet () .stream () .filter (entry -> value.equals (entry.getValue ())) .map (Map.Entry :: getKey); }

Prednost vraćanja streama je što može zadovoljiti širok spektar potreba klijenta. Pozivni broj može zahtijevati samo jednu tipku ili sve tipke koje upućuju na isporučenu vrijednost. Kako je procjena toka lijena, klijent može kontrolirati broj ponavljanja na temelju svojih zahtjeva.

Osim toga, klijent može pretvoriti stream u bilo koju kolekciju pomoću odgovarajućeg sakupljača:

Stream keyStream1 = ključevi (capitalCountryMap, "Južna Afrika"); Kapitalni niz = keyStream1.findFirst (). Get (); Stream keyStream2 = ključevi (capitalCountryMap, "Južna Afrika"); Postavljanje velikih slova = keyStream2.collect (Collectors.toSet ());

4. Korištenje zbirki Apache Commons

Gore navedene ideje ne bi bile od velike pomoći ako trebamo pozivati ​​funkcije vrlo često za određenu kartu. Nepotrebno će ponavljati set svojih tipki iznova i iznova.

U ovom scenariju, održavanje druge mape vrijednosti ključeva imalo bi više smisla jer će trebati stalno vrijeme za dohvaćanje ključa za vrijednost.

The Commons Zbirke knjižnica by Apači pruža takav dvosmjerni Karta pozvao BidiMap. Ima metodu nazvanu getKey () za dohvaćanje ključa za zadanu vrijednost:

BidiMap capitalCountryMap = novi DualHashBidiMap (); capitalCountryMap.put ("Berlin", "Njemačka"); capitalCountryMap.put ("Cape Town", "Južna Afrika"); Niz kapitalOfGermany = capitalCountryMap.getKey ("Njemačka");

Međutim, BidiMap nameće odnos 1: 1 između njegovih ključeva i vrijednosti. Ako pokušamo staviti par ključ / vrijednost za koji vrijednost već postoji u Karta, uklanja stari unos. Drugim riječima, ažurira ključ prema vrijednosti.

Također, potrebna je veća količina memorije za čuvanje obrnute karte.

Više pojedinosti o korištenju a BidiMap su u ovom vodiču.

5. Korištenje Google Guave

Možda koristimo još jedan dvosmjerni Karta pozvao BiMap pronađena u Guavi koju je razvio Google. Ova klasa pruža metodu imenovanu inverzan() da biste dobili ključ vrijednosti Karta ili obrnuto Karta za dohvaćanje ključa na temelju zadane vrijednosti:

HashBiMap capitalCountryMap = HashBiMap.create (); capitalCountryMap.put ("Berlin", "Njemačka"); capitalCountryMap.put ("Cape Town", "Južna Afrika"); String capitalOfGermany = capitalCountryMap.inverse (). Get ("Njemačka");

Kao BidiMap, BiMap također ne dopušta više ključeva koji se odnose na istu vrijednost. Ako pokušamo napraviti takav pokušaj, to baca a java.lang.IllegalArgumentException .

Nepotrebno je reći, BiMap također koristi značajnu količinu memorije jer mora pohraniti inverznu kartu unutra. Ako ste zainteresirani da saznate više o BiMap, možete pogledati ovaj vodič.

6. Zaključak

U ovom kratkom članku razgovarali smo o nekim metodama dohvaćanja a Karte ključ s obzirom na vrijednost. Svaki pristup ima svoje prednosti i nedostatke. Uvijek bismo trebali razmotriti slučajeve upotrebe i odabrati najprikladniji na temelju situacije.

Kompletni izvorni kod za gornji vodič dostupan je na GitHub-u.