Mapa Java s klávesmi bez rozlišovania malých a veľkých písmen

1. Prehľad

Mapa je jednou z najbežnejších dátových štruktúr v Jave a String je jedným z najbežnejších typov kľúčov na mape. Predvolene, mapa tohto druhu má klávesy citlivé na veľké a malé písmená.

V tomto krátkom návode preskúmame rôzne možnosti Mapa implementácie, ktoré akceptovať všetky variácie prípadu a String ako ten istý kľúč.

2. Bližší pohľad na Mapa s klávesmi bez rozlišovania malých a veľkých písmen

Pozrime sa podrobnejšie na problém, ktorý sa snažíme vyriešiť.

Predpokladajme, že máme Mapa s jedným vstupom:

Pridajme ďalší záznam:

map.put ("ABC", 2);

Pri práci s a Mapa ak rozlišujeme veľké a malé písmená, skončíme s dvoma záznamami:

Ale pri práci s a Mapa s kľúčmi nerozlišujúcimi veľké a malé písmená bude obsah:

V ďalších príkladoch sa ponoríme do implementácie niektorých populárnych aplikácií bez rozlišovania malých a veľkých písmen Mapa implementácie: TreeMap, HashMapa LinkedHashMap.

3. TreeMap

TreeMap je implementácia NavigableMap, čo znamená, že po vložení vždy triedi záznamy na základe daného Komparátor. Tiež TreeMap používa a Komparátor aby ste zistili, či je vložený kľúč duplikátom alebo novým.

Preto ak poskytujeme malé a veľké písmená StringKomparátor, dostaneme malé a veľké písmená TreeMap.

Našťastie String už dodáva túto statickú reklamu Komparátor:

verejný statický konečný komparátor CASE_INSENSITIVE_ORDER

ktoré môžeme dodať v konštruktore:

Mapa treeMap = nová TreeMap (String.CASE_INSENSITIVE_ORDER); treeMap.put ("abc", 1); treeMap.put ("ABC", 2);

A teraz, keď spúšťame testy, vidíme, že veľkosť súboru Mapa je jeden:

assertEquals (1, treeMap.size ());

a hodnota sa aktualizuje na 2:

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

Teraz pomocou rovnakého odstránime záznam String, ale s iným prípadom:

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

Mali by sme na to pamätať funkcie ako dať a dostať stojí priemerný čas O (log n) pre TreeMap v porovnaní s a HashMap ktorá poskytuje vkladanie a vyhľadávanie O (1).

Za zmienku tiež stojí TreeMap neumožňuje nulový kľúče.

4. Apache CaseInsensitiveMap

Apache's Commons-Collections je veľmi populárna knižnica Java, ktorá poskytuje veľké množstvo užitočných tried CaseInsensitiveMap medzi nimi.

CaseInsensitiveMap je založený na hashe Mapa, ktorá prevádza kľúče na malé písmená pred ich pridaním alebo načítaním. Na rozdiel od TreeMap, CaseInsensitiveMap umožňuje nulový vkladanie kľúčov.

Najprv musíme pridať spoločné zbierky4 závislosť:

 org.apache.commons commons-collections4 4.4 

Teraz môžeme použiť CaseInsensitiveMap a pridajte dve položky:

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

Keď ho otestujeme, očakávame rovnaké výsledky, aké sme videli predtým:

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

5. Jarné LinkedCaseInsensitiveMap

Spring Core je modul Spring Framework, ktorý poskytuje aj triedy nástrojov, vrátane LinkedCaseInsensitiveMap.

LinkedCaseInsensitiveMap zavinuje a LinkedHashMap, čo je a Mapa na základe hashovacej tabuľky a prepojeného zoznamu. Na rozdiel od LinkedHashMap, to neumožňuje nulový vkladanie kľúčov. LinkedCaseInsensitiveMap zachováva pôvodné poradie aj pôvodné veľké písmená klávesov a umožňuje volanie funkcií ako dostať a odstrániť v každom prípade.

Najskôr pridajme pružinové jadro závislosť:

 org.springframework spring-core 5.2.5.RELEASE 

Teraz môžeme inicializovať nový LinkedCaseInsensitiveMap:

Mapa linkedHashMap = nová LinkedCaseInsensitiveMap (); linkedHashMap.put ("abc", 1); linkedHashMap.put ("ABC", 2);

pridať otestovať:

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

6. Záver

V tomto tutoriáli sme sa pozreli na rôzne spôsoby, ako vytvoriť Java Mapa s klávesmi nerozlišujúcimi veľké a malé písmená a na ich získanie použili rôzne triedy.

Ako vždy, kód je k dispozícii na GitHub.