作業予定表から週単位で作業量を積み上げる どう書く?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.SUNDAY、Calendar.WEEK_OF_YEARなどの定数は、ソースの先頭で以下の分を記述することでクラスの指定を省略できて、ちょっと見やすくなる。
import static java.util.Calendar.*
ディスカッション
コメント一覧
こんにちは。
new Date().format(“yyyy/MM/dd”)なんてあるんですね。便利ですね。
ちょっと調べてみたら、
Date date = Date.parse(‘yyyy/MM/dd’, ‘2009/02/03’)
ってのもあるみたいでこちらも便利。