2010-11-25 44 views
24

我是否必須返回對象然後放入一個新對象?或者我可以直接增量?在HashMap中增加一個整數

Integer temp = myMap.get(key); 
temp++; 
myMap.put(key, temp); 

沒有辦法只有做到這一點(這不起作用):

myMap.get(key)++; 

回答

12

我是否必須返回對象然後放入一個新對象?

只要你使用Integer包裝類是,因爲它是不可變的。您可以使用可變包裝類,即使是具有increment()方法的包裝類。但是,您將失去在值上使用自動裝箱和自動裝箱的功能。

2

由於Integer是不可改變的,是的,你必須這樣做的。 如果你真的想直接增加它,你必須編寫你自己的可變類。

+6

或者使用'AtomicInteger`。 – 2010-11-25 13:20:53

7

你不能直接增加它,因爲它是immutable。您必須增加它並將新對象放回。

自動拳擊也在這裏干擾。實際上發生的事情類似於:

Integer i1 = getFromMap(); 
i1 = Integer.valueOf(++ i1.intValue()); 

所以這裏您的參考指向一個新的對象。你必須把這個對象放回地圖中,在同一個鍵下。

0

首先:注意拆箱:temp是來自Integer類型。但操作++是爲int實現的。因此,temp會被解除鍵入int。這意味着如果temp爲null,則在NullPointerException中運行。

而且你必須像你在第一個代碼塊中進行區分。

16

這是執行此任務的最短代碼。

myMap.put(key, myMap.get(key) + 1) 

我覺得是不是太長。

+0

它應該如何工作? Put方法需要2個參數,關鍵和新值。 – 2012-12-17 10:19:03

+0

+1,IMO這應該是被接受的答案:簡單和簡潔 - 不需要不可變的包裝(在非MT的情況下放置原子構造*令人困惑*)。正如Piotr所觀察到的,關鍵應該是第一個arg,儘管 – 2014-03-05 15:48:14

+2

表現? 2搜索操作:一個用put()和一個用get() – Deepscorn 2014-06-14 20:26:48

20

您可以使用AtomicInteger等可變整數。

Map<Key, AtomicInteger> myMap = new HashMap<Key, AtomicInteger>(); 
myMap.get(key).incrementAndGet(); 

或者您可以使用支持集合中的原語的Trove4j。

TObjectIntHashMap<Key> myMap; 
myMap.increment(key); 
2

如果你有這樣做的兩倍以上你會希望創建一個微小的類,如:

public class MappedCounter { 

    private Map<String, Integer> map = new HashMap<String, Integer>(); 

    public void addInt(String k, int v) { 
     if (!map.containsKey(k)) map.put(k, v); 
     else    map.put(k, map.get(k) + v); 
    } 

    public int getInt(String k) { 
     return map.containsKey(k) ? map.get(k) : 0; 
    } 

    public Set<String> getKeys() { 
     return map.keySet(); 
    } 
} 
11

在Java 8上有Map新的方法,你可以用lambda表達式使用解決此問題。第一種選擇,compute

a.compute(key, (k, v) -> v+1); 

注意,如果散列對所有可能的密鑰初始化這僅適用。

如果不能保證這一點,你可以在上面的代碼更改爲:

a.compute(key, (k, v) -> v == null ? 1 : v + 1); 

或者使用merge方法(我喜歡):

a.merge(key, 1, (a, b) -> a + b); 

也許有基於多個拉姆達我不知道的方法。

0

我用下面的代碼和它的作品,但在一開始,你需要定義一個BiFunction描述的操作由1遞增

public static Map<String, Integer> strInt = new HashMap<String, Integer>(); 

public static void main(String[] args) { 
    BiFunction<Integer, Integer, Integer> bi = (x,y) -> { 
     if(x == null) 
      return y; 
     return x+y; 
    }; 
    strInt.put("abc", 0); 


    strInt.merge("abc", 1, bi); 
    strInt.merge("abc", 1, bi); 
    strInt.merge("abc", 1, bi); 
    strInt.merge("abcd", 1, bi); 

    System.out.println(strInt.get("abc")); 
    System.out.println(strInt.get("abcd")); 
} 

輸出

3 
1 
-1

這應該工作

 // If the key you want to add does not exist then add it as a new key 
     // And make the value 1 
     if (map.get(key) == null) { 
      map.put(key, 1); 
     } else { 
      // If the key does exist then replace the key's value with it's 
      // Original value plus one 
      map.put(key, map.get(key) + 1); 
     }