我是否必须返回对象然后放入一个新对象?或者我可以直接增量?在HashMap中增加一个整数
Integer temp = myMap.get(key);
temp++;
myMap.put(key, temp);
没有办法只有做到这一点(这不起作用):
myMap.get(key)++;
我是否必须返回对象然后放入一个新对象?或者我可以直接增量?在HashMap中增加一个整数
Integer temp = myMap.get(key);
temp++;
myMap.put(key, temp);
没有办法只有做到这一点(这不起作用):
myMap.get(key)++;
我是否必须返回对象然后放入一个新对象?
只要你使用Integer
包装类是,因为它是不可变的。您可以使用可变包装类,即使是具有increment()
方法的包装类。但是,您将失去在值上使用自动装箱和自动装箱的功能。
由于Integer
是不可改变的,是的,你必须这样做的。 如果你真的想直接增加它,你必须编写你自己的可变类。
你不能直接增加它,因为它是immutable。您必须增加它并将新对象放回。
自动拳击也在这里干扰。实际上发生的事情类似于:
Integer i1 = getFromMap();
i1 = Integer.valueOf(++ i1.intValue());
所以这里您的参考指向一个新的对象。你必须把这个对象放回地图中,在同一个键下。
首先:注意拆箱:temp是来自Integer类型。但操作++是为int实现的。因此,temp会被解除键入int。这意味着如果temp为null,则在NullPointerException中运行。
而且你必须像你在第一个代码块中进行区分。
这是执行此任务的最短代码。
myMap.put(key, myMap.get(key) + 1)
我觉得是不是太长。
它应该如何工作? Put方法需要2个参数,关键和新值。 – 2012-12-17 10:19:03
+1,IMO这应该是被接受的答案:简单和简洁 - 不需要不可变的包装(在非MT的情况下放置原子构造*令人困惑*)。正如Piotr所观察到的,关键应该是第一个arg,尽管 – 2014-03-05 15:48:14
表现? 2搜索操作:一个用put()和一个用get() – Deepscorn 2014-06-14 20:26:48
您可以使用AtomicInteger等可变整数。
Map<Key, AtomicInteger> myMap = new HashMap<Key, AtomicInteger>();
myMap.get(key).incrementAndGet();
或者您可以使用支持集合中的原语的Trove4j。
TObjectIntHashMap<Key> myMap;
myMap.increment(key);
如果你有这样做的两倍以上你会希望创建一个微小的类,如:
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();
}
}
我用下面的代码和它的作品,但在一开始,你需要定义一个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
这应该工作
// 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);
}
只是为了完整性在Java 8中有一个longAdder它带来了s与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();
或者使用'AtomicInteger`。 – 2010-11-25 13:20:53