2010-10-28 12 views
3

Je veux carte des entiers à des chaînes, ils sont un à un, tels que:Quelle collection utiliser en Java?

60 : c 
61 : c# 
62 : d 
63 : d# 
64 : e 
65 : f 
66 : f# 

Mais je dois avoir la possibilité de faire ce qui suit:

  1. Obtenez une valeur d'un key: "c" = getValue (60) [donne une clé 60, renvoie la valeur de la chaîne]
  2. récupère la clé d'une valeur: 65 = getKey ("f") [lui donne une valeur de chaîne "f", renvoie un clé]

Quel modèle de collection est le mieux adapté pour cela? Je demande parce que j'ai regardé plusieurs d'entre eux, aucun ne peut faire la partie < 2>. Ou dois-je écrire du code pour passer par chaque paire pour trouver quelle clé a la valeur "f"?

Editer: Rien dans jdk1.6 le fait?

+0

Est-ce que chaque numéro a une valeur associée? –

+0

numéros de 12 à 107 sont chacun associés à une chaîne – Frank

+1

"Rien dans jdk1.6 fait cela?" Nan. – Thilo

Répondre

0

trouvé cela dans un autre forum (link text)

public class ReversibleMap { 
     private final Map keyToValue = new HashMap(8); 
     private final Map valueToKey = new HashMap(8); 

     public void put(Integer key, String value) { 
      keyToValue.put(key, value); 
      valueToKey.put(value, key); 
     } 

     public String get(Integer key) { 
      return (String) keyToValue.get(key); 
     } 

     public Integer getKey(String value) { 
      return (Integer) valueToKey.get(value); 
     } 
    } 

Cela devrait faire

+0

'HashMap' devrait être un' LinkedHashMap' pour une utilisation bidirectionnelle. –

+0

Simple et au point de répondre à ma question, merci! – Frank

5

ce dont vous avez besoin est un BiMap. google guava bibliothèque fournit cette collection.

6

Si vous ne souhaitez pas inclure de collections de communes ou de goyave, utilisez deux mappes distinctes: vous pouvez créer le mappage inverse par programmation à partir du premier avec une simple boucle foreach. Je suggère de concevoir votre code de façon à ce que tous les accès à ces cartes soient internes à une seule classe (puisqu'il s'agit d'un détail d'implémentation qui devrait être caché au reste du système). En d'autres termes, ne passez ces cartes à aucune méthode. Ensuite, vous pouvez très facilement passer à une collection plus appropriée si vous choisissez plus tard.

1

Salut Je suis voudrais à deux intervenir choses Les cartes standards Java fonctionnent unidirectionnellement: donner une touche obtenir l'objet (s) Je ne suis pas au courant d'une classe jdk1.6 java qui fait il

quelques idées 1) créer une classe qui a deux cartes l'une avec le et l'autre avec, ce n'est pas si difficile à mettre en œuvre ^^

2) si vos données sont comme votre posté ET SI c'est une liste associative prédéfinie pourquoi ne pas essayer et énumération? ou une ArrayList?

Jason

1

Si ce sont des notes de musique avec un ensemble fixe de paires clé-valeur, alors vous pouvez envisager d'utiliser enum avec une carte de recherche inversée. Vous allez toujours vous retrouver avec deux HashMaps mais au moins ils sont réunis dans l'énumération.

enum Note { 
    C("C",60), CSHARP("C#",61), D("D",62), DSHARP("D#",63); //etc.. 
    final int value; 
    final String symbol; 
    static final Map<Integer, Note> lookup = new HashMap<Integer, Note>(); 
    static { 
     for(Note n : Note.values()) { 
      lookup.put(n.value, n); 
     } 
    } 

    Note(String symbol, int value) { 
     this.symbol = symbol; 
     this.value = value; 
    } 

    static Note get(int i) { 
     return lookup.get(i); 
    } 
} 

ensuite pour obtenir les valeurs et les symboles, utilisez ce

System.out.println(Note.get(61)); 
System.out.println(Note.get(61).symbol); 
System.out.println(Note.CSHARP.value); 
System.out.println(Note.CSHARP.symbol); 

qui se traduira par

CSHARP 
C# 
61 
C# 

PS. Les modificateurs sont supprimés par souci de concision. PSS. Ajoutez l'autre carte de recherche pour le symbole.

Questions connexes