how to merge more than one hashmaps also sum the values of same key in java

前端 未结 8 1558
清歌不尽
清歌不尽 2021-02-13 03:03

ı am trying to merge more than one hashmaps also sum the values of same key, ı want to explain my problem with toy example as follows

    HashMap

        
相关标签:
8条回答
  • 2021-02-13 03:22

    Something like this should work:

     for (Map.Entry<String, Integer> entry : map.entrySet()) {
        String map1_key = entry.getKey();
        int map1_value = entry.getValue();
    
        //check:
        if(map2.get(map1_key)!=null){
        int map2_value = map2.get(map1_key);
        //merge:
        map3.put(map1_key,map1_value+map2_value);
        }else{
        map3.put(map1_key,map1_value);
        }
    }
    
    
      for (Map.Entry<String, Integer> entry2 : map2.entrySet()) {
            String map2_key = entry2.getKey();
            int map2_value = entry2.getValue();
    
            //check:
            if(map1.get(map2_key)!=null){
            int map1_value = map1.get(map2_key);
            //merge:
            map3.put(map2_key,map1_value+map2_value);
            }else{
            map3.put(map2_key,map2_value);
            }
        }
    
    0 讨论(0)
  • 2021-02-13 03:26

    ı improve Lucas Ross's code. in stead of enter map by one by in function ı give all maps one times to function with arraylist of hashmap like that

        public HashMap<String, Integer> mergeAndAdd(ArrayList<HashMap<String, Integer>> maplist) {
        HashMap<String, Integer> result = new HashMap<>();
        for (HashMap<String, Integer> map : maplist) {
            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                String key = entry.getKey();
                Integer current = result.get(key);
                result.put(key, current == null ? entry.getValue() : entry.getValue() + current);
            }
        }
        return result;
    }
    

    }

    it works too. thanks to everbody

    0 讨论(0)
  • 2021-02-13 03:30

    If you are using Java 8, you can use the new merge method of Map.

    m2.forEach((k, v) -> m.merge(k, v, (v1, v2) -> v1 + v2));
    
    0 讨论(0)
  • 2021-02-13 03:30

    This is a very nice use case for Java 8 streams. You can concatentate the streams of entries and then collect them in a new map:

    Map<String, Integer> combinedMap = Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                 Collectors.summingInt(Map.Entry::getValue)));
    

    There are lots of nice things about this solution, including being able to make it parallel, expanding to as many maps as you want and being able to trivial filter the maps if required. It also does not require the orginal maps to be mutable.

    0 讨论(0)
  • 2021-02-13 03:31

    If the key exists, add to it's value. If not insert.

    Here is a simple example which merges one map into another:

    Foo oldVal = map.get(key);
    if oldVal == null
    {
       map2.put(key, newVal);
    }
    else
    {
       map2.put(key, newVal + oldVal);
    }
    

    Obviously you have to loop over the first map so you can process all of it's entries but that's trivial.

    0 讨论(0)
  • 2021-02-13 03:39

    Assume that you have many HashMaps: HashMap<String,Integer> map1, map2, map3;

    Then you can use Java 8 streams:

    List<Map<String,Integer>> mapList = Arrays.asList(map1, map2, map3);
    
    Map<String,Integer> combinedMap = mapList.stream()
            .flatMap(map -> map.entrySet().stream())
            .collect(Collectors.groupingBy(Entry::getKey,
                    Collectors.summingInt(Entry::getValue)));
    
    0 讨论(0)
提交回复
热议问题