2013-06-25 6 views
1

Je travaille avec hashmap datastructure dans java. J'ai des données dans lesquelles chaque entrée (valeur) a un groupe (clé). Maintenant, je stocke ces données dans hashmap comme suitRecherche si la clé et la valeur spécifiées existent

HashMap<Integer, String> map = new HashMap<Integer, String>(); 
map.put(1, "value1"); 
map.put(1, "value2"); 
map.put(2, "value3"); 
map.put(2, "value4"); 
map.put(3, "value5"); 
map.put(3, "value6"); 
map.put(3, "value7"); 

maintenant je veux rechercher si l'entrée (avec clé = 3 et value = « valeur6 ») existe sur la carte ou non. Y a-t-il une méthode spécifique à appeler? ou est-il et autre moyen de le faire?

+2

Vous devez utiliser 'Map >'. –

+1

Vous ne pouvez pas avoir de clés en double dans HashMap –

+0

Si vous voulez stocker plusieurs valeurs par clé, jetez un oeil à MultiMap dans la bibliothèque de goyave. – Lesleh

Répondre

8

Vous ne pouvez pas conserver plusieurs entrées sur la même clé dans une carte. Si votre carte contenait précédemment un mappage pour la clé, l'ancienne valeur est remplacée. Vous avez besoin

Map<Integer,List<String>> map = new HashMap<>(); 
              ^^^^^ 
            (Diamond operator) 

Où vous pourriez enregistrer Liste de chaîne contre la même clé. et vous pouvez obtenir la valeur par map#get seule clé unique

List<String> str = map.get(3); 
0

magasins de carte et que vous avez enregistré 3 comme la clé et valeur6 comme valeur puis de nouveau 3 comme une clé et valeur7 en tant que valeur alors votre carte conains seulement 3 en tant que clé et valeur7 en tant que valeur valeur6 sera remplacée

1

Votre clé contient uniquement la dernière valeur que vous avez pour une clé particulière, car les valeurs sont remplacées pour chaque clé et seule la dernière valeur entrée est stockée sur la clé dans l'objet Entry. Selon votre code de votre carte contient les paires de valeurs clés sous la forme suivante:

{1=value2, 2=value4, 3=value7} 

Ainsi, value6 ne marche pas exister plus longtemps.

1

En termes généraux: map.get(key) récupérera la valeur à cet emplacement de clé, ou null s'il n'existe pas. Deuxièmement, vous êtes en train d'écraser vos valeurs. Les cartes stockent uniquement une valeur par clé. Si vous souhaitez stocker plusieurs valeurs, pensez à utiliser une autre collection comme valeur, à laquelle vous pourrez ajouter des valeurs ultérieurement.

Voici quelques exemples de code:

//Declaration - change List to Set if duplicates are annoying 
Map<Integer, List<String>> map = new HashMap<>(); 

//Usage - if the list is empty at the key, new one up. Append the value afterwards. 
Integer key = Integer.valueOf(1); 
List<String> values = map.get(key); 
if(key == null) { 
    values = new ArrayList<>(); 
} 
values.add("word"); 
map.put(key, values); 

Détermination de l'existence d'une valeur à une clé particulière devient facile aussi:

public boolean inMap(Map<Integer, List<String>> map, Integer key, String value) { 
    final List<String> values = map.get(key); 
    return values != null && values.contains(value); 
} 
2

Vous pouvez utiliser Guava Multimap (API docs)

Il stocke les valeurs multiples contre une clé. Pour votre cas,

Multimap<Integer,String> myMultimap = ArrayListMultimap.create(); 
myMultimap .put(1, "value1"); 
myMultimap .put(1, "value2"); 
myMultimap .put(2, "value3"); 
myMultimap .put(2, "value4"); 
myMultimap .put(3, "value5"); 
myMultimap .put(3, "value6"); 
myMultimap .put(3, "value7"); 

Cela va créer la structure de données pour vous

maintenant je veux rechercher si l'entrée (avec clé = 3 et value = « valeur6 ») existe sur la carte ou ne pas. Y a-t-il une méthode spécifique à appeler? ou est-il et un autre moyen de le faire?

Pour la recherche utilisation multimap#containsEntry(key,value), qui reviennent boolean résultat en fonction du résultat

donc

myMultimap.containsEntry(3,"value6") 

qui retournera true

1

On dirait que vous avez besoin d'un ensemble de paires au lieu de la carte.

L'ensemble est une classe de bibliothèque. Vous pouvez utiliser HashSet par exemple. La paire ne l'est pas. Vous pouvez utiliser http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/tuple/Pair.html

Ainsi,

// init 
    Set<Pair<Integer, String>> set = new HashSet<Pair<Integer, String>>(); 
    set.add(new Pair<Integer, String>(1, "1")); 

    // check 
    if (set.contains(new Pair<Integer, String>())) { 
     ... 
    } 
Questions connexes