55 votes

Comment créer une carte à double sens en Java ?

J'ai besoin d'une structure de données pour stocker des paires de valeurs string-int dans une relation 1:1, et être capable de rechercher dans les deux sens leur contrepartie.

J'ai écrit une classe avec un tableau Hash et un tableau String et j'ai stocké les données 2 fois et utilisé les fonctions intégrées pour la recherche.

Ma question est la suivante : existe-t-il un moyen plus agréable d'accomplir cette tâche ? Et par plus agréable, je veux dire efficace et ne pas stocker les données deux fois, et de préférence sans écrire une tonne de code non plus :P.

52voto

coobird Points 70356

Il semble que vous soyez à la recherche d'un bimap.

Les Collections Google (qui font maintenant partie de Goyave ) contient un BiMap avec quelques implémentations.

De la BiMap documentation :

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

Le site BiMap.inverse semble retourner un Map avec les valeurs comme clés, et les clés comme valeurs, de sorte que Map peut être utilisé pour appeler get sur la valeur et récupère une clé.

En outre, le Map retourné par inverse est une vue des données sous-jacentes, il n'est donc pas nécessaire de faire des copies supplémentaires des données originales.

De la BiMap.inverse la documentation de la méthode :

Renvoie la vue inverse de cette bimap, qui fait correspondre chacune de ses valeurs à la clé qui lui est associée. Les deux bimaps sont soutenues par les mêmes données ; tout changement apporté à l'un apparaîtra dans l'autre l'autre.

30voto

Gopi Points 5317

Vous pouvez effectuer une mise en œuvre simple comme ceci. Veuillez noter que les données ne sont pas copiées dans cette mise en œuvre. Seules les références le sont ! J'ai ajouté l'implémentation pour add et get. remove et les autres méthodes requises sont laissées comme exercice :)

public class TwoWayHashmap<K extends Object, V extends Object> {

  private Map<K,V> forward = new Hashtable<K, V>();
  private Map<V,K> backward = new Hashtable<V, K>();

  public synchronized void add(K key, V value) {
    forward.put(key, value);
    backward.put(value, key);
  }

  public synchronized V getForward(K key) {
    return forward.get(key);
  }

  public synchronized K getBackward(V key) {
    return backward.get(key);
  }
}

Et bien sûr, il incombe aux applications de s'assurer que même les "valeurs" sont uniques. Exemple d'utilisation :

TwoWayHashmap twmap = new TwoWayHashmap<String, String>();
twmap.add("aaa", "bbb");
twmap.add("xxx", "yyy");
System.out.println(twmap.getForward("xxx"));
System.out.println(twmap.getBackward("bbb"));

11voto

Alex B Points 12826

Apache Commons comprend également le BidiMap (Carte bi-directionnelle).

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

Cette carte étendue 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 nécessaire. L'interface fournit une vue inverse de la carte, permettant un accès complet aux deux directions de la BidiMap.

5voto

jqno Points 7831

Le site Cadre des collections Google a un BiMap qui fait ce que vous voulez.

4voto

SohailAziz Points 1873

Utilisation de Goyave ,

    HashBiMap<String, String> map = HashBiMap.create();

    map.put("name", "Sohail");
    map.put("country", "Pakistan");

    Log.d("tag", "name is " + map.get("name"));

    BiMap<String, String>invmap= map.inverse();

    Log.d("tag", "Pakistan is a " + invmap.get("Pakistan"));

lire le tutoriel complet ici.

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