假设我们在Java中有一个HashMap<String, Integer>。
我如何更新(增量)字符串键的整数值为我找到的字符串的每个存在?
人们可以删除并重新输入配对,但开销将是一个问题。 另一种方法是只放一双新的,旧的就会被替换掉。
在后一种情况下,如果hashcode与我试图插入的新键发生冲突,会发生什么?哈希表的正确行为是为它分配一个不同的位置,或者在当前桶中对它进行列表。
假设我们在Java中有一个HashMap<String, Integer>。
我如何更新(增量)字符串键的整数值为我找到的字符串的每个存在?
人们可以删除并重新输入配对,但开销将是一个问题。 另一种方法是只放一双新的,旧的就会被替换掉。
在后一种情况下,如果hashcode与我试图插入的新键发生冲突,会发生什么?哈希表的正确行为是为它分配一个不同的位置,或者在当前桶中对它进行列表。
当前回答
没有NullPointerException的更干净的解决方案是:
map.replace(key, map.get(key) + 1);
其他回答
将Integer替换为AtomicInteger,并调用其中一个incrementAndGet/getAndIncrement方法。
另一种方法是在你自己的MutableInteger类中包装一个int,这个类有一个increment()方法,你只需要解决线程安全问题。
Java 8方式:
您可以使用computeIfPresent方法并为其提供一个映射函数,该函数将被调用以基于现有值计算一个新值。
例如,
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"));
或者,你可以使用merge方法,其中1是默认值,函数将现有值加1:
words.merge("hello", 1, Integer::sum);
此外,还有一些其他有用的方法,如putIfAbsent、getOrDefault、forEach等。
一句话解决方案:
map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);
简化的Java 8方式:
map.put(key, map.getOrDefault(key, 0) + 1);
它使用HashMap的方法来检索键的值,但如果无法检索键,则返回指定的默认值(在本例中为'0')。
HashMap<K,V> getOrDefault(对象键,V defaultValue)
Integer i = map.get(key);
if(i == null)
i = (aValue)
map.put(key, i + 1);
or
Integer i = map.get(key);
map.put(key, i == null ? newValue : i + 1);
Integer是原始数据类型http://cs.fit.edu/~ryan/java/language/java-data.html,因此您需要将其取出,进行一些处理,然后将其放回去。如果你有一个不是基本数据类型的值,你只需要取出它,处理它,不需要把它放回hashmap。