Ruby中如何基于自定义相等规则求两个数组的交集?
基于共享属性获取Ruby数组元素对的交集
Ruby内置的Array#intersection(或&运算符)默认是通过元素完全相等来计算交集的,它的块参数用法并不是用来定义两个数组元素的匹配规则——块的作用是对已经初步判定为交集的元素做二次筛选,所以你示例里的写法得不到预期结果。
要实现基于共享属性匹配两个数组的元素对,需要用方法组合来实现,这里提供两种常用方式:
方法一:用product + select
适合数组规模较小的场景,逻辑直观:
arr1 = ["A1", "A2", "A3"] arr2 = ["B3","B4","B5"] arr1.product(arr2).select { |a, b| a[1] == b[1] } # => [["A3", "B3"]]
product会生成两个数组的笛卡尔积,再通过select筛选出符合共享属性条件的元素对。
方法二:分组匹配(更高效)
如果数组元素较多,推荐先对其中一个数组按共享属性分组,再遍历另一个数组匹配,时间复杂度更低:
arr1 = ["A1", "A2", "A3"] arr2 = ["B3","B4","B5"] # 先把arr2按共享属性(第二个字符)分组 grouped_arr2 = arr2.group_by { |item| item[1] } # 遍历arr1,找到对应的匹配项 arr1.each_with_object([]) do |item, result| matched_items = grouped_arr2[item[1]] result << [item, matched_items.first] if matched_items end # => [["A3", "B3"]]
简单来说,Ruby没有内置直接生成这种元素对交集的方法,需要通过上述方法组合实现,根据数组规模选择合适的方式即可。
内容的提问来源于stack exchange,提问作者etirta
相关产品推荐
相关产品推荐

