Groovy 如何将日期列表按年分组,然后按月分组?

Groovy 如何将日期列表按年分组,然后按月分组?,groovy,Groovy,在下面的场景中,我需要你的建议 我有以下日期清单 def date = new Date() def dates = [date - 350, date - 400, date - 300, date - 50, date] 我需要得到以下地图: [2013:[1:null, 2:5, 3:10,...12:5], 2014:[1:10, 2:30...12:100], ...] 其中年映射为:键为月,值为该月的日期计数 我用这种方式把它按年份分组 def datesGroupedByYea

在下面的场景中,我需要你的建议

我有以下日期清单

def date = new Date()
def dates = [date - 350, date - 400, date - 300, date - 50, date]
我需要得到以下地图:

[2013:[1:null, 2:5, 3:10,...12:5], 2014:[1:10, 2:30...12:100], ...]
其中年映射为:键为月,值为该月的日期计数

我用这种方式把它按年份分组

def datesGroupedByYear = dates.groupBy { it[Calendar.YEAR] }
如何创建我描述的地图


感谢您抽出时间

您可以通过向
groupBy
调用添加闭包来添加更多组。日历的月份减少了一个(从0开始),所以在那里添加一个。接下来,您要用count填充整个月份,这是group by results的size()。每月将收集超过1..12次(正确的顺序,缺失组的
null

def date = new Date()
def dates = [date-350, date-400, date-300, date-50, date-3, date-2, date]

def result = dates.groupBy{it[Calendar.YEAR]}{it[Calendar.MONTH]+1}.collectEntries{ o->
    [o.key, (1..12).collectEntries{
        [it, o.value.get(it)?.size()] 
    }]
}
println result
//; [2013:[1:null, 2:null, 3:null, 4:null, 5:null, 6:null, 7:null, 8:null, 9:null, 10:1, 11:null, 12:1], 2014:[1:1, 2:null, 3:null, 4:null, 5:null, 6:null, 7:null, 8:null, 9:null, 10:1, 11:3, 12:null]]
assert result[date[Calendar.YEAR]][date[Calendar.MONTH]+1]==3