web-dev-qa-db-fra.com

Java - Ajout d'une autre valeur de chaîne à la clé HashMap existante sans écraser?

Je me demandais si quelqu'un pourrait nous aider à ajouter une autre valeur String à une clé existante dans une HashMap en Java?

Je comprends que vous pouvez ajouter une paire clé-valeur en utilisant la méthode this.put("String", "String"). Cependant, il écrase la valeur existante, alors que je voudrais plusieurs valeurs stockées et associées, avec la même clé?

Merci de votre aide.

6
jxc

Qu'espérez-vous réaliser ici?

Une Map (la HashMap) est dans votre cas un "mappage" direct d'une clé à une autre valeur.

Par exemple.

"foo" -> 123
"bar" -> 321
"far" -> 12345
"boo" -> 54321

Cela signifie que si vous deviez essayer:

myHashMap.get("foo");

Il renverrait la valeur 123 (bien sûr, le type de la valeur que vous renvoyez peut être celui que vous souhaitiez).

Bien entendu, cela signifie également que toute modification apportée à la valeur de la clé remplace la valeur d'origine que vous lui avez attribuée, tout comme le fait de modifier la valeur d'une variable remplacera la valeur d'origine affectée.

Dire:

myHashMap.put("foo", 42);

L'ancienne valeur de "foo" dans la carte serait remplacée par 42. Donc ça deviendrait:

"foo" -> 42
"bar" -> 321
"far" -> 12345
"boo" -> 54321

Toutefois, si vous avez besoin de plusieurs objets String mappés à partir d'une clé unique, vous pouvez utiliser un autre objet pouvant stocker plusieurs objets, tels qu'un tableau ou une liste (ou même un autre HashMap si vous le souhaitez).

Par exemple, si vous utilisiez ArrayLists, lorsque vous affectez une valeur à HashMap (disons qu'elle s'appelle myHashMap), vous devez d'abord vérifier si la clé a déjà été utilisée, sinon, vous créez une nouvelle ArrayList avec la valeur que vous voulez ajouter, si c'est le cas, ajoutez-la simplement à la liste.

(Supposons que key et value ont les valeurs souhaitées)

ArrayList<String> list;
if(myHashMap.containsKey(key)){
    // if the key has already been used,
    // we'll just grab the array list and add the value to it
    list = myHashMap.get(key);
    list.add(value);
} else {
    // if the key hasn't been used yet,
    // we'll create a new ArrayList<String> object, add the value
    // and put it in the array list with the new key
    list = new ArrayList<String>();
    list.add(value);
    myHashMap.put(key, list);
}
14
SCB

Comme d'autres l'ont souligné, Map par spécification ne peut avoir qu'une seule valeur pour une clé donnée. Vous avez 2 solutions:

  • Utilisez HashMap<String, List<String>> pour stocker les données
  • Utiliser Multimap qui est fourni par une tierce partie Google Collections lib
2
nikis

Voulez-vous une concaténation des deux chaînes?

map.put(key, val);
if (map.containsKey(key)) {
    map.put(key, map.get(key) + newVal);
}

Ou voulez-vous une liste de toutes les valeurs pour cette clé? 

HashMap<String,List<String>> map = new HashMap<String,List<String>>();
String key = "key";
String val = "val";
String newVal = "newVal";
List<String> list = new ArrayList<String>();
list.add(val);
map.put(key, list);
if (map.containsKey(key)) {
    map.get(key).add(newVal);
}
1
EvenLisle

Stocker la valeur en tant que liste sous la carte Donc, si la clé est test et qu'il y a deux valeurs dites val1 et val2, alors la clé sera testée et la valeur sera la liste contenant val1 et val2

Mais si votre intention est d’avoir deux entrées distinctes pour la même clé, ceci n’est pas conçu pour que Map soit conçu. Pensez si vous faites map.get ("clé"), quelle valeur vous attendez

0
M Sach

Comme décrit dans Documentation de l'interface Map Map contient un ensemble de clés et ne peut donc pas contenir plusieurs clés non uniques.

Je vous suggère d'utiliser des listes comme valeurs pour cette carte.

0
Fellrond

Vous pouvez utiliser Map<String, Collection<String>>, mais ajouter et supprimer des valeurs serait fastidieux. Mieux vaut utiliser guava Multimap - un conteneur qui permet de stocker plusieurs valeurs pour chaque clé.

0
Sankozi

Vous ne pouvez pas stocker directement plusieurs valeurs sous une même clé, mais la valeur associée à une clé peut être tout type d'objet, tel qu'un ArrayList, qui contiendra plusieurs valeurs. Par exemple:

import Java.util.ArrayList;
import Java.util.HashMap;

public class HashMapList {
    HashMap<String, ArrayList<String>> strings = new HashMap<String, ArrayList<String>>();

    public void add(String key, String value) {
        ArrayList<String> values = strings.get(key);
        if (values == null) {
            values = new ArrayList<String>();
            strings.put(key, values);
        }

        values.add(value);
    }

    public ArrayList<String> get(String key) {
        return strings.get(key);
    }

    public static void main(String[] argv) {
        HashMapList mymap = new HashMapList();

        mymap.add("key", "value1");
        mymap.add("key", "value2");

        ArrayList<String> values = mymap.get("key");
        for (String value : values) {
            System.out.println(value);
        }
    }
}
0
Marc Fraioli