假设我们在Java中有一个HashMap<String, Integer>。

我如何更新(增量)字符串键的整数值为我找到的字符串的每个存在?

人们可以删除并重新输入配对,但开销将是一个问题。 另一种方法是只放一双新的,旧的就会被替换掉。

在后一种情况下,如果hashcode与我试图插入的新键发生冲突,会发生什么?哈希表的正确行为是为它分配一个不同的位置,或者在当前桶中对它进行列表。


当前回答

由于我不能评论一些答案,由于较少的声誉,我会张贴一个解决方案,我应用。

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
   }
}

其他回答

使用for循环来增加索引:

for (int i =0; i<5; i++){
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    map.put("beer", 100);

    int beer = map.get("beer")+i;
    System.out.println("beer " + beer);
    System.out ....

}

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等。

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。

hashmap.put(key, hashmap.get(key) + 1);

put方法将替换现有键的值,如果不存在则创建该键。

@Matthew的解决方案是最简单的,在大多数情况下都会表现得很好。

如果你需要高性能,AtomicInteger是一个比@BalusC更好的解决方案。

然而,一个更快的解决方案(如果线程安全不是一个问题)是使用TObjectIntHashMap,它提供了一个增量(键)方法,使用原语和比创建AtomicIntegers更少的对象。如。

TObjectIntHashMap<String> map = new TObjectIntHashMap<String>()
map.increment("aaa");