Alex Rivera | Logout

Add two maps in Groovy while summing up values for common keys

Asked 2012-04-12T18:47:15.393
21

I have two maps in Groovy [a: 1, b: 2] and [b:1, c:3] and would like to create from them a third map [a: 1, b: 3, c: 3]. Is there a Groovy command that does that?

Edit: Notice that the values in the third map, are a sum of the values from the first two maps, if the keys are identical.

Thanks

Edit
Report

2 Answers

17

Yet another solution would be:

def m1 = [ a:1, b:2 ]
def m2 = [ b:1, c:3 ]

def newMap = [m1,m2]*.keySet().flatten().unique().collectEntries {
  [ (it): [m1,m2]*.get( it ).findAll().sum() ]
}

Taking epidemian's answer as inspiriation, you can also write a method to handle multiple maps

def m1 = [a: 1, b: 2]
def m2 = [b: 1, c: 3]

def combine( Map... m ) {
  m.collectMany { it.entrySet() }.inject( [:] ) { result, e ->
    result << [ (e.key):e.value + ( result[ e.key ] ?: 0 ) ]
  }
}

def newMap = combine( m1, m2 )
answered 2012-04-12T19:57:50.870
3

A nice way is it use the spread operator:

def m1 = [ a:1, b:2 ]
def m2 = [ b:1, c:3 ]
def m3 = [ *:m1, *:m2 ]

println "m1 = $m1"
println "m2 = $m2"
println "m3 = $m3"

*Credit:http://mrhaki.blogspot.ch/2009/09/groovy-goodness-spread-operator.html

The code above does not work in groovysh but it is fine in the groovy console. (for version 1.8)

answered 2013-01-09T13:23:01.950

Your Answer