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.