If you are using a HashMap
to keep a running total of a series of elements, then you often need to increment a HashMap
item, but if it doesn’t exist in the map yet, then you need to rather create it.
There are a number of ways to do this, let’s explore some of these.
Using Merge and Sum in Java 8
My absolute favourite is to use Java 8’s ability to do the below:
myMap.merge(key, 1, Integer::sum)
This will create a new one with the specified value if it does not exist, otherwise it will add sum the value with the newly added value.
Pre Java 8 solution
Pre Java 8, a nice way to do this is as follows:
Map<String, Integer> myMap = new HashMap<>();
String key = "your_key";
int count = myMap.getOrDefault(key, 0);
myMap.put(key, count + 1);
This can be simplified to:
myMap.put(key, myMap.getOrDefault(key, 0) + 1);
Some alternatives may include
ContainsKey
import java.util.HashMap;
import java.util.Map;
Map<String, Integer> freq = new HashMap<String, Integer>();
int count = freq.containsKey(word) ? freq.get(word) : 0;
freq.put(word, count + 1);
TestForNull
import java.util.HashMap;
import java.util.Map;
Map<String, Integer> freq = new HashMap<String, Integer>();
Integer count = freq.get(word);
if (count == null) freq.put(word, 1);
else freq.put(word, count + 1);
AtomicLong
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
final ConcurrentMap<String, AtomicLong> map = new ConcurrentHashMap<String, AtomicLong>();
map.putIfAbsent(word, new AtomicLong(0));
map.get(word).incrementAndGet();
Trove
import gnu.trove.TObjectIntHashMap;
TObjectIntHashMap<String> freq = new TObjectIntHashMap<String>();
freq.adjustOrPutValue(word, 1, 1);
MutableInt
import java.util.HashMap;
import java.util.Map;
class MutableInt {
int value = 1;
public void increment () { ++value; }
public int get () { return value; }
}
Map<String, MutableInt> freq = new HashMap<String, MutableInt>();
MutableInt count = freq.get(word);
if (count == null)freq.put(word, new MutableInt());
else count.increment();