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?
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 étendMap
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 laBidiMap
.
, 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.
La réponse acceptée mentionne BiMap
, mais elle est devenue plus à jour avec les bibliothèques Google Guava.
Un
BiMap<K, V>
est unMap<K, V>
que
- permet d'afficher le "inverse"
BiMap<V, K>
avecinverse()
- garantit que les valeurs sont uniques, faisant de
values()
unSet
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:
- Vous ne pourrez pas ajouter de valeurs non uniques, ou vous obtiendrez un
IllegalArgumentException
. Vous pouvez utiliserforcePut(key, value)
, mais cela remplacera la paire clé-valeur existante .