例如:
a = [1,2,3,4,5,6,7,8]
b = [1,9,10,11,12,13,14,15]
a
数组1
和b
数组也有1
。所以他们有相同的元素。
如何比较它们并将true
或false
与ruby一起返回?
答案 0 :(得分:3)
检查a & b
是否为空:
a & b
# => [1]
(a & b).empty?
# => false
答案 1 :(得分:0)
如果每个数组有很多元素,那么执行交集(&
)可能是一项昂贵的操作。我认为“手动”会更快:
def have_same_element?(array1, array2)
# Return true on first element found that is in both array1 and array2
# Return false if no such element found
array1.each do |elem|
return true if array2.include?(elem)
end
return false
end
a = [*1..100] # [1, 2, 3, ... , 100]
b = a.reverse.to_a # [100, 99, 98, ... , 1]
puts have_same_element?(a, b)
如果您事先了解更多信息(例如“array1包含许多重复内容”),您可以进一步优化操作(例如,首先调用uniq
或compact
,具体取决于您的数据)。
看到实际的基准测试会很有趣。
修改强>
require 'benchmark'
Benchmark.bmbm(10) do |bm|
bm.report("by hand") {have_same_element?(a, b)}
bm.report("set operation") { (a & b).empty? }
end
Rehearsal -------------------------------------------------
by hand 0.000000 0.000000 0.000000 ( 0.000014)
set operation 0.000000 0.000000 0.000000 ( 0.000095)
---------------------------------------- total: 0.000000sec
user system total real
by hand 0.000000 0.000000 0.000000 ( 0.000012)
set operation 0.000000 0.000000 0.000000 ( 0.000131)
因此,在这种情况下,看起来好像“手工”方法真的更快,但它的非常草率的基准测试方法表达能力有限。
另外,请参阅@CarySwoveland关于使用集合,正确的基准测试和使用find
的快速表达的优秀评论(detect
会做同样的事情并且表现力更强 - 但要小心谨慎返回找到的值 - 如果您的数组包含假名值,例如nil
(或false
)... ;您通常希望在此使用any?{}
。
答案 2 :(得分:-1)
两个数组的交集可以使用&运营商。如果需要在两个数组中获取相似的元素,请将“交叉”作为
a = [1,2,3,4,5,6,7,8]
b = [1,9,10,11,12,13,14,15]
并采取交叉点
u = a & b
puts u
# [1]
u.empty?
# false