2014-11-23 123 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