2009-03-05 30 views
2

Bir Olaylar Dizim var ve bunları, event_date (bir Time nesnesini döndüren) temelinde 2 boyutlu bir Dizilim halinde bölmek istiyorum. Ama günün tarihinin bir parçası olmasını istiyorum. Şimdiye kadar sahip olduğum şeyler:Güne göre sıralama yapmak için daha iyi bir yol nedir?

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 

Daha basit veya daha hızlı yapmak için herhangi bir öneriniz var mı?

cevap

2

, böyle bir şey deneyebilirsiniz .

benim makinede bir Time#date yöntemi var ama temiz bir dağıtım inşasına (1.8.7) 'de bunu göremiyorum, bu yüzden böyle bir şey eklemek gerekebilir: benim daha

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

daha iyi bir yaklaşım , == olmalı, aynı zamanda güne göre arızalara kod eklemeniz gerekmez ... –

+0

Tarih Saat # tarih sadece tüm tarih bölümüdür. Hmmm. Kazma içinde değil, ama benim için çalışıyor. Yüklü veya standart ama benim ölü ağaç kitabımdan daha yeni bir uzantının parçası olup olmadığını merak ediyorum ... – MarkusQ

+0

@ sambo99 Bunları yakalamak için teşekkürler; Ben çoklu görev yapıyorum ve yan görevlerde biraz özensizim. Düzeltmeleri uyguladım ve bu vesileyle size changelog'da kredi verdim. – MarkusQ

1

Bu daha hızlı olması gerekir:

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 
Boş günler üretmez

, ama bunun senin oldukça yakından takip daha:

Başlangıç ​​için
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 
İlgili konular