Runnableを使用して、プレーヤーのクールダウンから毎秒20を自動的に減算しますが、値を反復処理するときに値の値を置き換える方法がわかりません。各キーの値を更新するにはどうすればよいですか?
public class CoolDownTimer implements Runnable {
@Override
public void run() {
for (Long l : playerCooldowns.values()) {
l = l - 20;
playerCooldowns.put(Key???, l);
}
}
}
Java 8:を使用
map.replaceAll((k, v) -> v - 20);
Java 7以前:を使用
エントリを反復処理し、次のように値を更新できます。
for (Map.Entry<Key, Long> entry : playerCooldowns.entrySet()) {
entry.setValue(entry.getValue() - 20);
}
さて、あなたは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);
}
Map.Entry オブジェクトを反復処理しないのはなぜですか?各Entry
はキーと値を提供し、値を取得するためにMap
で追加のget()
を実行する必要はありません。