web-dev-qa-db-fra.com

Comment remplacer les valeurs HashMap tout en les itérant dans Java

J'utilise un Runnable pour soustraire automatiquement 20 du temps de recharge d'un joueur à chaque seconde, mais je ne sais pas comment remplacer la valeur d'une valeur pendant que je l'itère. Comment puis-je lui faire mettre à jour la valeur de chaque clé?

public class CoolDownTimer implements Runnable {
    @Override
    public void run() {
        for (Long l : playerCooldowns.values()) {
            l = l - 20;
            playerCooldowns.put(Key???, l);
        }
    }

}
51
Zach Sugano

Utilisation de Java 8:

map.replaceAll((k, v) -> v - 20);

Utilisation de Java 7 ou plus ancien:

Vous pouvez parcourir les entrées et mettre à jour les valeurs comme suit:

for (Map.Entry<Key, Long> entry : playerCooldowns.entrySet()) {
    entry.setValue(entry.getValue() - 20);
}
90
aioobe

Eh bien, vous ne pouvez pas le faire en itérant sur l'ensemble des valeurs dans 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 pas 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 Maps, 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 effectuer ces deux opérations. Personnellement, je voudrais parcourir chaque Map.Entry<K,V>.

for (Map.Entry<String, Long> entry : playerCooldowns.entrySet()) {
    entry.setValue(entry.getValue() - 20);
}
25
Jon

Pourquoi ne pas parcourir les objets Map.Entry ? Chaque Entry vous donnera la clé et la valeur et vous n'avez pas besoin d'effectuer une get() supplémentaire sur le Map pour obtenir une valeur.

10
Brian Agnew