当我编码时,我遇到了一个问题,,如果HashMap中的值部分(整数)能够在以下场景中自动增加?
Map<String, Integer> dictionary = new HashMap<String, Integer>();
dictionary.put("a",1);
dictionary.put("b",1);
答案 0 :(得分:4)
您可以使用Google开源的Multiset框架中的Guava。
使用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();
}
答案 1 :(得分:3)
您可以使用可变整数,我更喜欢您可以使用AtomicInteger
Map<Key, AtomicInteger> dictionary = new HashMap<String, AtomicInteger>();
dictionary.get(key).incrementAndGet();
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html
但我真的更喜欢你,你必须按照for loop
的传统方式来做这件事,因为让事情变得复杂根本没有解决方案
答案 2 :(得分:2)
您可以编写自定义类AutoIncrementHashMap
,其内部使用HashMap
,具有自动递增变量count
和put(String)
方法,可添加String
成员并每次递增counter
。
答案 3 :(得分:1)
最简单,最快速的解决方案是使用TObjectIntHashMap
TObjectIntHashMap<String> map = new TObjectIntHashMap<String>();
public void add(String str){
map.adjustOrPutValue(str, 1, 1);
}
Trove支持集合中的原语使它们更有效,并且在这种情况下有一个方法可以满足您的需要。
答案 4 :(得分:0)
您可以创建支持类:
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