有没有更好的方法来做到这一点? 我有散列值的两个阵列,以及我想获得散列的阵列,其中所述天重叠,与版本设置为交叉点(即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上看到了这个,,但看起来他们需要是数组内部的数组,我后来使用这些散列作为散列。
有没有更好的方法来做到这一点?我不断提出其他想法,但是当我真正研究它们时,它们都会回到两个嵌套迭代。
你能解释一下这个数据是什么?每个哈希和每个数组都有明显的模式,这意味着您可以(也可能应该)将它们转换为类。 – Substantial
每个数组代表一个搜索词(我们让人们搜索最多两个方面)的出现,并且每个散列是天对象搜索项目的一个发生属于并可能会或可能不会被包括在每个几个版本(标准和/或其他几个选项),由版本布尔值表示。我不明白它是如何将它们作为类(或者它们将放在轨道中的位置)。这只是搜索算法的一小部分。我试图获得两个搜索条件相交的每一天的日期和版本。 – ctaymor