假设我们在Java中有一个HashMap<String, Integer>。
我如何更新(增量)字符串键的整数值为我找到的字符串的每个存在?
人们可以删除并重新输入配对,但开销将是一个问题。 另一种方法是只放一双新的,旧的就会被替换掉。
在后一种情况下,如果hashcode与我试图插入的新键发生冲突,会发生什么?哈希表的正确行为是为它分配一个不同的位置,或者在当前桶中对它进行列表。
假设我们在Java中有一个HashMap<String, Integer>。
我如何更新(增量)字符串键的整数值为我找到的字符串的每个存在?
人们可以删除并重新输入配对,但开销将是一个问题。 另一种方法是只放一双新的,旧的就会被替换掉。
在后一种情况下,如果hashcode与我试图插入的新键发生冲突,会发生什么?哈希表的正确行为是为它分配一个不同的位置,或者在当前桶中对它进行列表。
当前回答
使用Java8内置函数“computeIfPresent”
例子:
public class ExampleToUpdateMapValue {
public static void main(String[] args) {
Map<String,String> bookAuthors = new TreeMap<>();
bookAuthors.put("Genesis","Moses");
bookAuthors.put("Joshua","Joshua");
bookAuthors.put("Judges","Samuel");
System.out.println("---------------------Before----------------------");
bookAuthors.entrySet().stream().forEach(System.out::println);
// To update the existing value using Java 8
bookAuthors.computeIfPresent("Judges", (k,v) -> v = "Samuel/Nathan/Gad");
System.out.println("---------------------After----------------------");
bookAuthors.entrySet().stream().forEach(System.out::println);
}
}
其他回答
没有NullPointerException的更干净的解决方案是:
map.replace(key, map.get(key) + 1);
hashmap.put(key, hashmap.get(key) + 1);
put方法将替换现有键的值,如果不存在则创建该键。
将Integer替换为AtomicInteger,并调用其中一个incrementAndGet/getAndIncrement方法。
另一种方法是在你自己的MutableInteger类中包装一个int,这个类有一个increment()方法,你只需要解决线程安全问题。
简化的Java 8方式:
map.put(key, map.getOrDefault(key, 0) + 1);
它使用HashMap的方法来检索键的值,但如果无法检索键,则返回指定的默认值(在本例中为'0')。
HashMap<K,V> getOrDefault(对象键,V defaultValue)
一句话解决方案:
map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);