作業予定表から週単位で作業量を積み上げる どう書く?orgをといてみた。

作業予定表から週単位で作業量を積み上げる どう書く?orgをといてみた。

かなりスパゲッティになってしまっている。

独力で解こうとしたが弱いおつむがヒートしそうなので、fumokmmさんの解答を参考に。

import static java.util.Calendar.*

def initTasks = [ [start:"2009/1/10", days:21, mark:"#"], [start:"2009/1/15", days: 6, mark:"@"], [start:"2009/1/10", days: 8, mark:"*"], [start:"2009/1/16", days: 1, mark:"="], [start:"2009/1/16", days: 3, mark:"%"], [start:"2009/1/30", days: 4, mark:"="], ]

// 日別のタスクテーブル作成 def eachDayTasks = [:] (new Date("2009/1/1")..new Date("2009/1/31")).each{ date -> eachDayTasks[date] = initTasks.collect{ def start = new Date(it.start) (date in start..<(start+it.days))?it.mark:[] }.flatten() }

// 週別のタスクテーブル def eachWeekTasks = [:] eachDayTasks.groupBy{ key, value -> key[WEEK_OF_YEAR] - (key[DAY_OF_WEEK]==SUNDAY?1:0) }.each{ groupKey, task -> eachWeekTasks[task*.key.min().format(‘MM/dd’)] = task*.value.flatten().sort() }

// 出力 def createLine = { list, num -> list*.center(num).join() } def line = [] line << createLine(eachWeekTasks.keySet(), 6) (0..

結構汚いw

初めて知ったこと

いつもSimpleDateFormatを利用してフォーマット処理を記述していた。

たとえば、

new SimpleDateFormat("yyyy/MM/dd").format(new Date())

みたいに。

groovy1.5.7(から?)ではDate.formatメソッドが使える。

new Date().format("yyyy/MM/dd")

結構便利。

ちょっとしたTips

Calendar.SUNDAYCalendar.WEEK_OF_YEARなどの定数は、ソースの先頭で以下の分を記述することでクラスの指定を省略できて、ちょっと見やすくなる。

import static java.util.Calendar.*