gpt4 book ai didi

ruby - 如何从两个哈希数组中获取联合/交叉/差异并忽略一些键

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:38 29 4
gpt4 key购买 nike

我想从两个哈希数组中获取并集/交集/差集,例如:

array1 = [{:name =>'Guy1', :age => 45},{:name =>'Guy2', :age => 45}]
array2 = [{:name =>'Guy1', :age => 45},{:name =>'Guy3', :age => 45}]

...

p array1 - array2 

=> [{:name=>"Guy2", :age=>45}]


p array2 - array1
=> [{:name=>"Guy3", :age=>45}]


p array1 | array2
=> [{:name=>"Guy1", :age=>45}, {:name=>"Guy2", :age=>45}, {:name=>"Guy3", :age=>45}]

然而,当我只想根据名称进行比较而忽略年龄而不需要将它们从哈希中删除时,例如:

array1 = [{:name =>'Guy1', :age => 45},{:name =>'Guy2', :age => 45}]
array2 = [{:name =>'Guy1', :age => 46},{:name =>'Guy3', :age => 45}]

在这种情况下,我没有得到我想要的结果,因为年龄不同。

array1 - array2 

=> [{:name=>"Guy1", :age=>45}, {:name=>"Guy2", :age=>45}]

array2 - array1
=> [{:name=>"Guy1", :age=>46}, {:name=>"Guy3", :age=>45}]

array1 | array2
=> [{:name=>"Guy1", :age=>45}, {:name=>"Guy2", :age=>45}, {:name=>"Guy1", :age=>46}, {:name=>"Guy3", :age=>45}]

有没有办法获取并集/交集/差集并忽略年龄键?

编辑:为了更好的例子:

array1 = [{:name =>'Guy1', :age => 45},{:name =>'Guy2', :age => 45}]
array2 = [{:name =>'Guy1'},{:name =>'Guy3'}]

p array1 - array2
p array2 - array1
p array1 | array2
p array1 & array2

在此先感谢您的帮助!

最佳答案

这是获取联合的一种快速而肮脏的方法:

(array1 + array2).uniq{|a| a[:name]}

但是,我建议创建您自己的 Hash 子类,这样您就可以安全地覆盖 eql?,因为 Cary Swoveland 指出类集合运算符所依赖的是什么。请注意,您还需要限制 hash 方法仅在名称字段上提供哈希函数。

class Guy < Hash

def eql?(other_hash)
self[:name] == other_hash[:name]
end

def hash
self[:name].hash
end

end

然后这些 Guy 对象将在所有集合操作中起作用:

array1 = [ Guy[name:'Guy1', age: 45], Guy[name:'Guy2', age: 45] ]
array2 = [ Guy[name:'Guy1', age: 46], Guy[name:'Guy3', age: 45] ]

array1 - array2
#=> [{:name=>"Guy2", :age=>45}]

array2 - array1
#=> [{:name=>"Guy3", :age=>45}]

array1 | array2
#=> [{:name=>"Guy1", :age=>45}, {:name=>"Guy2", :age=>45}, {:name=>"Guy3", :age=>
45}]

array1 & array2
#=> [{:name=>"Guy1", :age=>45}]

关于ruby - 如何从两个哈希数组中获取联合/交叉/差异并忽略一些键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23555054/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com