发生重复键时,hashmap自定义覆盖值

时间:2015-04-16 09:39:19

标签: java hashmap

我是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);
         }  

有没有比这更好的方法? 请建议

4 个答案:

答案 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是从Mapage的{​​{1}};