增加HashMap中的整数

Nim*_*sky 29 java pointers reference hashmap

我是否必须返回该对象然后再添加一个新对象?或者我可以直接增加?

Integer temp = myMap.get(key);
temp++;
myMap.put(key, temp);
Run Code Online (Sandbox Code Playgroud)

没有办法做到这一点(这不起作用):

myMap.get(key)++;
Run Code Online (Sandbox Code Playgroud)

Ale*_*exR 24

这是完成这项工作的最短代码.

myMap.put(key, myMap.get(key) + 1)
Run Code Online (Sandbox Code Playgroud)

我认为不会太久.

  • 请注意,如果未针对所有可能的键初始化值,则此解决方案会导致空指针异常. (7认同)
  • 性能?2个搜索操作:一个用put(),一个用get() (2认同)

Pet*_*rey 20

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

Map<Key, AtomicInteger> myMap = new HashMap<Key, AtomicInteger>();
myMap.get(key).incrementAndGet();
Run Code Online (Sandbox Code Playgroud)

或者您可以使用支持集合中的基元的Trove4j.

TObjectIntHashMap<Key> myMap;
myMap.increment(key); 
Run Code Online (Sandbox Code Playgroud)

  • 地图包含引用,而不是对象本身.您不需要在地图中放回对可变对象的引用,因为您更改了基础对象而不是引用. (3认同)

Jon*_*nen 20

在Java 8中,有一些新方法Map可以与lambdas一起使用来解决这个问题.第一种选择,compute:

a.compute(key, (k, v) -> v+1);
Run Code Online (Sandbox Code Playgroud)

请注意,这仅在为所有可能的键初始化哈希时才有效.

如果无法保证,您可以将上述代码更改为:

a.compute(key, (k, v) -> v == null ? 1 : v + 1);
Run Code Online (Sandbox Code Playgroud)

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

a.merge(key, 1, (a, b) -> a + b);
Run Code Online (Sandbox Code Playgroud)

也许有更多基于lambda的方法,我不知道.

  • 这是根据java8的最佳答案 (2认同)

Mic*_*rdt 14

我是否必须返回该对象然后再添加一个新对象?

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


Boz*_*zho 7

你不能直接递增它,因为它是不可变的.你必须增加它并将新对象放回去.

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

Integer i1 = getFromMap();
i1 = Integer.valueOf(++ i1.intValue());
Run Code Online (Sandbox Code Playgroud)

所以这里你的参考指向一个新对象.您必须将该对象放回到地图中,在同一个键下.