私のプロジェクトでは、データベースからレコードを選択し、特定の時間範囲内の最新のレコードと同時期に発生したレコードでグループ化したいと考えています。
たとえば、時間範囲が 1 時間の場合。ユーザーが午後 4:30 から午後 5:15 の間に 3 つの投稿、午後 1:15 から午後 1:30 の間に 2 つの投稿、および午前 10:00 に 1 つの投稿を作成した場合、次のような構造を作成したいと思います。
user.posts.find(:all).group_by do |post|
# (posts have a created_at column containing both a date and time)
# Algorithm here
end
結果:
[
[Tue March 31 5:15pm, [post6,post5,post4]]
[Tue March 31 1:30pm, [post3,post2]]
[Tue March 31 10:00am, [post1]]
]
これを行うのに最適なアルゴリズムについて何か考えはありますか? Ruby を知らなくても、疑似コードでも問題ありません。
編集:ありがとうジョエル。これが私が最終的に使用したコードです(投稿の代わりにフィード):
def aggregate(feeds, timeLimit)
return [] if feeds.blank?
result = []
bin = []
feeds = feeds.sort_by { |f| -f.created_at.to_i }
bin_time = feeds.first.created_at
feeds.each do |feed|
if (bin_time - feed.created_at) < timeLimit
bin << feed
else
result << [bin_time, bin]
bin_time = feed.created_at
bin = [feed]
end
end
result << [bin_time, bin]
result
end