Collection Java-clé Unique et valeur Unique

J'ai besoin d'une collection qui peut rechercher une valeur basée sur la clé et vice versa. Pour chaque valeur, il y a une clé et pour chaque clé, il est une valeur. Existe-t-il une structure de données prête à l'emploi qui fait cela?

27
demandé sur Lance Roberts 2009-04-03 01:03:11

3 réponses

LeBiMap deGoogle Guava semble vous convenir.

Une bimap (ou" carte bidirectionnelle") est une carte qui préserve l'unicité de ses valeurs ainsi que celle de ses clés. Cette contrainte permet aux bimaps de prendre en charge une "vue inverse", qui est une autre bimap contenant les mêmes entrées que cette bimap mais avec des clés et des valeurs inversées.

Ou BidiMap à partir de Apache Commons Collections:

Définit un carte qui permet une recherche bidirectionnelle entre la clé et les valeurs.

Cette extension Map représente un mappage où une clé peut rechercher une valeur et une valeur peut rechercher une clé avec la même facilité. Cette interface étend Map et peut donc être utilisée partout où une carte est requise. L'interface fournit une vue inverse de la carte, permettant un accès complet aux deux directions de la BidiMap.

32
répondu Michael Myers 2018-01-17 15:59:17

, Vous pouvez utiliser BiMap à partir de Eclipse Collections (anciennement GS Collections).

BiMap est une carte qui permet aux utilisateurs d'effectuer des recherches dans les deux directions. Les clés et les valeurs d'un BiMap sont uniques.

L'implémentation principale est HashBiMap.

inverse()

BiMap.inverse() renvoie une vue dans laquelle la position du type de clé et du type de valeur sont échangées.

MutableBiMap<Integer, String> biMap =
  HashBiMap.newWithKeysValues(1, "1", 2, "2", 3, "3");
MutableBiMap<String, Integer> inverse = biMap.inverse();
Assert.assertEquals("1", biMap.get(1));
Assert.assertEquals(1, inverse.get("1"));
Assert.assertTrue(inverse.containsKey("3"));
Assert.assertEquals(2, inverse.put("2", 4));

put()

MutableBiMap.put() se comporte comme Map.put() sur une carte régulière, sauf qu'elle jette quand une valeur en double est ajoutée.

MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.put(1, "1"); // behaves like a regular put()
biMap.put(1, "1"); // no effect
biMap.put(2, "1"); // throws IllegalArgumentException

forcePut()

Cela se comporte comme MutableBiMap.put(), mais il supprime silencieusement l'entrée de la carte avec la même valeur avant de mettre la paire clé-valeur dans la carte.

MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.forcePut(1, "1"); // behaves like a regular put()
biMap.forcePut(1, "1"); // no effect
biMap.put(1, "2"); // replaces the [1,"1"] pair with [1, "2"]
biMap.forcePut(2, "2"); // removes the [1, "2"] pair before putting
Assert.assertFalse(biMap.containsKey(1));
Assert.assertEquals(HashBiMap.newWithKeysValues(2, "2"), biMap);

Remarque: je suis un committer pour les Collections Eclipse.

7
répondu Craig P. Motlin 2016-10-03 05:05:28

La réponse acceptée mentionne BiMap, mais elle est devenue plus à jour avec les bibliothèques Google Guava.

Un BiMap<K, V> est un Map<K, V> que

  • permet d'afficher le "inverse" BiMap<V, K> avec inverse()
  • garantit que les valeurs sont uniques, faisant de values() un Set

Donc, vous pouvez vous retrouver avec du code comme ceci:

final BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("word", 1);
biMap.put("alpha", 2);
System.out.println(biMap.get("word")); // prints 1
System.out.println(biMap.inverse().get(1)); // prints word

Quelques mises en garde avec cet objet:

1
répondu Makoto 2013-12-21 19:17:58