我有四个不同长度的2d阵列。有没有办法比较它们以确保没有数组共享一个值?是否有一种简单的方法来编写它或我可以使用的宝石?
用一个例子来回答我的问题:
array1 = [[2,3],[2,4]]
array2 = [[1,3],[2,3],[3,3]]
array3 = [[5,3],[6,3],[7,3],[8,3],[9,3]]
我想要一个能让我知道array1
和array2
元素相同的检查器。
这可行吗?
答案 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
。