我正在尝试在ruby中合并两个对象数组。对象有两个相关领域; id 和 reach_cost 。
我希望我的结果数组包含唯一的id,其中每个对象在碰撞的情况下具有最小的reach_cost。
运行;
result = a1 | a2;
产生混合结果, a1 元素优先于 a2 元素。
我当然可以迭代两个数组并手动对 element.reach_cost 进行比较,但这是一个高性能的环境,这个方法被调用了很多。出于这个原因,我试图利用|的本机组件操作
是否可以指导|操作员更喜欢一个对象而不是另一个也许通过重写< =>或者类似的?
我已经阅读了|的源代码docs中的运算符,但它似乎没有进行任何比较,只是优先于第一个数组参数。
答案 0 :(得分:3)
解决方案很简单,但您需要自己检查性能:
result = a1.concat(a2).sort_by!(&:reach_cost).uniq!(&:id)
答案 1 :(得分:2)
我建议将这些数组存储为哈希值。这提供了O(1)id查找。这是代码的样子:
h1 = {'1' => {:val => 2}, '2' => {:val => 3}}
h2 = {'1' => {:val => 5}, '2' => {:val => 1}}
def merge_hashes a, b
a.reduce({}) do |memo, obj|
k, v = obj
# choose element with smallest :val
memo[k] = if b[k][:val] < v[:val]
b[k]
else
v
end
memo
end
end
merge_hashes h1, h2 # => {"1"=>{:val=>2}, "2"=>{:val=>1}}
这应该非常快。
如果你喜欢单行,这里有一个(在评论中由@steenslag友情提供):
h1.merge(h2){|key,old,new| old[:val] < new[:val] ? old : new}