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.
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);
}
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:
HashMap<String, List<String>>
pour stocker les donnéesVoulez-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);
}
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
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.
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é.
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);
}
}
}