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);
        }
    }

}
40
demandé sur Zach Sugano 2012-06-12 12:59:30

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);
}
74
répondu aioobe 2015-10-02 11:07:13

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);
}
22
répondu Jon 2012-06-12 09:13:35

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.

10
répondu Brian Agnew 2012-06-12 09:00:37