Hanan Cohen
Hanan Cohen

Reputation: 383

Groovy map - group and sum by two keys

I have this data

Country:"USA", Gender:"Male", Count:100
Country:"USA", Gender:"Male", Count:300
Country:"USA", Gender:"Female", Count:200
Country:"USA", Gender:"Non-binary", Count:50
Country:"France", Gender:"Male", Count:10
Country:"France", Gender:"Female", Count:30
Country:"France", Gender:"Female", Count:10

As you can see, I have several lines with the same combination of Country & Gender.

I need to create a new map - group Country & Gender and sum the Count for this group.

I can arrange the map as I wish –

[Country:"USA", Gender:"Male", Count:100] 
or 
[[Country:"USA", Gender:"Male"]:100]]

My Questions:

  1. How to best create the map for grouping
  2. How to sum the groups

Thanks!

Upvotes: 0

Views: 95

Answers (1)

injecteer
injecteer

Reputation: 20699

Simple groupBy with some additions:

List data = [
[Country:"USA", Gender:"Male", Count:100],
[Country:"USA", Gender:"Male", Count:300],
[Country:"USA", Gender:"Female", Count:200],
[Country:"USA", Gender:"Non-binary", Count:50],
[Country:"France", Gender:"Male", Count:10],
[Country:"France", Gender:"Female", Count:30],
[Country:"France", Gender:"Female", Count:10],
]

Map groupped = data.groupBy{ [ Country:it.Country, Gender:it.Gender ] }

groupped.each{ group, vals -> group.sum = vals*.Count.sum() }

println groupped.entrySet().join( '\n' )

prints

{Country=USA, Gender=Male, sum=400}=[{Country=USA, Gender=Male, Count=100}, {Country=USA, Gender=Male, Count=300}]
{Country=USA, Gender=Female, sum=200}=[{Country=USA, Gender=Female, Count=200}]
{Country=USA, Gender=Non-binary, sum=50}=[{Country=USA, Gender=Non-binary, Count=50}]
{Country=France, Gender=Male, sum=10}=[{Country=France, Gender=Male, Count=10}]
{Country=France, Gender=Female, sum=40}=[{Country=France, Gender=Female, Count=30}, {Country=France, Gender=Female, Count=10}]

You can grab map's keys:

println groupped.keySet().join( '\n' )

you'll get:

[Country:USA, Gender:Male, sum:400]
[Country:USA, Gender:Female, sum:200]
[Country:USA, Gender:Non-binary, sum:50]
[Country:France, Gender:Male, sum:10]
[Country:France, Gender:Female, sum:40]

Upvotes: 3

Related Questions