在我的项目中,我想从我的数据库中选择记录,然后将它们组合在同一时间范围内与最新记录相似的那些记录中。
例如,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
答案 0 :(得分:1)
基本概念非常简单,将帖子累积到箱子中,然后当时间超出范围时,开始新的箱子。这是一个Python版本:
posts = [('post6', 1715), ('post5', 1645), ('post4', 1630) , ('post3', 1330), ('post2', 1315), ('post1', 1000) ] rslt = [] bin = [] binTime = 1 << 31 for postData, postTime in posts: if (postTime >= binTime - 100): bin.append(postData) else: if bin: rslt.append([binTime, bin]) binTime = postTime bin = [postData] if bin: rslt.append([binTime, bin]) print rslt
答案 1 :(得分:0)
if post.created_at - group_start > limit
output current group if non-empty
set group to current post
set group_start to post.created_at
else
add post to current group
然后,在循环外,如果非空则输出当前组。根据您访问帖子的顺序调整if条件。