Java-kart med store og små bokstaver

1. Oversikt

Kart er en av de vanligste datastrukturene i Java, og String er en av de vanligste typene for et kartnøkkel. Som standard, et kart av denne typen har store og små bokstaver.

I denne korte opplæringen vil vi utforske forskjellige Kart implementeringer som godta alle saksvarianter av a String som den samme nøkkelen.

2. En nærmere titt på Kart med store og små bokstaver

La oss undersøke problemet vi prøver å løse mer detaljert.

Anta at vi har en Kart med en oppføring:

La oss legge til neste oppføring:

map.put ("ABC", 2);

Når du arbeider med en Kart med store og små bokstaver, vil vi ende opp med to oppføringer:

Men når du jobber med en Kart med store og små bokstaver, vil innholdet være:

I de neste eksemplene vil vi dykke ned i store og små bokstaver i noen populære Kart implementeringer: TreeMap, HashMap, og LinkedHashMap.

3. TreeMap

TreeMap er en implementering av NavigableMap, som betyr at den alltid sorterer oppføringene etter innsetting, basert på en gitt Komparator. Også, TreeMap bruker en Komparator for å finne ut om en innsatt nøkkel er et duplikat eller en ny.

Derfor, hvis vi gir en liten bokstavsfølsomhet StringKomparator, får vi en sak ufølsom TreeMap.

Heldigvis, String leverer allerede denne statiske Komparator:

offentlig statisk slutt Comparator CASE_INSENSITIVE_ORDER

som vi kan levere i konstruktøren:

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

Og nå, når vi kjører tester, kan vi se at størrelsen på Kart er en:

assertEquals (1, treeMap.size ());

og verdien oppdateres til 2:

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

La oss nå fjerne oppføringen ved å bruke den samme String, men med en annen sak:

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

Vi bør huske på det funksjoner som sette og koster en gjennomsnittlig tid på O (log n) for TreeMap sammenlignet med en HashMap som gir O (1) innsetting og oppslag.

Det er også verdt å merke seg det TreeMap tillater ikke null nøklene.

4. Apache's CaseInsensitiveMap

Apache's Commons-Collections er et veldig populært Java-bibliotek, og tilbyr et stort antall nyttige klasser med CaseInsensitiveMap blant dem.

CaseInsensitiveMap er en hash-basert Kart, som konverterer nøkler til små bokstaver før de legges til eller hentes ut. I motsetning til TreeMap, CaseInsensitiveMap tillater null tastinnsetting.

Først må vi legge til felles-samlinger4 avhengighet:

 org.apache.commons commons-collection4 4.4 

Nå kan vi bruke CaseInsensitiveMap og legg til to oppføringer:

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

Når vi tester det, forventer vi de samme resultatene som vi så tidligere:

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

5. Vårens LinkedCaseInsensitiveMap

Spring Core er en Spring Framework-modul som også tilbyr verktøysklasser, inkludert LinkedCaseInsensitiveMap.

LinkedCaseInsensitiveMap pakker inn en LinkedHashMap, hvilken er en Kart basert på en hash-tabell og en koblet liste. I motsetning til LinkedHashMap, det tillater ikke null tastinnsetting. LinkedCaseInsensitiveMap bevarer den opprinnelige bestillingen, så vel som den opprinnelige hylsen til tastene, mens du tillater anropsfunksjoner som og fjerne i alle fall.

La oss først legge til vårkjernen avhengighet:

 org.springframework spring-core 5.2.5.RELEASE 

Nå kan vi initialisere en ny LinkedCaseInsensitiveMap:

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

legg til 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. Konklusjon

I denne veiledningen har vi sett på forskjellige måter å lage en Java på Kart med store og små bokstaver og brukte forskjellige klasser for å oppnå dette.

Som alltid er koden tilgjengelig på GitHub.


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