Java karta s tipkama neosjetljivim na velika i mala slova

1. Pregled

Karta je jedna od najčešćih struktura podataka u Javi i Niz jedan je od najčešćih tipova ključa karte. Prema zadanim postavkama, karta ove vrste ima tipke koje razlikuju velika i mala slova.

U ovom kratkom vodiču istražit ćemo drugačije Karta provedbe koje prihvatiti sve varijacije slova a Niz kao isti ključ.

2. Pomniji pogled Karta s tipkama neosjetljivim na velika i mala slova

Ispitajmo problem koji pokušavamo riješiti detaljnije.

Pretpostavimo da imamo a Karta s jednim unosom:

Dodajmo sljedeći unos:

map.put ("ABC", 2);

Pri radu s a Karta s tipkama koje razlikuju velika i mala slova, na kraju ćemo dobiti dva unosa:

Ali kada radite s a Karta s ključevima koji ne razlikuju mala i velika slova, sadržaj će biti:

U sljedećim primjerima zaronit ćemo u implementacije nekih popularnih bez velikih i malih slova Karta implementacije: TreeMap, HashMap, i LinkedHashMap.

3. TreeMap

TreeMap je provedba NavigableMap, što znači da uvijek sortira unose nakon umetanja, na temelju zadanog Usporednik. Također, TreeMap koristi a Usporednik da biste pronašli je li umetnuti ključ duplikat ili novi.

Stoga, ako pružimo velika i mala slova NizUsporednik, dobit ćemo velika i mala slova TreeMap.

Srećom, Niz već isporučuje ovu statiku Usporednik:

javni statički konačni komparator CASE_INSENSITIVE_ORDER

koje možemo isporučiti u konstruktoru:

Karta treeMap = nova TreeMap (String.CASE_INSENSITIVE_ORDER); treeMap.put ("abc", 1); treeMap.put ("ABC", 2);

A sada, kada pokrenemo testove, možemo vidjeti da je veličina Karta je jedan:

assertEquals (1, treeMap.size ());

a vrijednost se ažurira na 2:

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

Sada uklonimo unos, koristeći isti Niz, ali s drugim slučajem:

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

To bismo trebali imati na umu funkcije poput staviti i dobiti koštaju prosječno vrijeme O (log n) za TreeMap u usporedbi s a HashMap koji omogućuje umetanje i traženje O (1).

Također je vrijedno napomenuti da TreeMap ne dopušta null tipke.

4. Apačevi CaseInsensitiveMap

Apache's Commons-Collections vrlo je popularna Java knjižnica koja nudi velik broj korisnih klasa s CaseInsensitiveMap među njima.

CaseInsensitiveMap temelji se na hashu Karta, koji pretvara tipke u mala slova prije nego što se dodaju ili preuzmu. Za razliku od TreeMap, CaseInsensitiveMap dopušta null umetanje ključa.

Prvo, moramo dodati zajedničke zbirke4 ovisnost:

 org.apache.commons commons-collection4 4.4 

Sada možemo koristiti CaseInsensitiveMap i dodajte dva unosa:

Karta commonsHashMap = nova CaseInsensitiveMap (); commonsHashMap.put ("abc", 1); commonsHashMap.put ("ABC", 2);

Kada ga testiramo, očekujemo iste rezultate kao i ranije:

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

5. Proljetni LinkedCaseInsensitiveMap

Spring Core je Spring Framework modul koji također nudi klase korisnih programa, uključujući LinkedCaseInsensitiveMap.

LinkedCaseInsensitiveMap oblozi a LinkedHashMap, što je a Karta na temelju hash tablice i povezanog popisa. Za razliku od LinkedHashMap, ne dopušta null umetanje ključa. LinkedCaseInsensitiveMap čuva izvorni redoslijed kao i izvorno kućište tipki, dok omogućava pozivanje funkcija poput dobiti i ukloniti s bilo kojim slučajem.

Prvo, dodajmo opružna jezgra ovisnost:

 org.springframework opruga-jezgra 5.2.5.Opusti 

Sada možemo inicijalizirati novi LinkedCaseInsensitiveMap:

Karta linkedHashMap = nova LinkedCaseInsensitiveMap (); linkedHashMap.put ("abc", 1); linkedHashMap.put ("ABC", 2);

dodajte test:

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

6. Zaključak

U ovom uputstvu pogledali smo različite načine stvaranja Jave Karta s ključevima koji ne razlikuju mala i velika slova i za to su koristili različite klase.

Kao i uvijek, kôd je dostupan na GitHub-u.


$config[zx-auto] not found$config[zx-overlay] not found