Как заменить значения 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);
}
}
}
Ответы
Ответ 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
, чтобы получить значение.