Java-kort med store og små bogstaver
1. Oversigt
Kort er en af de mest almindelige datastrukturer i Java, og Snor er en af de mest almindelige typer for et korts nøgle. Som standard, et kort af denne slags har store og små bogstaver.
I denne korte vejledning undersøger vi forskellige Kort implementeringer, der accepter alle sagsvarianter af en Snor som den samme nøgle.
2. Et nærmere kig på Kort med store og små bogstaver
Lad os undersøge det problem, vi prøver at løse mere detaljeret.
Antag, at vi har en Kort med en post:
Lad os tilføje den næste post:
map.put ("ABC", 2);
Når du arbejder med en Kort med store og små bogstaver slutter vi med to poster:
Men når man arbejder med en Kort med store og små bogstaver, der er ufølsomme, er indholdet:
I de næste eksempler dykker vi ned i store og små bogstaver i nogle populære Kort implementeringer: TreeMap, HashMapog LinkedHashMap.
3. TreeMap
TreeMap er en implementering af NavigableMap, hvilket betyder, at det altid sorterer poster efter indsættelse, baseret på en given Komparator. Også, TreeMap bruger en Komparator for at finde ud af, om en indsat nøgle er en duplikat eller en ny.
Derfor, hvis vi giver en sag-ufølsom SnorKomparator, vi får en sag-ufølsom TreeMap.
Heldigvis Snor leverer allerede denne statiske Komparator:
offentlig statisk endelig komparator CASE_INSENSITIVE_ORDER
som vi kan levere i konstruktøren:
Map treeMap = nyt TreeMap (String.CASE_INSENSITIVE_ORDER); treeMap.put ("abc", 1); treeMap.put ("ABC", 2);
Og nu, når vi kører tests, kan vi se, at størrelsen på Kort er en:
assertEquals (1, treeMap.size ());
og værdien opdateres til 2:
assertEquals (2, treeMap.get ("aBc"). intValue ()); assertEquals (2, treeMap.get ("ABc"). intValue ());
Lad os nu fjerne posten ved hjælp af den samme Snor, men med en anden sag:
treeMap.remove ("aBC"); assertEquals (0, treeMap.size ());
Det skal vi huske på fungerer som sætte og få koster en gennemsnitlig tid på O (log n) til TreeMap sammenlignet med en HashMap der giver O (1) indsættelse og opslag.
Det er også værd at bemærke det TreeMap tillader ikke nul nøgler.
4. Apache CaseInsensitiveMap
Apache's Commons-Collections er et meget populært Java-bibliotek, der giver et stort antal nyttige klasser med CaseInsensitiveMap blandt dem.
CaseInsensitiveMap er en hash-baseret Kort, der konverterer nøgler til små bogstaver, før de tilføjes eller hentes. I modsætning til TreeMap, CaseInsensitiveMap tillader nul nøgleindsættelse.
Først skal vi tilføje fælles-samlinger4 afhængighed:
org.apache.commons commons-collection4 4.4
Nu kan vi bruge CaseInsensitiveMap og tilføj to poster:
Map commonsHashMap = new CaseInsensitiveMap (); commonsHashMap.put ("abc", 1); commonsHashMap.put ("ABC", 2);
Når vi tester det, forventer vi de samme resultater, som vi tidligere har set:
assertEquals (1, commonsHashMap.size ()); assertEquals (2, commonsHashMap.get ("aBc"). intValue ()); assertEquals (2, commonsHashMap.get ("ABc"). intValue ()); commonsHashMap.remove ("aBC"); assertEquals (0, commonsHashMap.size ());
5. Forår LinkedCaseInsensitiveMap
Spring Core er et Spring Framework-modul, der også giver hjælpeklasser, herunder LinkedCaseInsensitiveMap.
LinkedCaseInsensitiveMap indpakker en LinkedHashMap, som er en Kort baseret på en hash-tabel og en linket liste. I modsætning til LinkedHashMap, det tillader ikke nul nøgleindsættelse. LinkedCaseInsensitiveMap bevarer den oprindelige rækkefølge såvel som den originale kabinet af nøgler, samtidig med at opkaldsfunktioner som få og fjerne under alle omstændigheder.
Lad os først tilføje fjederkerne afhængighed:
org.springframework spring-core 5.2.5.RELEASE
Nu kan vi initialisere et nyt LinkedCaseInsensitiveMap:
Map linkedHashMap = new LinkedCaseInsensitiveMap (); linkedHashMap.put ("abc", 1); linkedHashMap.put ("ABC", 2);
tilføj test det:
assertEquals (1, linkedHashMap.size ()); assertEquals (2, linkedHashMap.get ("aBc"). intValue ()); assertEquals (2, linkedHashMap.get ("ABc"). intValue ()); linkedHashMap.remove ("aBC"); assertEquals (0, linkedHashMap.size ());
6. Konklusion
I denne vejledning har vi set på forskellige måder at oprette en Java på Kort med store og små bogstaver og brugte forskellige klasser for at opnå dette.
Som altid er koden tilgængelig på GitHub.