120 votes

Carte bidirectionnelle en Java ?

J'ai un mappage simple d'entier à chaîne en Java, mais j'ai besoin de pouvoir facilement récupérer une chaîne à partir d'un entier, et aussi un entier à partir d'une chaîne. J'ai essayé Map, mais il ne peut récupérer qu'une chaîne de caractères à partir d'un entier, c'est à sens unique :

private static final Map<Integer, String> myMap = new HashMap<Integer, String>();
// This works one way:
String myString = myMap.get(myInteger);

// I would need something like:
Integer myInteger = myMap.getKey(myString);

Y a-t-il une bonne façon de procéder pour avoir les deux sens ?

Un autre problème est que je n'ai que quelques valeurs constantes qui ne changent pas ( 1->"low", 2->"mid", 3->"high" Il n'y a donc pas lieu de chercher une solution compliquée.

99voto

epoch Points 6650

Vous pouvez utiliser l'API Google Collections pour cela, récemment renommé en Goyave et plus particulièrement un BiMap

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

56voto

Michal Zmuda Points 716

Créer un BiMap Guava et obtenir sa valeur inversée n'est pas si trivial.

Un exemple simple :

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

public class BiMapTest {

  public static void main(String[] args) {

    BiMap<String, String> biMap = HashBiMap.create();

    biMap.put("k1", "v1");
    biMap.put("k2", "v2");

    System.out.println("k1 = " + biMap.get("k1"));
    System.out.println("v2 = " + biMap.inverse().get("v2"));
  }
}

31voto

Mathias Schwarz Points 4741

Il n'existe pas de carte bidirectionnelle dans l'API standard Java. Vous pouvez soit maintenir deux maps vous-même, soit utiliser la fonction BidiMap de Apache Collections.

17voto

bababooey Points 338

Vous pourriez insérer à la fois la paire clé-valeur et son inverse dans votre structure de carte, mais vous devriez convertir l'Integer en chaîne de caractères :

map.put("theKey", "theValue");
map.put("theValue", "theKey");

L'utilisation de map.get("theValue") renverra alors "theKey".

J'ai créé des cartes constantes d'une manière rapide et sale, qui ne fonctionnera que pour quelques ensembles de données :

  • Contient uniquement des paires 1 à 1
  • L'ensemble des valeurs est disjoint de l'ensemble des clés (1->2, 2->3 le rompt)

Si vous voulez garder <Integer, String> vous pourriez maintenir un second <String, Integer> map pour "mettre" les paires valeur -> clé.

11voto

hage Points 2626

Apache commons collections dispose d'un BidiMap

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X