2009-03-05 7 views
2

J'ai un tableau d'événements et je veux les diviser en un tableau bidimensionnel basé sur event_date (qui retourne un objet Time). Mais je veux que ce soit une partie de la date. Voici ce que j'ai jusqu'à présent:Quelle est la meilleure façon de trier par date?

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 

Des suggestions pour le rendre plus simple ou plus rapide?

Répondre

2

Pour commencer, vous pouvez essayer quelque chose comme ceci:

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 

Il ne produit pas de jours vides, mais autre que le vôtre qui suit d'assez près .

J'ai une méthode Time#date sur ma machine, mais je ne vois pas dans une construction de distribution propre (1.8.7), vous devrez peut-être ajouter quelque chose comme:

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

meilleure approche que la mienne , devrait être ==, aussi ne vous devez pas ajouter le code à la répartition par jour de l'année ... –

+0

Date Heure # date est juste la partie entière. Hmmm. Ce n'est pas en pioche, mais ça marche pour moi. Je me demande si cela fait partie d'une extension que j'ai chargée, ou standard mais plus récente que mon livre d'arbre mort ... – MarkusQ

+0

@ sambo99 Merci d'avoir attrapé ceux-ci; Je suis multitâche et être un peu négligé sur les tâches secondaires. J'ai appliqué les corrections et vous donne crédit dans le changelog. – MarkusQ

1

Cela devrait être plus rapide:

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