DigitalRossがすでに述べたように、これはO(n ^ 2)であるため、これは非常に低速です。そのeqlを仮定しますか?==と同じように問題ありません。代わりに、インデックスを作成して繰り返し処理することができます。代わりに、O(n + m)になります。
array1 = [obj1, obj2, obj3, obj4]
array2 = [obj1, obj2, obj5, obj6]
index = {}
found = []
array1.each do |item1| index[item1.first(2)] = item1 end
array2.each do |item2|
item1 = index[item2.first(2)]
found << [item1,item2] if item1 then
end
found.each do |item1, item2| puts "do something" end
これは、array1のすべての要素の最初の2つの要素の組み合わせがarray1内で一意であることを前提としています。そうでない場合、コードは少し複雑になります。
array1 = [obj1, obj2, obj3, obj4]
array2 = [obj1, obj2, obj5, obj6]
index = {}
found = []
array1.each do |item1|
key = item1.first(2)
index[key] ||= []
index[key] << item1
end
array2.each do |item2|
items_from_1 = index[item2.first(2)]
if items_from_1 then
found.concat(items_from_1.map { |item1| [item1,item2] })
end
end
found.each do |item1, item2| puts "do something" end
サンプルデータを提供しなかったため、コードをテストしませんでした。
それがお役に立てば幸いです。