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

时间:2014-11-23 17:23:09

标签: 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 datesGroupedByYear = dates.groupBy { it[Calendar.YEAR] }

如何创建我描述的地图

感谢您的时间

1 个答案:

答案 0 :(得分:2)

您可以通过向groupBy调用添加闭包来添加更多组。日历的MONTH是一个(从0开始),所以在那里添加一个。接下来,您希望使用计数填充整月,即按结果分组的大小()。这将在每个月收集超过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