【发布时间】:2013-07-26 22:58:14
【问题描述】:
有没有更好的方法来做到这一点? 我有两个哈希数组,我想得到一个哈希数组,其中日期重叠,版本设置为交集(即 version1_for_arr1 && version1_for_arr2)。
arr1 是
[{:day=>day1, :version1=>true, :version2=>false, :version3=>true},
{:day=>day3, :version1=>false, :version2=>false, :version3=>true},
{:day=>day4, :version1=>true, :version2=>false, :version3=>false},
{:day=>day5, :version1=>true, :version2=>true, :version3=>true},
{:day=>day10, :version1=>true, :version2=>true, :version3=>true},
{:day=>day15, :version1=>true, :version2=>false, :version3=>false}]
arr2 是
[{:day=>day1, :version1=>false, :version2=>false, :version3=>true},
{:day=>day2, :version1=>false, :version2=>false, :version3=>true},
{:day=>day4, :version1=>true, :version2=>true, :version3=>false},
{:day=>day5, :version1=>false, :version2=>true, :version3=>true},
{:day=>day15, :version1=>true, :version2=>false, :version3=>false}]
在这种情况下,最终的数组将是:
[{:day=>day1, :version1=>false, :version2=>false, :version3=>true},
{:day=>day4, :version1=>true, :version2=>false, :version3=>false},
{:day=>day5, :version1=>false, :version2=>true, :version3=>true},
{:day=>day15, :version1=>true, :version2=>false, :version3=>false}]
我能想到的唯一方法是嵌套迭代,即
days=[]
arr1.each do |d1|
arr2.each do |d2|
if d1[:day]==d2[:day]
days<<Hash.new(:day=>d1, :version1=>(d1[:version1]&&d2[:version1], :version2=>(d1[:version2]&&d2[:version2], :version3=>(d1[:version3]&&d2[:version3])
end
end
end
但是,当它被扩展并且阵列变得非常大时,它似乎非常昂贵。它正在迭代 n^n 次。
我确实在 rassoc 和 assoc 上看到了 http://rosettacode.org/wiki/Loop_over_multiple_arrays_simultaneously#Ruby,但看起来它们需要是数组内部的数组,我稍后将生成的哈希用作哈希。
有没有更好的方法来做到这一点?我不断提出其他想法,但当我真正检查它们时,它们都会回到两个嵌套迭代。
【问题讨论】:
-
你能解释一下这个数据是什么吗?每个散列和每个数组都有明显的模式,这意味着您可以(并且可能应该)将它们转换为类。
-
每个数组代表一个搜索词的出现(我们让人们搜索最多两个词),每个哈希是该搜索词的出现属于的日期对象,可能是也可能不是包含在几个版本(标准和/或几个其他选项)中的每一个中,由版本布尔值表示。我不明白将它们作为类(或它们将在哪里去)将如何工作。这只是搜索算法的一小部分。我正在尝试获取两个搜索词相交的每一天的日期和版本。
标签: ruby-on-rails arrays hash iteration