Java-Karte mit Schlüsseln ohne Berücksichtigung der Groß- und Kleinschreibung

1. Übersicht

Map ist eine der häufigsten Datenstrukturen in Java, und String ist einer der häufigsten Typen für den Schlüssel einer Map. Standardmäßig verfügt eine Karte dieser Art über Schlüssel, bei denen zwischen Groß- und Kleinschreibung unterschieden wird.

In diesem kurzen Tutorial werden verschiedene Map- Implementierungen untersucht, die alle Groß- und Kleinschreibung eines Strings als denselben Schlüssel akzeptieren .

2. Ein genauerer Blick auf die Karte mit Schlüsseln ohne Berücksichtigung der Groß- und Kleinschreibung

Lassen Sie uns das Problem, das wir zu lösen versuchen, genauer untersuchen.

Angenommen, wir haben eine Karte mit einem Eintrag:

Fügen wir den nächsten Eintrag hinzu:

map.put("ABC", 2);

Wenn Sie mit einer Karte mit Groß- und Kleinschreibung arbeiten, erhalten Sie zwei Einträge:

Wenn Sie jedoch mit einer Karte arbeiten, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird, lautet der Inhalt wie folgt:

In den nächsten Beispielen werden wir uns mit Implementierungen einiger gängiger Map- Implementierungen befassen , bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird : TreeMap , HashMap und LinkedHashMap .

3. TreeMap

TreeMap ist eine Implementierung von NavigableMap , dh , die Einträge werden nach dem Einfügen immer nach einem bestimmten Komparator sortiert . Außerdem verwendet TreeMap einen Komparator, um festzustellen, ob ein eingefügter Schlüssel ein Duplikat oder ein neuer ist.

Deshalb , wenn wir einen Groß- und Kleinschreibung bieten String Vergleicher , werden wir einen Groß- und Kleinschreibung erhalten TreeMap .

Zum Glück liefert String diesen statischen Komparator bereits :

public static final Comparator  CASE_INSENSITIVE_ORDER

was wir im Konstruktor liefern können:

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

Und jetzt, wenn wir Tests durchführen, können wir sehen, dass die Größe der Karte eins ist:

assertEquals(1, treeMap.size());

und der Wert wird auf 2 aktualisiert:

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

Entfernen wir nun den Eintrag mit demselben String , jedoch mit einem anderen Fall:

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

Wir sollten bedenken, dass Funktionen wie put und get eine durchschnittliche Zeit von O (log n) für die TreeMap kosten, verglichen mit einer HashMap , die das Einfügen und Nachschlagen von O (1) ermöglicht.

Es ist auch erwähnenswert, dass TreeMap nicht erlaubt null Tasten.

4. Apaches CaseInsensitiveMap

Apaches Commons-Collections ist eine sehr beliebte Java-Bibliothek, die eine große Anzahl nützlicher Klassen mit CaseInsensitiveMap bereitstellt .

CaseInsensitiveMap ist eine Hash-basierte Map , die Schlüssel in Kleinbuchstaben konvertiert, bevor sie hinzugefügt oder abgerufen werden. Im Gegensatz zu TreeMap , CaseInsensitiveMap ermöglicht null Taste Einfügen.

Zuerst müssen wir die Abhängigkeit commons-collection4 hinzufügen :

 org.apache.commons commons-collections4 4.4 

Jetzt können wir CaseInsensitiveMap verwenden und zwei Einträge hinzufügen:

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

Wenn wir es testen, erwarten wir die gleichen Ergebnisse wie zuvor:

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

5. Die LinkedCaseInsensitiveMap von Spring

Spring Core ist ein Spring Framework-Modul, das auch Dienstprogrammklassen bereitstellt, einschließlich LinkedCaseInsensitiveMap .

LinkedCaseInsensitiveMap umschließt eine LinkedHashMap , eine Map, die auf einer Hash-Tabelle und einer verknüpften Liste basiert. Im Gegensatz zu LinkedHashMap , ist es nicht zulassen , dass Null - Taste Einfügen. LinkedCaseInsensitiveMap bewahrt die ursprüngliche Reihenfolge sowie die Original - Gehäuse von Tasten und ermöglicht Aufruf von Funktionen wie get und Entfernen mit jedem Fall.

Fügen wir zunächst die Spring-Core- Abhängigkeit hinzu:

 org.springframework spring-core 5.2.5.RELEASE 

Jetzt können wir eine neue LinkedCaseInsensitiveMap initialisieren :

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

hinzufügen test it:

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

6. Fazit

In diesem Tutorial haben wir verschiedene Möglichkeiten zum Erstellen einer Java Map mit Schlüsseln ohne Berücksichtigung der Groß- und Kleinschreibung untersucht und verschiedene Klassen verwendet, um dies zu erhalten.

Wie immer ist der Code auf GitHub verfügbar.