2015-10-04 81 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