793 votes

Comment mettre à jour une valeur, donné une clé dans un hashmap java ?

Supposons que nous avons un HashMap<String, Integer> en Java.

Comment puis-je mettre à jour (incrément) l'entier de la valeur de la chaîne de clé pour chaque existence de la chaîne-je trouver?

On pourrait le supprimer et entrez à nouveau le couple, mais les frais généraux.
Une autre solution serait de mettre juste la nouvelle paire et le vieux serait remplacé.

Dans ce dernier cas, qu'advient-il si il y a un hashcode collision avec une nouvelle clé, je suis en train de les insérer? Le comportement correct pour une table de hachage consisterait à attribuer à un endroit différent pour lui, ou faire une liste de au cours de ce seau.

1218voto

Matthew Flaschen Points 131723
<pre><code></code><p>devrait être bon. Il mettra à jour la valeur de mappage existant. Notez que cet exemple utilise auto-boxing.</p></pre>

149voto

damluar Points 2141

Java 8:

Vous pouvez utiliser computeIfPresent méthode et de fournir une cartographie de la fonction qui sera appelée pour calculer une nouvelle valeur sur la base de l'existant.

Par exemple,

Map<String, Integer> words = new HashMap<>();
words.put("hello", 3);
words.put("world", 4);
words.computeIfPresent("hello", (k, v) -> v + 1);
System.out.println(words.get("hello"));

Aussi, vous pouvez utiliser merge méthode, où 1 est la valeur par défaut et la fonction incrémente la valeur existante par 1:

words.merge("hello", 1, Integer::sum);

En outre, il ya un tas d'autres méthodes, telles que l' putIfAbsent, getOrDefault, forEach, etc.

53voto

oracleruiz Points 414

HashMap.put (key, hashmap.get(key) + 1) ;

La méthode mettre volonté remplacer la valeur d’une clé et crée s’il n’existe pas.

30voto

BalusC Points 498232

Remplacez par [ ](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html) et appelez l’une de le `` méthodes là-dessus.

Une alternative consiste à encapsuler un dans votre propre classe qui a une `` méthode, vous n’avez qu’un souci de sécurité pour résoudre encore.

19voto

Peter Lawrey Points 229686

@Matthieu solution est la plus simple et d'effectuer assez bien dans la plupart des cas.

Si vous avez besoin de haute performance, AtomicInteger est une meilleure solution ala @BalusC.

Toutefois, une solution plus rapide (à condition que la sécurité des threads n'est pas un problème) est d'utiliser TObjectIntHashMap qui fournit un incrément(clé) de la méthode et utilise les primitives et moins d'objets que de créer AtomicIntegers. par exemple

TObjectIntHashMap<String> map = new TObjectIntHashMap<String>()
map.increment("aaa");

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