当我在编码时,我想到了一个问题,那就是HashMap中的值部分(整数)是否能够在以下情况下自动递增?
Map<String, Integer> dictionary = new HashMap<String, Integer>();
dictionary.put("a",1);
dictionary.put("b",1);
您可以使用Google 开源的Guava框架中的Multiset 。
使用 Multiset 可以大大简化您的生活。
Multiset<String> set = HashMultiset.create();
set.add("abc"):
set.add("acd");
set.add("abc");
// use set.count(Object) to get the counter of the object
int c = set.count("abc");
// or iterate through the set to get each object and its count
for (Multiset.Entry<String> entry : set.entrySet()){
String str = entry.getElement();
int count = entry.getCount();
}
与使用普通 HashMaps 的传统方式相比:
Map<String, Integer> map = new HashMap<String, Integer>();
public void add(String str){
Integer oldValue = map.get(str);
if (oldValue == null){
map.put(str, 1);
} else{
map.put(str, oldValue + 1);
}
}
即使使用可变计数器作为 HashMap 的值,代码仍然非常繁琐。
Map<String, AtomicInteger> map = new HashMap<String, AtomicInteger>();
public void add(String str){
AtomicInteger counter = map.get(str);
if (counter == null){
counter = new AtomicInteger();
map.put(str, counter);
}
counter.incrementAndGet();
}
考虑使用AtomicInteger
:
Map<Key, AtomicInteger> dictionary =
new HashMap<String, AtomicInteger>();
dictionary.get(key).incrementAndGet();
还可以考虑使用for
循环来简化代码。
您可以编写一个AutoIncrementHashMap
内部使用 a的自定义类HashMap
,具有一个自动递增变量count
和一个put(String)
添加String
成员并counter
每次递增的方法。
最简单最快的解决方案是使用TObjectIntHashMap
TObjectIntHashMap<String> map = new TObjectIntHashMap<String>();
public void add(String str){
map.adjustOrPutValue(str, 1, 1);
}
Trove 支持集合中的原语,使它们更高效,在这种情况下,有一种方法可以满足您的需求。
您可以创建一个支持类:
public class HashMapInteger<K> extends HashMap<K,Integer> {
public void increment(K key) {
if(super.containsKey(key))
super.put(key,super.get(key)+1);
else
super.put(key,new Integer(1));
}
public void increment(K key, int val) {
if(super.containsKey(key))
super.put(key,super.get(key)+val);
else
super.put(key,new Integer(val));
}
}
要使用它:
HashMapInteger<String> map = new HashMapInteger<String>();
map.increment("abc");
map.increment("abc");
System.out.println(map.get("abc"));//Output is 2