Reputation: 383
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:
Thanks!
Upvotes: 0
Views: 95
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