當我編碼時,我發生了一個問題,這是如果HashMap中的值部分(整數)能夠在下面的情況下自動增量?HashMap值自動增量
Map<String, Integer> dictionary = new HashMap<String, Integer>();
dictionary.put("a",1);
dictionary.put("b",1);
當我編碼時,我發生了一個問題,這是如果HashMap中的值部分(整數)能夠在下面的情況下自動增量?HashMap值自動增量
Map<String, Integer> dictionary = new HashMap<String, Integer>();
dictionary.put("a",1);
dictionary.put("b",1);
您可以使用一個可變的整數和我喜歡,你可以使用AtomicInteger
Map<Key, AtomicInteger> dictionary = new HashMap<String, AtomicInteger>();
dictionary.get(key).incrementAndGet();
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html
,但我真的很喜歡你,你一定要做到在其上做一個for loop
,因爲傳統的方式使事情變得非常複雜根本無法解決
+1:對我來說,這是最乾淨的解決方案。 – acdcjunior
如果第一次添加密鑰,dictionary.get(key)將返回null。 – Timmy
@Timmy,當然是,AtomicInteger需要用新的AtomicInteger() –
你可以寫一個自定義類AutoIncrementHashMap
它內部使用HashMap
,有自動遞增變量count
和put(String)
方法增加了一個String
成員,增加每次counter
。
您可以使用Google公開源代碼的Guava框架中的Multiset。
使用Multiset可以大大簡化您的生活。
Multiset<String> set = HashMultiset.create();
set.add("abc"):
set.add("acd");
set.add("abc");
// use set.count(Object) to get the counter of the object
int c = set.count("abc");
// or iterate through the set to get each object and its count
for (Multiset.Entry<String> entry : set.entrySet()){
String str = entry.getElement();
int count = entry.getCount();
}
比較到使用普通HashMaps這樣的傳統方式:
Map<String, Integer> map = new HashMap<String, Integer>();
public void add(String str){
Integer oldValue = map.get(str);
if (oldValue == null){
map.put(str, 1);
} else{
map.put(str, oldValue + 1);
}
}
即使你使用可變計數器作爲HashMap中的值,代碼還是很麻煩的。
Map<String, AtomicInteger> map = new HashMap<String, AtomicInteger>();
public void add(String str){
AtomicInteger counter = map.get(str);
if (counter == null){
counter = new AtomicInteger();
map.put(str, counter);
}
counter.incrementAndGet();
}
+1來實例化番石榴,它是迄今爲止最好的方法。 – Zarathustra
最簡單和最快速的解決方案是使用TObjectIntHashMap
TObjectIntHashMap<String> map = new TObjectIntHashMap<String>();
public void add(String str){
map.adjustOrPutValue(str, 1, 1);
}
特羅韋支持原語的集合使他們更高效,在這種情況下,有一個方法,做你所需要的。
您可以創建一個支持類:
public class HashMapInteger<K> extends HashMap<K,Integer> {
public void increment(K key) {
if(super.containsKey(key))
super.put(key,super.get(key)+1);
else
super.put(key,new Integer(1));
}
public void increment(K key, int val) {
if(super.containsKey(key))
super.put(key,super.get(key)+val);
else
super.put(key,new Integer(val));
}
}
要使用它:
HashMapInteger<String> map = new HashMapInteger<String>();
map.increment("abc");
map.increment("abc");
System.out.println(map.get("abc"));//Output is 2
使用'爲loop'是不是一個真正的選擇? –
@Mahan我只想知道值1是否會自動添加到2 ...這只是一個簡單的例子 – Justin
這不是一個好的api設計。你可以隨時增加並放入地圖。 – Jayan