Java térkép kis- és nagybetűkkel nem érzékeny kulcsokkal

1. Áttekintés

Térkép a Java egyik leggyakoribb adatstruktúrája, és Húr a térképkulcs egyik leggyakoribb típusa. Alapértelmezés szerint, egy ilyen térkép nagybetű-érzékeny kulcsokkal rendelkezik.

Ebben a rövid bemutatóban különbözőeket fedezünk fel Térkép megvalósítások, amelyek fogadja el az a esetváltozatait Húr mint ugyanaz a kulcs.

2. Közelebbről Térkép kis- és nagybetűkkel nem rendelkező kulcsokkal

Vizsgáljuk meg részletesebben azt a problémát, amelyet megpróbálunk megoldani.

Tegyük fel, hogy van egy Térkép egy bejegyzéssel:

Adjuk hozzá a következő bejegyzést:

map.put ("ABC", 2);

Amikor a Térkép kis- és nagybetű érzékeny kulcsokkal két bejegyzést kapunk:

De amikor a Térkép kis- és nagybetűkkel nem rendelkező kulcsokkal a tartalom a következő lesz:

A következő példákban néhány népszerű változatban nem különböztetjük meg a kis- és nagybetűket Térkép megvalósítások: TreeMap, HashMap, és LinkedHashMap.

3. TreeMap

TreeMap megvalósítása NavigableMap, ami azt jelenti, hogy a beillesztés után mindig rendezi a bejegyzéseket, egy adott alapján Összehasonlító. Is, TreeMap használja a Összehasonlító hogy a beillesztett kulcs duplikátum vagy új-e.

Ebből kifolyólag, ha megkülönböztetjük a kis- és nagybetűket HúrÖsszehasonlító, megkapjuk a kis- és nagybetűk különbségét TreeMap.

Szerencsére, Húr már szállítja ezt a statikát Összehasonlító:

public static final Összehasonlító CASE_INSENSITIVE_ORDER

amelyet a konstruktorban szállíthatunk:

Map treeMap = új TreeMap (String.CASE_INSENSITIVE_ORDER); treeMap.put ("abc", 1); treeMap.put ("ABC", 2);

És most, amikor teszteket futtatunk, láthatjuk, hogy a Térkép az egyik:

assertEquals (1, treeMap.size ());

és az érték 2-re frissül:

assertEquals (2, treeMap.get ("aBc"). intValue ()); assertEquals (2, treeMap.get ("ABc"). intValue ());

Most távolítsuk el a bejegyzést, ugyanazt használva Húr, de egy másik esettel:

treeMap.remove ("aBC"); assertEquals (0, treeMap.size ());

Ezt szem előtt kell tartanunk funkciók, mint tedd és kap átlagosan O időbe kerül (log n) a TreeMap összehasonlítva a HashMap amely biztosítja az O (1) beillesztést és keresést.

Érdemes ezt is megjegyezni TreeMap nem engedi nulla kulcsok.

4. Apache's CaseInsensitiveMap

Az Apache's Commons-Collections egy nagyon népszerű Java könyvtár, amely számos hasznos osztályt kínál CaseInsensitiveMap közöttük.

CaseInsensitiveMap hash-alapú Térkép, amely a kulcsokat kisbetűvé alakítja, mielőtt hozzáadnák vagy lekérnék őket. nem úgy mint TreeMap, CaseInsensitiveMap lehetővé teszi nulla kulcs behelyezése.

Először hozzá kell adnunk a commons-gyűjtemények4 függőség:

 org.apache.commons commons-gyűjtemények 4.4 

Most már használhatjuk CaseInsensitiveMap és adjon hozzá két bejegyzést:

Map commonsHashMap = new CaseInsensitiveMap (); commonsHashMap.put ("abc", 1); commonsHashMap.put ("ABC", 2);

Amikor teszteljük, ugyanazokra az eredményekre számítunk, mint korábban:

assertEquals (1, commonsHashMap.size ()); assertEquals (2, commonsHashMap.get ("aBc"). intValue ()); assertEquals (2, commonsHashMap.get ("ABc"). intValue ()); commonsHashMap.remove ("aBC"); assertEquals (0, commonsHashMap.size ());

5. Tavaszi LinkedCaseInsensitiveMap

A Spring Core egy Spring Framework modul, amely segédprogramokat is tartalmaz, beleértve a következőket: LinkedCaseInsensitiveMap.

LinkedCaseInsensitiveMap pakolások a LinkedHashMap, ami a Térkép hash tábla és összekapcsolt lista alapján. nem úgy mint LinkedHashMap, nem engedi nulla kulcs behelyezése. LinkedCaseInsensitiveMap megőrzi az eredeti sorrendet, valamint a kulcsok eredeti burkolatát, miközben lehetővé teszi a hívási funkciók, például kap és eltávolítani minden esetben.

Először tegyük hozzá a rugómag függőség:

 org.springframework rugós mag 5.2.5.KÖZLEMÉNY 

Most inicializálhatunk egy újat LinkedCaseInsensitiveMap:

Map linkedHashMap = új LinkedCaseInsensitiveMap (); linkedHashMap.put ("abc", 1); linkedHashMap.put ("ABC", 2);

add teszt:

assertEquals (1, linkeltHashMap.size ()); assertEquals (2, linkeltHashMap.get ("aBc"). intValue ()); assertEquals (2, linkeltHashMap.get ("ABc"). intValue ()); linkedHashMap.remove ("aBC"); assertEquals (0, linkeltHashMap.size ());

6. Következtetés

Ebben az oktatóanyagban különböző módszereket vizsgáltunk a Java létrehozására Térkép kis- és nagybetűkkel nem rendelkező kulcsokkal, és ennek megszerzéséhez különböző osztályokat használtak.

Mint mindig, a kód elérhető a GitHubon.