Apache Commons Collections BidiMap

Apache Commons Collections BidiMap

1. Überblick

In diesem kurzen Artikel sehen wir uns eine interessante Datenstruktur in der Apache Commons Collections-Bibliothek an - dieBidiMap.

DasBidiMap bietet die Möglichkeit, den Schlüssel mithilfe des entsprechenden Werts über der Standardschnittstelle vonMap nachzuschlagen.

2. Abhängigkeiten

Wir müssen die folgende Abhängigkeit in unser Projekt aufnehmen, damit wirBidiMap und seine Implementierungen verwenden können. Für Maven-basierte Projekte müssen wir unserenpom.xml die folgende Abhängigkeit hinzufügen:


    org.apache.commons
    commons-collections4
    4.1

Bei Gradle-basierten Projekten müssen wir unsererbuild.gradle-Datei dasselbe Artefakt hinzufügen:

compile 'org.apache.commons:commons-collections4:4.1'

Die neueste Version dieser Abhängigkeit befindet sich inon Maven Central.

3. Implementierungen und Instanziierung

BidiMap selbst ist nur eine Schnittstelle, die Verhaltensweisen definiert, die für eine bidirektionale Karte einzigartig sind - und es stehen natürlich mehrere Implementierungen zur Verfügung.

Es ist wichtig zu verstehen, dass Implementierungenof BidiMap do not allow key and value duplicates. Wenn einBidiMap invertiert wird, werden doppelte Werte in doppelte Schlüssel konvertiert und verstoßen gegen den Kartenvertrag. Eine Karte muss immer eindeutige Schlüssel haben.

Schauen wir uns verschiedene konkrete Implementierungen dieser Schnittstelle an:

  • DualHashBidiMap: Diese Implementierung verwendet zweiHashMap-Instanzen, um die BidiMap intern zu implementieren.. Sie bietet eine schnelle Suche nach Einträgen entweder mit dem Schlüssel oder dem Wert eines Eintrags. Es müssen jedoch zwei Instanzen vonHashMap beibehalten werden

  • DualLinkedHashBidiMap: Diese Implementierung verwendet zweiLinkedHashMap-Instanzen und behält folglich die Einfügereihenfolge von Karteneinträgen bei. Wenn die Einfügereihenfolge der Karteneinträge nicht beibehalten werden muss, können wir nur die günstigerenDualHashBidiMapverwenden

  • TreeBidiMap: Diese Implementierung ist effizient und wird durch eine Rot-Schwarz-Baum-Implementierung realisiert. Die Schlüssel und Werte vonTreeBidiMap werden garantiert in aufsteigender Reihenfolge sortiert, wobei die natürliche Reihenfolge der Schlüssel und Werte verwendet wird

  • Es gibt auchDualTreeBidiMap, die zwei Instanzen vonTreeMap verwenden, um dasselbe wieTreeBidiMap zu erreichen. DualTreeBidiMap ist offensichtlich teurer alsTreeBidiMap

DieBidiMap-Schnittstelle erweitert diejava.util.Map-Schnittstelle und kann daher als Ersatz für diese dienen. Wir können den Konstruktor no-arg der konkreten Implementierungen verwenden, um eine konkrete Objektinstanz. zu instanziieren

4. EindeutigeBidiMap Methoden

Nachdem wir uns nun mit den verschiedenen Implementierungen befasst haben, schauen wir uns Methoden an, die nur für die Benutzeroberfläche gelten.

Theput()inserts a new key-value entry into the map. Beachten Sie, dass der vorhandene Eintrag zugunsten des neuen Eintrags entfernt wird, wenn der Wert des neuen Eintrags mit dem Wert eines vorhandenen Eintrags übereinstimmt.

Die Methode gibt den entfernten alten Eintrag odernull zurück, wenn keiner vorhanden ist:

BidiMap map = new DualHashBidiMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
assertEquals(map.size(), 2);

The inverseBidiMap() reverses the key-value pair of aBidiMap. Diese Methode gibt ein neuesBidiMap zurück, bei dem die Schlüssel zu Werten geworden sind und umgekehrt. Diese Operation kann in Übersetzungs- und Wörterbuchanwendungen sehr nützlich sein:

BidiMap rMap = map.inverseBidiMap();
assertTrue(rMap.containsKey("value1") && rMap.containsKey("value2"));

The removeValue() is used to remove a map entry by specifying a value, instead of a key. Dies ist eine Ergänzung zu den Implementierungen vonMapim Paketjava.util:

map.removeValue("value2");
assertFalse(map.containsKey("key2"));

We can get the key mapped to a particular value in BidiMap with the getKey(). Die Methode gibtnull zurück, wenn dem angegebenen Wert kein Schlüssel zugeordnet ist:

assertEquals(map.getKey("value1"), "key1");

5. Fazit

Dieses kurze Tutorial bot einen Einblick in die Apache Commons Collections-Bibliothek - insbesondere beiBidiMap, ihren Implementierungen und eigenwilligen Methoden.

Das aufregendste und unterscheidendste Merkmal vonBidiMap ist die Fähigkeit, Einträge sowohl über Schlüssel als auch über Werte nachzuschlagen und zu bearbeiten.

Wie immer sind Codefragmenteover on GitHub verfügbar.