【发布时间】:2011-01-25 22:19:59
【问题描述】:
我有一个类似于下面示例的多维数组,我想使用 Ruby 的 zip 方法将其组合在一起。当每个内部数组具有相同数量的元素时,我可以正常工作,但是当它们的长度不同时会遇到问题。
在下面的示例中,第二组在 00:15 缺少一条记录。 我该如何填写这个缺失的记录?
我在考虑什么差距?
这是构成 差距。看看我的第一个代码 我有评论的样本 差距在 00:15。所有其他的 数组有一个哈希 时间戳,所以我认为这是一个 “缺失记录”或“差距”。这 时间戳真的可能是其他的 唯一的字符串,所以他们 相隔15分钟是无关紧要的。 这些值也无关紧要。
想到的唯一方法是对数组进行两次循环。第一次是构建一个 uniq 时间戳数组,第二次是填写不存在时间戳的缺失记录。我对这种方法的编码很自在,但它似乎有点笨拙,而 Ruby 似乎总是以优雅而简洁的解决方案让我感到惊讶。
我从这个开始:
values = [
[
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => 2},
{:timestamp => "2011-01-01 00:30", :value => 3}
],
[ # There's a gap here at 00:15
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:30", :value => 3}
],
[
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => 2},
{:timestamp => "2011-01-01 00:30", :value => 3}
]
]
我想以此结束:
values = [
[
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => 2},
{:timestamp => "2011-01-01 00:30", :value => 3}
],
[ # The gap has been filled with a nil value
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => nil},
{:timestamp => "2011-01-01 00:30", :value => 3}
],
[
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => 2},
{:timestamp => "2011-01-01 00:30", :value => 3}
]
]
当所有数组大小相同时,values.transpose 会产生:
[
[
{:value=>1, :timestamp=>"2011-01-01 00:00"},
{:value=>1, :timestamp=>"2011-01-01 00:00"},
{:value=>1, :timestamp=>"2011-01-01 00:00"}
],
[
{:value=>2, :timestamp=>"2011-01-01 00:15"},
{:value=>nil, :timestamp=>"2011-01-01 00:15"},
{:value=>2, :timestamp=>"2011-01-01 00:15"}
],
[
{:value=>3, :timestamp=>"2011-01-01 00:30"},
{:value=>3, :timestamp=>"2011-01-01 00:30"},
{:value=>3, :timestamp=>"2011-01-01 00:30"}
]
]
【问题讨论】:
-
更清楚地定义什么是“差距”。它是否对时间戳时间进行了一些检查以确定这一点?价值?还有什么?
-
好问题本。我用关于什么构成差距的解释更新了我的问题。希望这会有所帮助。