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