web-dev-qa-db-fra.com

Carte bidirectionnelle en Java?

J'ai un mappage simple entier à chaîne en Java, mais je dois pouvoir extraire facilement chaîne de nombre entier, ainsi que nombre entier de chaîne. J'ai essayé Map, mais il ne peut récupérer que la chaîne d'un entier, c'est un moyen:

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 at-il une bonne façon de le faire pour avoir les deux directions?

Un autre problème est que je n’ai que quelques valeurs constantes qui ne changent pas (1->"low", 2->"mid", 3->"high", il ne vaudrait donc pas la peine de chercher une solution compliquée.

74
Danijel

Pour cela, vous pouvez utiliser l'API Google Collections, récemment renommée Guava , en particulier un BiMap

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.

73
epoch

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

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"));
  }
}
32
Michal Z m u d a

Il n'y a pas de carte bidirectionnelle dans l'API standard Java. Vous pouvez gérer vous-même deux cartes ou utiliser le BidiMap d'Apache Collections.

21
Mathias Schwarz

Les collections Apache commons ont un BidiMap

10
hage

Vous pouvez insérer à la fois la paire clé, valeur et son inverse dans la structure de votre carte, mais vous devrez convertir l'entier en chaîne:

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

Utiliser map.get ("theValue") retournera alors "theKey".

C'est une façon rapide et sale de créer des cartes constantes, qui ne fonctionneront que pour quelques jeux de données:

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

Si vous voulez garder <Integer, String> vous pourriez en garder une seconde <String, Integer> mapper pour "mettre" la valeur -> paires de clés.

10
Chicowitz

Utilisez Google BiMap

Il est plus commode.

4
BOSS