Szerezd meg az érték kulcsát egy Java-térképen

1. Bemutatkozás

Ebben a gyors bemutatóban három különböző megközelítést mutatunk be a kulcs lekéréséhez egy adott értékű térképről. Megbeszéljük a különféle megoldások pozitívumait és negatívumait is.

Ha többet szeretne megtudni a Térkép kezelőfelületen, megnézheti ezt a cikket.

2. Iteratív megközelítés

A Térkép interfész Java gyűjtemények nevű módszert kínál entrySet (). Visszaadja az a térkép összes bejegyzését vagy kulcs-érték párját Készlet.

Az ötlet az, hogy iteráljon ezen a bejegyzéskészleten, és adja vissza azt a kulcsot, amelynek értéke megegyezik a megadott értékkel:

public K getKey (Map map, V value) {for (Bejegyzés bejegyzése: map.entrySet ()) {if (entry.getValue (). egyenlő (érték)) {return entry.getKey (); }} return null; }

Lehetséges azonban, hogy több kulcs is ugyanarra az értékre mutat.

Ebben az esetben, ha találunk egyező értéket, hozzáadjuk a kulcsot az a-hoz Készlet és folytassa a hurkot. Végül visszaadjuk a Készlet tartalmazza az összes kívánt kulcsot:

public set getKeys (Térképtérkép, V érték) {Set keys = new HashSet (); a (Bejegyzés bejegyzés: map.entrySet ()) {if (entry.getValue (). egyenlő (érték)) {keys.add (entry.getKey ()); }} visszatérési kulcsok; }

Bár ez egy nagyon egyszerű végrehajtás, összehasonlítja az összes bejegyzést, még akkor is, ha az összes egyezés megtalálható néhány ismétlés után.

3. Funkcionális megközelítés

A Lambda Expressions Java 8-ban történő bevezetésével rugalmasabban és olvashatóbban tudjuk megtenni. Konvertáljuk a bejegyzéskészletet a-ra Folyam és szállítson egy lambdát, hogy csak az adott értékű bejegyzéseket szűrje.

Ezután a térkép metódussal adjuk vissza a Folyam a kulcsok a szűrt bejegyzésekből:

public Stream kulcsok (Térképtérkép, V érték) {return map .entrySet () .stream () .filter (entry -> value.equals (entry.getValue ())) .map (Map.Entry :: getKey); }

A stream visszaküldésének előnye, hogy a kliensek széles körét képes kielégíteni. A hívó kódhoz csak egy kulcsra lehet szükség, vagy az összes kulcsra, amely a megadott értékre mutat. Mivel egy adatfolyam értékelése lusta, az ügyfél a követelménye alapján szabályozhatja az iteráció számát.

Ezen túlmenően, az ügyfél átalakíthatja a folyamot bármilyen gyűjteményre egy megfelelő gyűjtő használatával:

Stream keyStream1 = kulcsok (capitalCountryMap, "Dél-Afrika"); Karaktersorozat = keyStream1.findFirst (). Get (); Stream keyStream2 = kulcsok (capitalCountryMap, "Dél-Afrika"); Nagybetűk beállítása = keyStream2.collect (Collectors.toSet ());

4. Az Apache Commons gyűjtemények használata

A fenti ötletek nem lennének nagyon hasznosak ha nagyon gyakran meg kell hívnunk a függvényeket egy adott térképhez. Feleslegesen fogja újra és újra megismételni a kulcskészletet.

Ebben a forgatókönyvben egy másik értéktérkép fenntartása a kulcsok számára értelmesebb lenne, mivel állandó időbe telik a kulcs lekérése egy értékhez.

A Commons Gyűjtemények könyvtár által Apache ilyen kétirányúval látja el Térkép hívott BidiMap. Van egy neve getKey () kulcs lekéréséhez egy adott értékhez:

BidiMap capitalCountryMap = új DualHashBidiMap (); capitalCountryMap.put ("Berlin", "Németország"); capitalCountryMap.put ("Fokváros", "Dél-Afrika"); String capitalOfGermany = capitalCountryMap.getKey ("Németország");

Azonban, BidiMap 1: 1 viszonyt ír elő kulcsai és értékei között. Ha megpróbálunk olyan kulcs-érték párost felvenni, amelynek az értéke már létezik a Térkép, eltávolítja a régi bejegyzést. Más szavakkal, frissíti a kulcsot az értékhez képest.

Emellett nagyobb memóriára van szükség a fordított térkép megtartásához.

További részletek a használatáról a BidiMap ebben az oktatóanyagban vannak.

5. A Google Guava használata

Használhatunk másik kétirányú irányt is Térkép hívott BiMap megtalálható Guavában, amelyet a Google fejlesztett ki. Ez az osztály egy megnevezett módszert biztosít inverz () hogy megkapja az értékkulcsot Térkép vagy fordítva Térkép a kulcs beolvasása egy adott érték alapján:

HashBiMap capitalCountryMap = HashBiMap.create (); capitalCountryMap.put ("Berlin", "Németország"); capitalCountryMap.put ("Fokváros", "Dél-Afrika"); String capitalOfGermany = capitalCountryMap.inverse (). Get ("Németország");

Mint BidiMap, BiMap szintén nem engedélyezi az azonos értékre hivatkozó több kulcs használatát. Ha megpróbálunk ilyen kísérletet tenni, akkor a java.lang.IllegalArgumentException .

Szükségtelen mondani, BiMap szintén jelentős mennyiségű memóriát használ, mivel az inverz térképet benne kell tárolnia. Ha érdekel, hogy többet megtudjon BiMap, megnézheti ezt az oktatóanyagot.

6. Következtetés

Ebben a rövid cikkben megvitattunk néhány módszert a Térképek kulcs az értéket megadva. Minden megközelítésnek megvannak a maga előnyei és hátrányai. Mindig mérlegeljük a felhasználási eseteket, és a helyzet alapján válasszuk ki a legmegfelelőbbet.

A fenti oktatóanyag teljes forráskódja elérhető a GitHub oldalon.