代码之家  ›  专栏  ›  技术社区  ›  csse

如何为hashmap中的重复元素添加所有整数?

  •  -2
  • csse  · 技术社区  · 7 年前

    我有以下哈希图:

    Map<String, Integer> map = new HashMap<>();
    

    如何对重复字符串的所有整数求和?还是有更好的方法来使用set?

    例如,如果我添加这些元素:

    car 100
    
    TV 140
    
    car 5
    
    charger 10
    
    TV 10
    

    我希望列表包含:

    car 105
    
    TV 150
    
    charger 10
    
    5 回复  |  直到 7 年前
        1
  •  1
  •   ᴇʟᴇvᴀтᴇ    7 年前

    首先,您不能在映射中添加重复的键。 但是,如果我理解您的需求,下面的代码可能会帮助您:

        if (map.containsKey(key))
            map.put(key, map.get(key) + newValue);
        else
            map.put(key, newValue);
    
        2
  •  3
  •   sprinter    7 年前

    我相信你的问题是:我如何将键/值对以改变值而不是替换值的方式放入一个映射中,以获得相同的键。

    Java有一个 Map 专门用于此目的的方法:

    map.merge(key, value, (v, n) -> v + n);
    

    如果键不在映射中,这将添加值。否则,它将用当前值和新值的总和替换当前值。

    这个 merge 方法在Java 8中介绍。

        3
  •  1
  •   Yassin Hajaj    7 年前

    为了 更高

    您可能只想使用 Map#merge 方法。这是最简单的方法。如果该键不存在,则添加该键;如果该键存在,则执行合并操作。

    map.merge("car", 100, Integer::sum);
    map.merge("car", 20, Integer::sum);
    
    System.out.println(map); // {car=120}
    
        4
  •  0
  •   Tiago Mussi    7 年前

    当您第二次添加“tv”时,第一个值(140)将被覆盖,因为您不能在映射实现上有重复的键。如果要增加该值,则需要检查“TV”键是否已存在,然后增加/添加该值。

    例如:

    if (map.containsKey(key)) {
       value += map.get(key);
    } 
    map.put(key, value)
    
        5
  •  -1
  •   One Man Crew    7 年前

    hashmap dosen不保存重复的密钥!

    可以扩展HASMAP类(Java≫=8):

    public class MyHashMap2 extends HashMap<String, Integer>{
    
    @Override
    public Integer put(String key, Integer value) {
        return merge(key, value, (v, n) -> v + n);
    }
    public static void main (String[] args) throws java.lang.Exception
    {
       MyHashMap2 list3=new MyHashMap2();
        list3.put("TV", 10);
        list3.put("TV", 20);
        System.out.println(list3);
     }
    }
    

    或者你可以把 HashMap 并替换Put方法,将新值添加到前一个值中。

    HashMap<String, Integer> list = new HashMap<>();
            list.put("TV", 10);
            list.put("TV", 20);
            System.out.println(list);
    
            MyHashMap list2 = new MyHashMap();
            list2.put("TV", 10);
            list2.put("TV", 20);
            System.out.println(list2);
    //OUTPUT:
    //{TV=20}
    //MyHashMap [List={TV=30}]
    
    
    
    public class MyHashMap implements Map<String, Integer>{
            HashMap<String, Integer> list = new HashMap<>();
    
            public MyHashMap() {
                super();
            }
    
            @Override
            public int size() {
                return list.size();
            }
    
            @Override
            public boolean isEmpty() {
                return list.isEmpty();
            }
    
            @Override
            public boolean containsKey(Object key) {
                return list.containsKey(key);
            }
    
            @Override
            public boolean containsValue(Object value) {
                return  list.containsValue( value);
            }
    
            @Override
            public Integer get(Object key) {
                return list.get(key);
            }
    
            @Override
            public Integer put(String key, Integer value) {
                 if(list.containsKey(key))
                     list.put(key, list.get(key)+value);
                    else
                        list.put(key, value);
                return value;
            }
    
            @Override
            public Integer remove(Object key) {
    
                return list.remove(key);
            }
    
            @Override
            public void putAll(Map<? extends String, ? extends Integer> m) {
                list.putAll(m);
    
            }
    
            @Override
            public void clear() {
                list.clear();
    
    
            }
    
            @Override
            public Set<String> keySet() {
                return list.keySet();
            }
    
            @Override
            public Collection<Integer> values() {
                return list.values();
            }
    
            @Override
            public Set<java.util.Map.Entry<String, Integer>> entrySet() {
                return list.entrySet();
            }
    
            @Override
            public String toString() {
                return "MyHashMap [list=" + list + "]";
            }
    
    
        }
    

    您可以在这里尝试代码: https://ideone.com/Wl4Arb