Как заменить значения 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);
}
}
}
3 ответов
Использование Java 8:
map.replaceAll((k, v) -> v - 20);
использование Java 7 или старше:
вы можете перебирать ключи и обновлять значения следующим образом:
for (Key k : playerCooldowns.keySet()) {
playerCooldowns.put(k, playerCooldowns.get(k) - 20);
}
или повторите записи следующим образом:
for (Map.Entry<Key, Long> entry : playerCooldowns.entrySet()) {
entry.setValue(entry.getValue() - 20);
}
Ну, вы не можете сделать это, повторяя набор значений в 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);
}
почему бы не повторить над карта.Запись объекты ? Каждый Entry
даст вам ключ и значение, и вам не придется выполнять дополнительные get()
на Map
чтобы получить значение.