web-dev-qa-db-ja.com

Javaで繰り返し処理しながらHashMap値を置き換える方法

Runnableを使用して、プレーヤーのクールダウンから毎秒20を自動的に減算しますが、値を反復処理するときに値の値を置き換える方法がわかりません。各キーの値を更新するにはどうすればよいですか?

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

}
51
Zach Sugano

Java 8:を使用

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

Java 7以前:を使用

エントリを反復処理し、次のように値を更新できます。

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

さて、あなたはMapの値のセットを反復して実行することはできません(現在実行しているように)。それを行うと、キーへの参照がなく、キーを参照する場合、マップのエントリを更新することはできません。更新したばかりの値に関連付けられたキーを見つける方法がないためです。

マップを使用する場合、このような更新には2つのオプションがあり、各Map.Entry<K,V>内のMap、またはキーSetを反復処理できます。 Mapには、これらの両方を実行するメソッドがあります。個人的には、各Map.Entry<K,V>

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

Map.Entry オブジェクトを反復処理しないのはなぜですか?各Entryはキーと値を提供し、値を取得するためにMapで追加のget()を実行する必要はありません。

10
Brian Agnew