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
}
}
16 回答
将
Integer
替换为AtomicInteger并调用其中一个incrementAndGet
/getAndIncrement
方法 .另一种方法是将
int
包装在您自己的MutableInteger
类中,该类具有increment()
方法,您只需解决一个线程安全问题 .没有NullPointerException的清洁解决方案是:
可能会有点晚,但这是我的两分钱 .
如果您使用的是Java 8,则可以使用computeIfPresent方法 . 如果指定键的值存在且非null,则它会尝试计算给定键及其当前映射值的新映射 .
我们也可以使用另一种方法putIfAbsent来放一把钥匙 . 如果指定的键尚未与值关联(或映射为null),则此方法将其与给定值相关联并返回null,否则返回当前值 .
如果 Map 是跨线程共享的,那么我们可以使用
ConcurrentHashMap
和AtomicInteger . 从文档:我们可以使用它们如图所示:
需要注意的一点是,我们正在调用
get
来获取keyB
的值,然后在其值上调用incrementAndGet()
,当然这是AtomicInteger
. 我们可以优化它,因为方法putIfAbsent
返回密钥的值(如果已经存在):另外,如果我们计划使用AtomicLong,那么根据高争用的文档,LongAdder的预期吞吐量要高得多,这是以更高的空间消耗为代价的 . 另请检查question .
这里有一个误导性的答案,暗示如果密钥存在,Hashtable put方法将替换现有值,对于Hashtable而言,这不适用于HashMap . 请参阅Javadoc for HashMap http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#put%28K,%20V%29
一线解决方案:
Java 8方式:
您可以使用
computeIfPresent
方法并为其提供映射函数,该函数将被调用以基于现有值计算新值 .例如,
或者,您可以使用
merge
方法,其中1是默认值,函数将现有值增加1:此外,还有许多其他有用的方法,例如
putIfAbsent
,getOrDefault
,forEach
等 .哈希是否存在(0为值)还是在第一个增量上“放”到 Map 上?如果它是第一个增量“put”,代码应如下所示:
应该没事 . 它将更新现有映射的值 . 请注意,这使用自动装箱 .
要么
整数是原始数据类型http://cs.fit.edu/~ryan/java/language/java-data.html,因此您需要将其取出,进行一些处理,然后将其放回原处 . 如果你有一个不是原始数据类型的值,你只需要把它拿出来,处理它,不需要把它放回到hashmap中 .
使用
for
循环递增索引:尝试:
注意:
您可以更改hashmap中的键或值,但不能同时更改它们 .
简化的 Java 8 方式:
这使用HashMap的方法来检索键的值,但是如果无法检索键,则返回指定的默认值(在本例中为“0”) .
这在核心Java中得到支持:HashMap<K,V> getOrDefault(Object key, V defaultValue)
您可以像下面一样增加,但是您需要检查是否存在,以便不抛出NullPointerException
由于声誉较低,我无法评论几个答案,因此我将发布一个我应用的解决方案 .
方法
put
将替换现有密钥的值,如果不存在则将创建它 .@ Matthew的解决方案是最简单的,并且在大多数情况下表现都很好 .
如果您需要高性能,AtomicInteger是一个更好的解决方案ala @BalusC .
但是,更快的解决方案(提供线程安全性不是问题)是使用TObjectIntHashMap,它提供增量(键)方法并使用基元和少于创建AtomicIntegers的对象 . 例如