Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按小时将事件列表压缩到容器中,包括;“空白”;容器(Ruby)_Ruby_Algorithm - Fatal编程技术网

按小时将事件列表压缩到容器中,包括;“空白”;容器(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 }