Få nøglen til en værdi fra et Java-kort

1. Introduktion

I denne hurtige vejledning skal vi demonstrere tre forskellige tilgange til at hente nøglen fra et kort til en given værdi. Vi diskuterer også de positive og negativer ved de forskellige løsninger.

For at lære mere om Kort interface, kan du tjekke denne artikel.

2. En iterativ tilgang

Det Kort grænseflade til Java-samlinger tilbyder en metode kaldet entrySet (). Det returnerer alle poster eller nøgleværdipar på kortet i a Sæt.

Ideen er at gentage dette indgangssæt og returnere den nøgle, som værdien matcher den leverede værdi for:

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

Der kan dog være en mulighed for, at flere nøgler peger på den samme værdi.

I så fald, hvis der findes en matchende værdi, tilføjer vi nøglen til a Sæt og fortsæt løkken. I sidste ende returnerer vi Sæt indeholdende alle de ønskede taster:

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

Selv om dette er en meget ligefrem implementering, det sammenligner alle poster, selvom alle matches findes efter et par iterationer.

3. En funktionel tilgang

Med introduktionen af ​​Lambda Expressions i Java 8 kan vi gøre det på en mere fleksibel og læsbar måde. Vi konverterer indgangssættet til a Strøm og lever en lambda til kun at filtrere de poster med den givne værdi.

Derefter bruger vi kortmetoden til at returnere a Strøm af tasterne fra de filtrerede poster:

offentlige Stream-nøgler (kortkort, V-værdi) {returkort .entrySet () .stream () .filter (post -> value.equals (entry.getValue ())). kort (Map.Entry :: getKey); }

Fordelen ved at returnere en stream er, at den kan imødekomme en lang række kundebehov. Opkaldskoden kræver muligvis kun en nøgle eller alle nøgler, der peger på den leverede værdi. Da evalueringen af ​​en stream er doven, kan klienten kontrollere antallet af iteration baseret på dens krav.

Derudover kan klienten konvertere strømmen til enhver samling ved hjælp af en passende samler:

Stream keyStream1 = nøgler (capitalCountryMap, "Sydafrika"); String kapital = keyStream1.findFirst (). Get (); Stream keyStream2 = nøgler (capitalCountryMap, "Sydafrika"); Indstil hovedstæder = keyStream2.collect (Collectors.toSet ());

4. Brug af Apache Commons-samlinger

Ovenstående ideer ville ikke være meget nyttige hvis vi har brug for at kalde funktionerne meget ofte for et bestemt kort. Det gentager unødvendigt nøglesættet igen og igen.

I dette scenarie vedligeholdelse af et andet værdikort til tasterne ville give mere mening, da det vil tage konstant tid at hente nøglen til en værdi.

Det Commons samlinger bibliotek af Apache giver en sådan tovejs Kort hedder BidiMap. Det har en metode, der hedder getKey () til hentning af en nøgle til en given værdi:

BidiMap capitalCountryMap = nyt DualHashBidiMap (); capitalCountryMap.put ("Berlin", "Tyskland"); capitalCountryMap.put ("Cape Town", "Sydafrika"); String capitalOfGermany = capitalCountryMap.getKey ("Tyskland");

Imidlertid, BidiMap pålægger et 1: 1 forhold mellem dets nøgler og værdier. Hvis vi prøver at sætte et nøgleværdipar, som værdien allerede findes i Kort, det fjerner den gamle post. Med andre ord opdaterer den nøglen mod værdien.

Det kræver også en større mængde hukommelse for at beholde det omvendte kort.

Flere detaljer om, hvordan du bruger en BidiMap er i denne vejledning.

5. Brug af Google Guava

Vi bruger muligvis en anden tovejs Kort hedder BiMap fundet i Guava udviklet af Google. Denne klasse giver en metode, der hedder omvendt () for at få værditasten Kort eller omvendt Kort at hente nøglen baseret på en given værdi:

HashBiMap capitalCountryMap = HashBiMap.create (); capitalCountryMap.put ("Berlin", "Tyskland"); capitalCountryMap.put ("Cape Town", "Sydafrika"); String capitalOfGermany = capitalCountryMap.inverse (). Get ("Tyskland");

Synes godt om BidiMap, BiMap tillader heller ikke flere nøgler, der henviser til den samme værdi. Hvis vi forsøger at gøre et sådant forsøg, kaster det et java.lang.IllegalArgumentException .

Det er overflødigt at sige, BiMap bruger også en betydelig mængde hukommelse, da den skal gemme det omvendte kort inde. Hvis du er interesseret i at vide mere om BiMap, kan du tjekke denne vejledning.

6. Konklusion

I denne korte artikel har vi diskuteret nogle metoder til at hente en Kort nøgle givet værdien. Hver tilgang har sine egne fordele og ulemper. Vi bør altid overveje brugssagerne og vælge den mest passende ud fra situationen.

Den komplette kildekode til ovenstående tutorial er tilgængelig på GitHub.