将2d阵列进行比较

时间:2014-12-11 17:45:13

标签: ruby arrays multidimensional-array

我有四个不同长度的2d阵列。有没有办法比较它们以确保没有数组共享一个值?是否有一种简单的方法来编写它或我可以使用的宝石?

用一个例子来回答我的问题:

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 个答案:

答案 0 :(得分:1)

如果数组的格式一致,就像所有数字一样,而不是浮点和字符串的混合,你可以这样做:

array1 & array2
# => [[2, 3]]

这意味着要测试它们是否重叠:

(array1 & array2).any?

如果您可以确信所有阵列中的每个元素都是唯一的,那么您可以快速测试是否有任何重复:

sum = array1 + array2 + array3 + array4
sum.length == sum.uniq.length

如果每个阵列可能包含重复项,那么您需要将它们配对,并比较所有可能配对的A和B.

答案 1 :(得分: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

元素的数组