0

当我在编码时,我想到了一个问题,那就是HashMap中的值部分(整数)是否能够在以下情况下自动递增?

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

5 回答 5

4

您可以使用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();
     }
于 2013-04-14T06:01:01.943 回答
3

考虑使用AtomicInteger

Map<Key, AtomicInteger> dictionary =
  new HashMap<String, AtomicInteger>();

dictionary.get(key).incrementAndGet();

还可以考虑使用for循环来简化代码。

于 2013-04-14T05:51:47.713 回答
2

您可以编写一个AutoIncrementHashMap内部使用 a的自定义类HashMap,具有一个自动递增变量count和一个put(String)添加String成员并counter每次递增的方法。

于 2013-04-14T05:51:25.793 回答
1

最简单最快的解决方案是使用TObjectIntHashMap

TObjectIntHashMap<String> map = new TObjectIntHashMap<String>();

public void add(String str){
    map.adjustOrPutValue(str, 1, 1);
}

Trove 支持集合中的原语,使它们更高效,在这种情况下,有一种方法可以满足您的需求。

于 2013-04-14T09:24:57.333 回答
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
于 2017-06-01T16:28:50.927 回答