Подтвердить что ты не робот

Как заменить значения HashMap во время итерации по ним в Java

Я использую Runnable для автоматического вычитания 20 из кулдауна игроков каждую секунду, но я не знаю, как заменить значение значения, когда я перебираю его. Как я могу обновить значение каждого ключа?

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

}
4b9b3361

Ответ 1

Используя Java 8:

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

Используя Java 7 или старше:

Вы можете перебирать записи и обновлять значения следующим образом:

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

Ответ 2

Ну, вы не можете сделать это, перебирая набор значений в Map (как вы это делаете сейчас), потому что если вы это сделаете, то у вас нет ссылки на ключи, и если у вас нет ссылку на клавиши, то вы не можете обновлять записи на карте, потому что у вас нет способа узнать, какой ключ был связан с только что обновленным значением.

При работе с Картами у вас есть два варианта таких обновлений: итерация через Map.Entry<K,V> в Map, или вы можете перебирать ключ Set. Существуют методы Map для выполнения обеих этих задач. Лично я пробовал бы каждый Map.Entry<K,V>.

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

Ответ 3

Почему бы не перебрать объекты Map.Entry? Каждый Entry предоставит вам ключ и значение, и вам не нужно выполнять дополнительные get() на Map, чтобы получить значение.