HashMap值自动增量

时间:2013-04-14 05:45:49

标签: java hashmap

当我编码时,我遇到了一个问题,,如果HashMap中的值部分(整数)能够在以下场景中自动增加?

Map<String, Integer> dictionary = new HashMap<String, Integer>();    
dictionary.put("a",1);
dictionary.put("b",1);

5 个答案:

答案 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,具有自动递增变量countput(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