Apache Commons Collections BidiMap

Apache Commons Collections BidiCarte

1. Vue d'ensemble

Dans ce court article, nous allons examiner une structure de données intéressante dans la bibliothèque Apache Commons Collections - lesBidiMap.

LeBidiMap ajoute une possibilité de rechercher la clé en utilisant la valeur correspondante en haut de l'interface standardMap.

2. Les dépendances

Nous devons inclure la dépendance suivante dans notre projet pour que nous puissions utiliserBidiMap et ses implémentations. Pour les projets basés sur Maven, nous devons ajouter la dépendance suivante à nospom.xml:


    org.apache.commons
    commons-collections4
    4.1

Pour les projets basés sur Gradle, nous devons ajouter le même artefact à notre fichierbuild.gradle:

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

La dernière version de cette dépendance peut être trouvéeon Maven Central.

3. Implémentations et instanciation

BidiMap lui-même n'est qu'une interface qui définit des comportements uniques à une carte bidirectionnelle - et il existe bien sûr plusieurs implémentations disponibles.

Il est important de comprendre que les implémentationsof BidiMap do not allow key and value duplicates. Lorsqu'unBidiMap est inversé, toutes les valeurs en double seront converties en clés en double et violeront le contrat de carte. Une carte doit toujours avoir des clés uniques.

Examinons différentes implémentations concrètes de cette interface:

  • DualHashBidiMap: cette implémentation utilise deux instancesHashMap pour implémenter la BidiMap en interne.. Elle permet une recherche rapide des entrées en utilisant soit la clé soit la valeur d'une entrée. Cependant, deux instances deHashMap doivent être maintenues

  • DualLinkedHashBidiMap: Cette implémentation utilise deux instances deLinkedHashMap et conserve par conséquent l'ordre d'insertion des entrées de mappe. Si nous n'avons pas besoin de maintenir l'ordre d'insertion des entrées de la carte, nous pouvons simplement utiliser lesDualHashBidiMap moins chers

  • TreeBidiMap: Cette implémentation est efficace et est réalisée par une implémentation d'arbre Rouge-Noir. Les clés et valeurs deTreeBidiMap sont garanties d'être triées par ordre croissant en utilisant l'ordre naturel des clés et des valeurs

  • Il existe égalementDualTreeBidiMap qui utilise deux instances deTreeMap pour obtenir la même chose queTreeBidiMap. DualTreeBidiMap est évidemment plus cher queTreeBidiMap

L'interfaceBidiMap étend l'interfacejava.util.Map et peut donc lui servir de remplacement. Nous pouvons utiliser le constructeur no-arg des implémentations concrètes pour instancier une instance d'objet concrète.

4. Méthodes uniquesBidiMap

Maintenant que nous avons exploré les différentes implémentations, examinons les méthodes propres à l'interface.

Theput()inserts a new key-value entry into the map. Notez que si la valeur de la nouvelle entrée correspond à la valeur d'une entrée existante, l'entrée existante sera supprimée en faveur de la nouvelle entrée.

La méthode renvoie l'ancienne entrée supprimée ounull s'il n'y en a pas:

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. Cette méthode renvoie un nouveauBidiMap où les clés sont devenues les valeurs et vice-versa. Cette opération peut être très utile dans les applications de traduction et de dictionnaire:

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. Ceci est un ajout aux implémentations deMap trouvées dans le packagejava.util:

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

We can get the key mapped to a particular value in BidiMap with the getKey(). La méthode renvoienull si aucune clé n'est mappée sur la valeur spécifiée:

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

5. Conclusion

Ce rapide tutoriel a fourni un aperçu de la bibliothèque Apache Commons Collections - en particulier surBidiMap, ses implémentations et ses méthodes idiosyncratiques.

La caractéristique la plus intéressante et la plus distinctive deBidiMap est sa capacité à rechercher et à manipuler des entrées via des clés ainsi que des valeurs.

Comme toujours, des extraits de code sont disponiblesover on GitHub.