2015-10-04 73 views
1

我想在Ruby中比较两个数组,并打印所有常用元素。使用虚构的“比较”,我想:在Ruby中比较数组并打印常见元素

arr1 = [1, 2, 3, 4, 5] 
arr2 = [1, 3, 5, 7, 9] 

arr1.compare(arr2) #=> [1, 3, 5] 

或迭代的arr1每个元素,并试图找到的arr2任何元素匹配其他一些方法。

回答

5

嗯......不,我是一名法官,以为什么不使用Array#&方法?

Set Intersection - 返回包含两个数组通用元素的新数组,不包括任何重复项。订单从原始数组中保留。

arr1 = [1, 2, 3, 4, 5] 
arr2 = [1, 3, 5, 7, 9] 
arr1 & arr2 # => [1, 3, 5] 
0
arr1 = [1, 2, 3, 4, 5] 
arr2 = [1, 3, 5, 7, 9] 

arr1.each do |x| 
    if (arr2.include?(x)) 
    print "#{x} " 
    end 
end 
0

不优雅的神秘岛的解决方案,但它是值得考虑的问题。

irb(main):001:0> arr1 
=> [1, 2, 3, 4, 5] 
irb(main):002:0> arr2 
=> [1, 3, 5, 7, 9] 
irb(main):003:0> arr1.select{|x| arr2.include?(x)} 
=> [1, 3, 5] 

Cary Swoveland发表评论后,更有效的解决方案。

irb(main):08:0> arr1.select{|x| arr2.to_enum.include?(x)} 
=> [1, 3, 5] 
+3

这是相对低效的,因为'arr2'的元素被'include?'反复枚举。这可以通过将'arr2'转换为一个's2'来检查,并检查是否包含'(x)',因为查找的速度比数组快,但我期望数组相交更快。 –

+0

谢谢爷爷。我将从现在开始更频繁地使用枚举:)我只是在shell上调用方法并随机迭代,直到它适合在该上下文中使用。严格地说,真的不知道,门后发生了什么:) – marmeladze

+0

很酷的想法。我还会从查找中删除任何找到的项目,以节省每次查找的资源...'require'set'; arr2 = arr2.to_set; arr1.select {| X | arr2.delete?(x)}'......不需要重复自己,是吗? ;-) – Myst