2009-03-05 27 views
2

私はイベントの配列を持っていて、event_date(Timeオブジェクトを返す)に基づいてそれらを2次元配列に分割したいと考えています。しかし、私はそれが日付の日の一部であることを望んでいます。これまで私が持っていたことは次のとおりです。曜日の日付順に並べ替えるのにはどのような方法がありますか?

def divide_events_by_day(events) 
    # Sort, so we can start with the first day. 
    events = events.sort { |x,y| x.event_date <=> y.event_date } 
    days = [] 
    current_date = events[0].event_date # A Time object. 
             # With meaningful hours and minutes. 
    while events.length > 0 do 
    # Find events for the current date. 
    day_events = events.select { |e| 
     (e.event_date.year == current_date.year) && 
     (e.event_date.yday == current_date.yday) 
    } 
    # Move them to their subarray. 
    days << day_events 
    events = events - day_events 

    # Advance the current_date by one day. 
    current_date = (current_date + (60 * 60 * 24)) 
    end 
    days 
end 

もっと簡単にするには?

答えて

2

、あなたはこのような何かを試みることができます。

は、私は私のマシンで Time#date方法がありますが、私はきれいな配布ビルド(1.8.7)でそれを見ていないよ、あなたはのようなものを追加する必要があります。私より

class Time 
    def date 
     to_i/(60*60*24) 
     end 
    end 
+0

より良いアプローチ、==でなければなりません。また、年ごとの内訳にコードを追加する必要はありません。 –

+0

日付時刻#日付は日付部分だけです。うーん。ピックアックスにはないが、それは私のために働く。私はそれが私がロードされているいくつかの拡張、または標準だが、私の死んだ木の本よりも新しいのだろうかと思う... – MarkusQ

+0

@ sambo99それらをキャッチするためにありがとう;私はマルチタスクをしています。私は修正プログラムを適用し&ここであなたに変更ログのクレジットを与える。 – MarkusQ

1

これは速くする必要があります:それは空の日生成しませんが、それ以外はかなり密接にあなたの次の

def divide_events_by_day(events) 
    days = [[]] 
    events.sort_by { |x| x.event_date }.each { |e| 
     if days.last.empty? or days.last.event_date_date == e.event_date.date 
      days.last << e 
      else 
      days << [e] 
      end 
     } 
    days 
    end 

:スタートのために

def divide(events) 
    hash = {} 
    events.each do |event| 
    key = "#{event.event_date.year} #{event.event_date.yday}" 
    hash[key] ||= [] 
    hash[key] << event 
    end 
    hash.to_a.sort do|pair1,pair2| 
    pair1[0] <=> pair2[0] 
    end.map do |pair| 
    pair[1].sort{|x,y| x.event_date <=> y.event_date} 
    end 
end 
関連する問題