假设我们在Java中有一个HashMap<String, Integer>。
我如何更新(增量)字符串键的整数值为我找到的字符串的每个存在?
人们可以删除并重新输入配对,但开销将是一个问题。 另一种方法是只放一双新的,旧的就会被替换掉。
在后一种情况下,如果hashcode与我试图插入的新键发生冲突,会发生什么?哈希表的正确行为是为它分配一个不同的位置,或者在当前桶中对它进行列表。
假设我们在Java中有一个HashMap<String, Integer>。
我如何更新(增量)字符串键的整数值为我找到的字符串的每个存在?
人们可以删除并重新输入配对,但开销将是一个问题。 另一种方法是只放一双新的,旧的就会被替换掉。
在后一种情况下,如果hashcode与我试图插入的新键发生冲突,会发生什么?哈希表的正确行为是为它分配一个不同的位置,或者在当前桶中对它进行列表。
当前回答
hashmap.put(key, hashmap.get(key) + 1);
put方法将替换现有键的值,如果不存在则创建该键。
其他回答
对于这个问题,有一些误导性的回答暗示,如果键存在,Hashtable put方法将替换现有的值,这对于Hashtable不是正确的,而对于HashMap是正确的。HashMap参见Javadoc http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#put%28K,%20V%29
一句话解决方案:
map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);
@Matthew的解决方案是最简单的,在大多数情况下都会表现得很好。
如果你需要高性能,AtomicInteger是一个比@BalusC更好的解决方案。
然而,一个更快的解决方案(如果线程安全不是一个问题)是使用TObjectIntHashMap,它提供了一个增量(键)方法,使用原语和比创建AtomicIntegers更少的对象。如。
TObjectIntHashMap<String> map = new TObjectIntHashMap<String>()
map.increment("aaa");
由于我不能评论一些答案,由于较少的声誉,我会张贴一个解决方案,我应用。
for(String key : someArray)
{
if(hashMap.containsKey(key)//will check if a particular key exist or not
{
hashMap.put(hashMap.get(key),value+1);// increment the value by 1 to an already existing key
}
else
{
hashMap.put(key,value);// make a new entry into the hashmap
}
}
您可以像下面这样递增,但您需要检查是否存在,以便不会抛出NullPointerException
if(!map.containsKey(key)) {
p.put(key,1);
}
else {
p.put(key, map.getKey()+1);
}