代码之家  ›  专栏  ›  技术社区  ›  NimChimpsky

在HashMap中增加一个整数

  •  27
  • NimChimpsky  · 技术社区  · 15 年前

    我必须把东西还回去然后再放一个新的进去吗?或者我可以直接递增吗?

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

    不能这样做(这不起作用):

    myMap.get(key)++;
    
    11 回复  |  直到 15 年前
        1
  •  14
  •   Michael Borgwardt    15 年前

    我必须把东西还回去然后再放一个新的进去吗?

    只要你使用 Integer 包装类是的,因为它是不可变的。您可以使用可变包装器类,即使是具有 increment() 方法。但是,你失去了使用自动装箱和自动装箱的能力。

        2
  •  24
  •   AlexR    12 年前

    这是执行此任务的最短代码。

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

    我想不会太长。

        3
  •  20
  •   Sam    10 年前

    您可以使用可变整数,例如AtomicInteger。

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

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

    TObjectIntHashMap<Key> myMap;
    myMap.increment(key); 
    
        4
  •  20
  •   Lii bob    9 年前

    在Java8中 Map 你可以和lambdas一起解决这个问题。第一个选择, 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);
    

    也许还有更多基于lambda的方法我不知道。

        5
  •  7
  •   Singleton    15 年前

    不能直接递增,因为它是 immutable . 你必须增加它并把新对象放回去。

    自动拳击也干扰了这里。事实上发生的事情类似于:

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

    所以这里你的参考指向一个新的物体。你必须把那个物体放回地图,在同一个键下。

        6
  •  3
  •   Nicolas    15 年前

    作为 Integer 是不变的,是的,你必须这样做。 如果您真的想直接增加它,就必须编写自己的可变类。

        7
  •  2
  •   leonbloy    12 年前

    如果你必须这样做两次以上,你更愿意创建一个小类,比如:

    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();
        }
    }
    
        8
  •  0
  •   scheffield    15 年前

    首先,注意解压:临时取自类型整数。但是操作++是为int实现的。所以temp没有绑定到int类型。这意味着如果temp为空,则在NullPointerException中运行。

    你必须像在第一个代码块中描述的那样去做。

        9
  •  0
  •   MGoksu    10 年前

    我使用下面的代码,它可以工作,但在开始时,您需要定义 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
    
        10
  •  0
  •   Markus Schreiber    9 年前

    为了完整起见,在Java 8中有一个longAdder,它比AtomicInteger带来了一些好处( http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html )

    final Map<WhatEver, LongAdder> result = new HashMap<>();
    result.get(WhatEver).increment();
    
        11
  •  -1
  •   Tyderf    9 年前

    这应该管用

            // 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);
            }