Какой лучший способ сортировки по дате? - PullRequest
2 голосов
/ 06 марта 2009

У меня есть Array of Events, и я хочу разделить их на 2-мерный массив на основе event_date (который возвращает объект Time). Но я хочу, чтобы это было к дневной части даты. Вот что у меня есть:

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 ]

2 голосов
/ 06 марта 2009

Для начала, вы можете попробовать что-то вроде этого:

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

Это не производит пустых дней, но кроме этого следует за вами довольно близко.

У меня есть метод Time#date на моей машине, но я не вижу его в сборке чистого дистрибутива (1.8.7), поэтому вам может понадобиться добавить что-то вроде:

class Time
    def date
        to_i/(60*60*24)
        end
    end
1 голос
/ 06 марта 2009

Это должно быть быстрее:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...