我是java新手,我有一个hashmap,我必须插入密钥作为年龄和值作为计数,即
HashMap<Integer,Integer> hashMap = new HashMap<Integer, Integer>();
hashMap.put(1,1);
hashMap.put(2,1);
hashMap.put(3,1);
hashMap.put(1,1); // whenever i insert this ,according to hashmap, it will override, but i want to customise like the value should be incremented , ie the value of key 1 should be 2, again if i insert with
hashMap.put(1,1); // the value of key 1 should be 3.
我想自定义覆盖值,同时添加重复键。
我已按以下方式完成
if(hashMap.containsValue(1)){
Integer i = hashMap.get(1);
i++;
hashMap.put(1, i);
}else{
hashMap.put(1, 1);
}
有没有比这更好的方法? 请建议
答案 0 :(得分:1)
有几种方法可以解决这个问题,你的可能会很好。
如果例如。你想最小化put-operations的数量,你可以创建一个可变的Counter类,它包装一个整数(int primitive)并提供一个increment方法(counter ++)。然后你可以像这样使用它:
Map<Integer, Counter> ageMap;
Integer age = ....;
if(ageMap.containsValue(age)){
ageMap.get(age).increment();
}else{
ageMap.put(age, new Counter(1));
}
答案 1 :(得分:1)
在Java 8中,您可以查看 Map.computeIfPresent()方法:
hashMap.computeIfPresent(aKey, (k, v) -> v + 1);
答案 2 :(得分:0)
您可以创建自己的MyHashMap
类,该类扩展HashMap
并覆盖put
。或者,您在MyHashMap
中将哈希地图作为私有字段,将已编写的代码应用于put
的{{1}}方法。
答案 3 :(得分:0)
技巧:
int[] ages=...;
HashMap<Integer,Integer> ageMap = new HashMap<Integer, Integer>();
for(int i = 0;i < ages.length; i++){
if(ageMap.contains(ages[i])){
ageMap.put(ages[i], ageMap.get(ages[i])+1);
} else {
ageMap.put(ages[i], 1);
}
}
然后,ageMap
是从Map
到age
的{{1}};