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.