Comment remplacer les valeurs HashMap tout en les itérant en Java
J'utilise un Runnable pour soustraire automatiquement 20 d'un temps de recharge des joueurs chaque seconde, mais je n'ai aucune idée de comment remplacer la valeur d'une valeur au fur et à mesure que je l'itère. Comment puis-je mettre à jour la valeur de chaque touche?
public class CoolDownTimer implements Runnable {
@Override
public void run() {
for (Long l : playerCooldowns.values()) {
l = l - 20;
playerCooldowns.put(Key???, l);
}
}
}
3 réponses
Utilisation De Java 8:
map.replaceAll((k, v) -> v - 20);
Utilisation de Java 7 ou plus:
Vous pouvez parcourir les clés et mettre à jour les valeurs comme suit:
for (Key k : playerCooldowns.keySet()) {
playerCooldowns.put(k, playerCooldowns.get(k) - 20);
}
Ou, itérer sur les entrées comme suit:
for (Map.Entry<Key, Long> entry : playerCooldowns.entrySet()) {
entry.setValue(entry.getValue() - 20);
}
Eh bien, vous ne pouvez pas le faire en itérant sur l'ensemble des valeurs dans le Map
(comme vous le faites maintenant), car si vous faites cela, vous n'avez aucune référence aux clés, et si vous n'avez aucune référence aux clés, vous ne pouvez pas mettre à jour les entrées de la carte, car vous n'avez aucun moyen de savoir quelle clé a été associée à la valeur que vous venez de mettre à jour.
Lorsque vous travaillez avec des cartes, vous avez deux options pour les mises à jour comme celle-ci, parcourez chaque Map.Entry<K,V>
dans le Map
, ou vous pouvez parcourir la clé Set
. Il existe des méthodes sur Map
pour faire ces deux choses. Personnellement, je voudrais parcourir chaque Map.Entry<K,V>
.
for (Map.Entry<String, Long> entry : playerCooldowns.entrySet()) {
entry.setValue(entry.getValue() - 20);
}
Pourquoi ne pas parcourir la carte .Entrée objets ? Chaque Entry
vous donnera la clé et la valeur et vous n'avez pas besoin d'effectuer un get()
supplémentaire sur le Map
pour obtenir une valeur.