这非常慢,因为 - 正如 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
由于您没有提供任何示例数据,因此我没有测试代码。
我希望这会有所帮助。