Få nøkkelen til en verdi fra et Java-kart

1. Introduksjon

I denne raske opplæringen skal vi demonstrere tre forskjellige tilnærminger for å hente nøkkelen fra et kart for en gitt verdi. Vi vil også diskutere positive og negative med de forskjellige løsningene.

For å lære mer om Kart grensesnitt, kan du sjekke ut denne artikkelen.

2. En Iterativ tilnærming

De Kart grensesnitt av Java-samlinger tilbyr en metode som heter entrySet (). Den returnerer alle oppføringene eller nøkkelverdiparene på kartet i a Sett.

Tanken er å gjenta dette inngangssettet og returnere nøkkelen som verdien samsvarer med den oppgitte verdien:

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

Det kan imidlertid være en mulighet for at flere nøkler peker på samme verdi.

I så fall, hvis en samsvarende verdi blir funnet, legger vi til nøkkelen til a Sett og fortsett løkken. Til slutt returnerer vi Sett inneholder alle de ønskede tastene:

public Set getKeys (Map map, V value) {Set keys = new HashSet (); for (Entry entry: map.entrySet ()) {if (entry.getValue (). equals (value)) {keys.add (entry.getKey ()); }} returtaster }

Selv om dette er en veldig rett fram implementering, den sammenligner alle oppføringene selv om alle treff blir funnet etter noen gjentakelser.

3. En funksjonell tilnærming

Med introduksjonen av Lambda Expressions i Java 8, kan vi gjøre det på en mer fleksibel og lesbar måte. Vi konverterer inngangssettet til a Strøm og gi en lambda for å filtrere bare oppføringene med den gitte verdien.

Deretter bruker vi kartmetoden for å returnere a Strøm av nøklene fra de filtrerte oppføringene:

offentlige Stream-nøkler (Map map, V value) {retur map .entrySet () .stream () .filter (entry -> value.equals (entry.getValue ())) .map (Map.Entry :: getKey); }

Fordelen med å returnere en strøm er at den kan imøtekomme et bredt spekter av kundebehov. Det kan hende at ringekoden bare krever en nøkkel eller at alle nøklene peker på den angitte verdien. Siden evalueringen av en strøm er lat, kan klienten kontrollere antall iterasjoner basert på kravet.

I tillegg kan klienten konvertere strømmen til hvilken som helst samling ved hjelp av en passende samler:

Stream keyStream1 = nøkler (capitalCountryMap, "Sør-Afrika"); Strengskapital = keyStream1.findFirst (). Get (); Stream keyStream2 = nøkler (capitalCountryMap, "Sør-Afrika"); Sett hovedsteder = keyStream2.collect (Collectors.toSet ());

4. Bruke Apache Commons-samlinger

Ovennevnte ideer vil ikke være veldig nyttige hvis vi trenger å ringe funksjonene veldig ofte for et bestemt kart. Det vil unødvendig iterere settet med nøklene igjen og igjen.

I dette scenariet, å opprettholde et nytt verdikart til tastene ville være mer fornuftig, da det vil ta konstant tid å hente nøkkelen til en verdi.

De Commons samlinger bibliotek av Apache gir med en slik toveis Kart kalt BidiMap. Den har en metode som heter getKey () for å hente en nøkkel for en gitt verdi:

BidiMap capitalCountryMap = ny DualHashBidiMap (); capitalCountryMap.put ("Berlin", "Tyskland"); capitalCountryMap.put ("Cape Town", "Sør-Afrika"); String capitalOfGermany = capitalCountryMap.getKey ("Tyskland");

Derimot, BidiMap pålegger et 1: 1 forhold mellom nøklene og verdiene. Hvis vi prøver å sette et nøkkelverdipar som verdien allerede finnes i Kart, det fjerner den gamle oppføringen. Med andre ord oppdaterer den nøkkelen mot verdien.

Det krever også en større mengde minne for å beholde det omvendte kartet.

Mer informasjon om hvordan du bruker en BidiMap er i denne veiledningen.

5. Bruke Google Guava

Vi kan bruke en annen toveis Kart kalt BiMap funnet i Guava utviklet av Google. Denne klassen gir en metode som heter omvendt() for å få verditasten Kart eller omvendt Kart å hente nøkkelen basert på en gitt verdi:

HashBiMap capitalCountryMap = HashBiMap.create (); capitalCountryMap.put ("Berlin", "Tyskland"); capitalCountryMap.put ("Cape Town", "Sør-Afrika"); String capitalOfGermany = capitalCountryMap.inverse (). Get ("Tyskland");

Som BidiMap, BiMap tillater heller ikke flere nøkler som refererer til samme verdi. Hvis vi prøver å gjøre et slikt forsøk, kaster det a java.lang.IllegalArgumentException .

Unødvendig å si, BiMap bruker også en betydelig mengde minne da den må lagre det omvendte kartet inne. Hvis du er interessert i å vite mer om BiMap, kan du sjekke ut denne veiledningen.

6. Konklusjon

I denne korte artikkelen har vi diskutert noen metoder for å hente en Kart nøkkel gitt verdien. Hver tilnærming har sine egne fordeler og ulemper. Vi bør alltid vurdere brukssakene og velge den mest hensiktsmessige basert på situasjonen.

Den komplette kildekoden for opplæringen ovenfor er tilgjengelig på GitHub.