假设我们在Java中有一个HashMap<String, Integer>。
我如何更新(增量)字符串键的整数值为我找到的字符串的每个存在?
人们可以删除并重新输入配对,但开销将是一个问题。 另一种方法是只放一双新的,旧的就会被替换掉。
在后一种情况下,如果hashcode与我试图插入的新键发生冲突,会发生什么?哈希表的正确行为是为它分配一个不同的位置,或者在当前桶中对它进行列表。
假设我们在Java中有一个HashMap<String, Integer>。
我如何更新(增量)字符串键的整数值为我找到的字符串的每个存在?
人们可以删除并重新输入配对,但开销将是一个问题。 另一种方法是只放一双新的,旧的就会被替换掉。
在后一种情况下,如果hashcode与我试图插入的新键发生冲突,会发生什么?哈希表的正确行为是为它分配一个不同的位置,或者在当前桶中对它进行列表。
当前回答
一句话解决方案:
map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);
其他回答
没有NullPointerException的更干净的解决方案是:
map.replace(key, map.get(key) + 1);
散列是否存在(以0为值)或者它是否在第一个增量上“放置”到映射中?如果它是“put”在第一个增量上,代码应该是这样的:
if (hashmap.containsKey(key)) {
hashmap.put(key, hashmap.get(key)+1);
} else {
hashmap.put(key,1);
}
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。
Try:
HashMap hm=new HashMap<String ,Double >();
注意:
String->give the new value; //THIS IS THE KEY
else
Double->pass new value; //THIS IS THE VALUE
您可以更改hashmap中的键或值,但不能同时更改两者。
@Matthew的解决方案是最简单的,在大多数情况下都会表现得很好。
如果你需要高性能,AtomicInteger是一个比@BalusC更好的解决方案。
然而,一个更快的解决方案(如果线程安全不是一个问题)是使用TObjectIntHashMap,它提供了一个增量(键)方法,使用原语和比创建AtomicIntegers更少的对象。如。
TObjectIntHashMap<String> map = new TObjectIntHashMap<String>()
map.increment("aaa");