Java-kaart met hoofdletterongevoelige sleutels

1. Overzicht

Kaart is een van de meest voorkomende datastructuren in Java, en Draad is een van de meest voorkomende typen voor de sleutel van een kaart. Standaard, een kaart van deze soort heeft hoofdlettergevoelige sleutels.

In deze korte tutorial zullen we verschillende onderzoeken Kaart implementaties die accepteer alle hoofdlettervariaties van een Draad als dezelfde sleutel.

2. Een nadere blik op Kaart met hoofdletterongevoelige sleutels

Laten we het probleem dat we proberen op te lossen nader bekijken.

Stel dat we een Kaart met één vermelding:

Laten we het volgende item toevoegen:

map.put ("ABC", 2);

Bij het werken met een Kaart met hoofdlettergevoelige sleutels, zullen we eindigen met twee vermeldingen:

Maar bij het werken met een Kaart met niet-hoofdlettergevoelige sleutels, zal de inhoud zijn:

In de volgende voorbeelden zullen we ingaan op hoofdletterongevoelige implementaties van enkele populaire Kaart implementaties: TreeMap, Hash kaart, en LinkedHashMap.

3. TreeMap

TreeMap is een implementatie van NavigableMap, wat betekent dat het de items na het invoegen altijd sorteert op basis van een gegeven Comparator. Ook, TreeMap gebruikt een Comparator om te zien of een ingevoegde sleutel een duplicaat of een nieuwe is.

Daarom als we een niet-hoofdlettergevoelig DraadComparator, we krijgen een hoofdletterongevoelig TreeMap.

Gelukkig, Draad levert deze statische al Comparator:

openbare statische laatste vergelijker CASE_INSENSITIVE_ORDER

die we kunnen leveren in de constructor:

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

En nu, als we tests uitvoeren, kunnen we zien dat de grootte van de Kaart is een:

assertEquals (1, treeMap.size ());

en de waarde wordt bijgewerkt naar 2:

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

Laten we nu het item verwijderen en hetzelfde gebruiken Draad, maar met een ander geval:

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

Daar moeten we rekening mee houden functies zoals leggen en krijgen kost een gemiddelde tijd van O (log n) voor de TreeMap vergeleken met een Hash kaart dat voorziet in O (1) invoeging en opzoeken.

Het is ook vermeldenswaard dat TreeMap staat niet toe nul sleutels.

4. Apache's CaseInsensitiveMap

Apache's Commons-Collections is een zeer populaire Java-bibliotheek, die een groot aantal nuttige klassen biedt CaseInsensitiveMap onder hen.

CaseInsensitiveMap is een hash-gebaseerd Kaart, dat sleutels omzet in kleine letters voordat ze worden toegevoegd of opgehaald. in tegenstelling tot TreeMap, CaseInsensitiveMap staat toe nul sleutel invoegen.

Eerst moeten we de commons-collecties4 afhankelijkheid:

 org.apache.commons commons-collections4 4.4 

Nu kunnen we gebruiken CaseInsensitiveMap en voeg twee items toe:

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

Als we het testen, verwachten we dezelfde resultaten als we eerder zagen:

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

5. Lente LinkedCaseInsensitiveMap

Spring Core is een Spring Framework-module die ook hulpprogramma's biedt, waaronder LinkedCaseInsensitiveMap.

LinkedCaseInsensitiveMap wikkelt een LinkedHashMap, wat een is Kaart gebaseerd op een hashtabel en een gekoppelde lijst. in tegenstelling tot LinkedHashMap, het staat niet toe nul sleutel invoegen. LinkedCaseInsensitiveMap behoudt de oorspronkelijke volgorde en de originele behuizing van de toetsen terwijl het aanroepen van functies zoals krijgen en verwijderen met elk geval.

Laten we eerst het lente-kern afhankelijkheid:

 org.springframework spring-core 5.2.5.RELEASE 

Nu kunnen we een nieuw LinkedCaseInsensitiveMap:

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

test het toevoegen:

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

6. Conclusie

In deze zelfstudie hebben we verschillende manieren bekeken om een ​​Java te maken Kaart met niet hoofdlettergevoelige sleutels en verschillende klassen gebruikt om dit te verkrijgen.

Zoals altijd is de code beschikbaar op GitHub.