2015-09-08 126 views
1

例如:如何檢查兩個數組中是否有相同的元素?

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

a陣列具有1b陣列具有1太。所以他們有相同的元素。

如何比較它們並返回truefalse與紅寶石?

+0

@JakeGould是的。他們是一樣的。但這裏有不同的答案。 –

+0

這裏發佈的答案與其他問題100%相同。沒有什麼新的提供。 – JakeGould

+1

爲什麼急於選擇答案。快速選擇可能會阻礙其他答案,對於那些仍在尋找答案的人來說,他們是無禮的。重點是:不急。 –

回答

-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 
+0

完全相同的確切答案只是輕微的格式更改發佈在這裏。 http://stackoverflow.com/questions/2603895/how-can-i-check-if-a-ruby-array-includes-one-of-several-values – JakeGould

+2

你已經發布了[這個答案](http: //stackoverflow.com/a/32450709/477037),無需複製它。 – Stefan

3

檢查a & b爲空:

兩個數組的
a & b 
# => [1] 
(a & b).empty? 
# => false 
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) 

如果你知道更多的事前(如「數組1包含了許多重複」),您可以進一步優化操作(例如,通過調用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優秀的評論關於使用套,適當的基準和使用finddetect會做同樣的和更有表現恕我直言,迅捷的表達 - 但小心,因爲它返回找到的價值 - 如果你的數組包含虛假的值,如nil(或false)...;您一般要在這裏使用any?{})。

+0

非常感謝。你的回答也很好。但是我不知道'&'能花多少錢?也許這種方法比'each'和'include'花費的時間要多。 –

+0

查看給定場景的基準:)如此,使用您的給定數據很容易。無論如何,如果你有很多數據和性能是一個問題,那麼這樣的優化只會讓你感覺到不知所措。否則,選擇對你更好的東西。 – Felix

+0

非常好的答案。非常感謝你!這是測試哪種方法更好的好方法。當數組太大時,似乎'&'是非常昂貴的。 –

相關問題