¿Cómo actualizar un valor, dada una clave en un mapa hash?
Supongamos que tenemos un HashMap<String, Integer>
en Java.
¿Cómo actualizo (incremento) el valor entero de la clave de cadena para cada existencia de la cadena que encuentro?
Se podría quitar y volver a ingresar el par, pero los gastos generales serían una preocupación.
Otra forma sería simplemente colocar el par nuevo y reemplazar el anterior.
En el último caso, ¿qué sucede si hay una colisión de código hash con una nueva clave que estoy intentando insertar? El comportamiento correcto para una tabla hash sería asignarle un lugar diferente o hacer una lista a partir de ella en el depósito actual.
map.put(key, map.get(key) + 1);
debería estar bien. Actualizará el valor de la asignación existente. Tenga en cuenta que esto utiliza el boxeo automático. Con la ayuda de map.get(key)
obtenemos el valor de la clave correspondiente, luego puede actualizar según sus requisitos. Aquí estoy actualizando para incrementar el valor en 1.
Java 8 vías:
Puede utilizar computeIfPresent
el método y proporcionarle una función de mapeo, que se llamará para calcular un nuevo valor basado en uno existente.
Por ejemplo,
Map<String, Integer> words = new HashMap<>();
words.put("hello", 3);
words.put("world", 4);
words.computeIfPresent("hello", (k, v) -> v + 1);
System.out.println(words.get("hello"));
Alternativamente, puede usar merge
el método, donde 1 es el valor predeterminado y la función incrementa el valor existente en 1:
words.merge("hello", 1, Integer::sum);
Además, existen muchos otros métodos útiles, como putIfAbsent
, getOrDefault
, forEach
, etc.
La forma simplificada de Java 8 :
map.put(key, map.getOrDefault(key, 0) + 1);
Esto utiliza el método de HashMap que recupera el valor de una clave, pero si la clave no se puede recuperar, devuelve el valor predeterminado especificado (en este caso, un '0').
Esto es compatible con el núcleo de Java: HashMap<K,V> getOrDefault(Clave de objeto, V defaultValue)