2013-04-14 94 views
0

當我編碼時,我發生了一個問題,這是如果HashMap中的值部分(整數)能夠在下面的情況下自動增量?HashMap值自動增量

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

使用'爲loop'是不是一個真正的選擇? –

+0

@Mahan我只想知道值1是否會自動添加到2 ...這只是一個簡單的例子 – Justin

+0

這不是一個好的api設計。你可以隨時增加並放入地圖。 – Jayan

回答

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,因爲傳統的方式使事情變得非常複雜根本無法解決

+0

+1:對我來說,這是最乾淨的解決方案。 – acdcjunior

+1

如果第一次添加密鑰,dictionary.get(key)將返回null。 – Timmy

+0

@Timmy,當然是,AtomicInteger需要用新的AtomicInteger() –

2

你可以寫一個自定義類AutoIncrementHashMap它內部使用HashMap,有自動遞增變量countput(String)方法增加了一個String成員,增加每次counter

3

您可以使用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(); 
    } 
+0

+1來實例化番石榴,它是迄今爲止最好的方法。 – Zarathustra

1

最簡單和最快速的解決方案是使用TObjectIntHashMap

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

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

特羅韋支持原語的集合使他們更高效,在這種情況下,有一個方法,做你所需要的。

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