2014-11-23 121 views
1

我需要你的建议在以下情况下如何将年份列表按月份分组?

我有日期

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] } 

如何创建一个映射,因为我所描述

感谢您的时间

回答

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