2014-02-24 44 views
0

從Date對象數組中創建哈希的最有效方式是月份是鍵和值是日期數組?目前,我有以下幾點。以Month爲鍵創建日期對象數組中的哈希

require 'date' 

... 
start, finish = args.start, args.end # Assume this has been implemented 
date_map = {} 
(start..finish).map do |date| 
    unless date_map.has_key? date.month then date_map[date.month] = [date] 
    else date_map[date.month] << date end 
end 

有沒有更高效的方法來完成上述代碼塊?

回答

2

編輯:剛纔看到@凱爾的答案。很難改善這一點。

你可以寫你這樣的代碼:

date_map = Hash.new { |h,k| h[k] = [] } 
start.upto(finish) { |date| date_map[date.month] << date } 

,或者更簡潔:

date_map = start.upto(finish).with_object(Hash.new { |h,k] h[k] = [] }) \ 
    { |date, h| h[date.month] << date } 

您還會看到它這樣做的方式:

date_map = start.upto(finish).with_object({}) { |date, h| 
    (h[date.month] ||= []) << date } 
+0

你可以寫下你的第一個作爲'start.upto(finish){| date | date_map [date.month] << date}'? [高達](http://ruby-doc.org/stdlib-2.1.0/libdoc/date/rdoc/Date.html#method-i-upto)。 –

+0

是的,更好。 (必須停止做盲目的剪貼。) –

+0

+ 1 for'start.upto(完成)..' –