按小时将事件列表压缩到容器中,包括;“空白”;容器(Ruby)
假设我有一个以散列形式存储的几个星期内的事件列表,每个事件都有一个按小时将事件列表压缩到容器中,包括;“空白”;容器(Ruby),ruby,algorithm,Ruby,Algorithm,假设我有一个以散列形式存储的几个星期内的事件列表,每个事件都有一个DateTime:date键 我有没有办法把它变成一系列事件,按时间分组。也就是说,第一个条目用于1小时内的事件,第二个条目用于2小时内的事件,以此类推 事件示例列表: e = [ { :date => (DateTime), :name => "event 1" }, { :date => (DateTime), :name => "event 2" } ] 起初,我枚举日期范围内的所有小时
DateTime
:date
键
我有没有办法把它变成一系列事件,按时间分组。也就是说,第一个条目用于1小时内的事件,第二个条目用于2小时内的事件,以此类推
事件示例列表:
e = [ { :date => (DateTime), :name => "event 1" },
{ :date => (DateTime), :name => "event 2" } ]
起初,我枚举日期范围内的所有小时数,并在计算小时数时将匹配的小时数添加到数组中。但对我来说,这似乎非常不象ruby
我通过方法找到了Enumerable#group_,但这只创建了包含事件的小时“容器”,而没有跳过任何事件
是否有一个干净的功能方法来解决这个问题?如果没有,是否有一种优雅的红宝石般的方式
另外,用成对的小时来分组怎么样?如中所示,两小时一组。或每组任意小时数。标准方法是您的朋友,如果h
包含日期时间键和事件作为值,则:
h = {
DateTime.new('2011-06-03 12:34') => 'event one',
DateTime.new('2011-06-11 22:00:00') => 'event two'
}
a = h.each_with_object(Array.new(24) { [] }) { |(k,v), a| a[k.hour - 1].push(v) }
# a is now [[], [], [], [], [], [], [], [], [], [], [], ["event one"], [], [], [], [], [], [], [], [], [], ["event two"], [], []]
最后在a
中有24个条目,每个条目都是一个数组,非空条目将包含事件。您需要使用块形式的Array.new
,以便获得不同的数组作为默认值
如果要将小时分为两个小时:
a = h.each_with_object(Array.new(12) { [] }) { |(k,v), a| a[((k.hour - 1) / 2).to_i].push(v) }
# a is now [[], [], [], [], [], ["event one"], [], [], [], [], ["event two"], []]
然后,您可以轻松地将a
的索引转换为输出上的时间范围
进一步的概括留给读者作为练习
如果您坚持使用1.8,而不是在Rails环境中,那么您可以通过以下方式获得相同的结果:
但是块的参数顺序不同,块必须返回数组。你能提供一个样本散列吗?在1.9.2中,每个带\u对象都可以在没有Rails的情况下使用()。@steenslag:因此,第一句中的“如果你坚持使用1.8或者你不在Rails环境中”和链接。我错过什么了吗?或者这一点可能更清楚一些。@steenslag:我将“1.8或你是”替换为“1.8和你是”。这样效果更好吗?我想是的。
h.inject(Array.new(24) { [ ] }) { |a, (k,v)| a[k.hour - 1].push(v); a }