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

2019-09-18Groovy

作業予定表から週単位で作業量を積み上げる どう書く?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.*

2019-09-18Groovy