我想在Ruby中比較兩個數組,並打印所有常用元素。使用虛構的「比較」,我想:在Ruby中比較數組並打印常見元素
arr1 = [1, 2, 3, 4, 5]
arr2 = [1, 3, 5, 7, 9]
arr1.compare(arr2) #=> [1, 3, 5]
或迭代的arr1
每個元素,並試圖找到的arr2
任何元素匹配其他一些方法。
我想在Ruby中比較兩個數組,並打印所有常用元素。使用虛構的「比較」,我想:在Ruby中比較數組並打印常見元素
arr1 = [1, 2, 3, 4, 5]
arr2 = [1, 3, 5, 7, 9]
arr1.compare(arr2) #=> [1, 3, 5]
或迭代的arr1
每個元素,並試圖找到的arr2
任何元素匹配其他一些方法。
嗯......不,我是一名法官,以爲什麼不使用Array#&
方法?
Set Intersection - 返回包含兩個數組通用元素的新數組,不包括任何重複項。訂單從原始數組中保留。
arr1 = [1, 2, 3, 4, 5]
arr2 = [1, 3, 5, 7, 9]
arr1 & arr2 # => [1, 3, 5]
arr1 = [1, 2, 3, 4, 5]
arr2 = [1, 3, 5, 7, 9]
arr1.each do |x|
if (arr2.include?(x))
print "#{x} "
end
end
不優雅的神祕島的解決方案,但它是值得考慮的問題。
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]
這是相對低效的,因爲'arr2'的元素被'include?'反覆枚舉。這可以通過將'arr2'轉換爲一個's2'來檢查,並檢查是否包含'(x)',因爲查找的速度比數組快,但我期望數組相交更快。 –
謝謝爺爺。我將從現在開始更頻繁地使用枚舉:)我只是在shell上調用方法並隨機迭代,直到它適合在該上下文中使用。嚴格地說,真的不知道,門後發生了什麼:) – marmeladze
很酷的想法。我還會從查找中刪除任何找到的項目,以節省每次查找的資源...'require'set'; arr2 = arr2.to_set; arr1.select {| X | arr2.delete?(x)}'......不需要重複自己,是嗎? ;-) – Myst