如何检查两个数组中是否有相同的元素?

时间:2015-09-08 05:29:05

标签: arrays ruby

例如:

a = [1,2,3,4,5,6,7,8]  
b = [1,9,10,11,12,13,14,15]

a数组1b数组也有1。所以他们有相同的元素。

如何比较它们并将truefalse与ruby一起返回?

3 个答案:

答案 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包含许多重复内容”),您可以进一步优化操作(例如,首先调用uniqcompact,具体取决于您的数据)。

看到实际的基准测试会很有趣。

修改

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