比较两个二维数组

3
我有四个长度不同的二维数组。有没有办法比较它们,以确保没有数组共享一个值?是否有简单的编码方法或可以使用的gem?
为了支持我的问题,以下是一个示例:
array1 = [[2,3],[2,4]]

array2 = [[1,3],[2,3],[3,3]]

array3 = [[5,3],[6,3],[7,3],[8,3],[9,3]]

我希望有一个检查器,能够告诉我array1array2是否拥有相同的元素。
这个可行吗?
2个回答

1
你可以这样做。

代码

def shared_values?(*arr)
  a = arr.map(&:uniq).reduce(:+)
  a.size > a.uniq.size
end

例子

array1 = [[2, 3], [2, 4]]
array2 = [[1, 3], [2, 3], [3, 3]]
array3 = [[5, 3], [6, 3], [7, 3],[8, 3],[9, 3]]
shared_values? array1, array2, array3 #=> true

array1 = [[2, 4]]
shared_values? array1, array2, array3 #=> false  

array1 = [[2, 4], [2, 4]]
shared_values? array1, array2, array3 #=> false

array1 = [[2, 3], [2, 4], [2, 4]]
shared_values? array1, array2, array3 #=> false

解释

对于上面的最后一个例子:

arr = [array1, array2, array3]
  #=> [ [[2, 3], [2, 4], [2, 4]],
  #     [[1, 3], [2, 3], [3, 3]],
  #     [[5, 3], [6, 3], [7, 3], [8, 3], [9, 3]] ]

a = arr.map(&:uniq)
  #=> [ [[2, 3], [2 ,4]],
  #     [[1, 3], [2, 3], [3, 3]],
  #     [[5, 3], [6, 3], [7, 3], [8, 3], [9, 3]] ]
b = a.reduce(:+)
  #=>   [[2, 3], [2, 4], [1, 3], [2, 3], [3, 3],
  #      [5, 3], [6, 3], [7, 3], [8, 3], [9, 3]]
c = b.uniq
  #=>   [[2, 3], [2, 4], [1, 3],         [3, 3],
  #      [5, 3], [6, 3], [7, 3], [8, 3], [9, 3]]
b.size > c.size
  # 10 > 9 #=> true

"

arr.map(&:uniq)与以下代码相同:

"
arr.map { |a| a.uniq }

a.reduce(:+)使用了Enumerable#reduce的形式,该形式接受一个符号作为参数,指定要应用于arr每个元素的方法名称,结果是由构成b元素的三个数组的总和。


1
如果数组格式一致,比如都是数字而不是混合浮点数和字符串,你可以这样做:
array1 & array2
# => [[2, 3]]

这意味着测试它们是否重叠:
(array1 & array2).any?

如果您可以确保所有数组中的元素都是唯一的,那么您可以快速测试是否存在任何重复项:
sum = array1 + array2 + array3 + array4
sum.length == sum.uniq.length

如果每个数组可能包含重复项,则需要将它们配对并比较所有可能的A与B。

2
有关 & 的文档,请参阅 http://www.ruby-doc.org/core-2.1.5/Array.html#method-i-26 - Leo Correa
卓越的解决方案。顺便说一下,它可以在具有混合类型元素的数组上工作。唯一需要的是每个元素都具有#hash和#eql?。数字和字符串都可以正常工作。 - Wayne Conrad
1
OP说有四个数组。你不需要进行六次成对比较吗? - Cary Swoveland
如果数组本身可能有重复项(未指定),则需要 sum = array1.uniq + ... - Cary Swoveland
@CarySwoveland 我很喜欢你在这里提出的解决方案,但你可能需要更好地解释一下你的代码。它很简洁,这很好,但对于初学者来说也很难阅读。 - tadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接