a = [1,2,3,4,5,6,7,8]
b = [1,9,10,11,12,13,14,15]
a
陣列具有1
和b
陣列具有1
太。所以他們有相同的元素。
如何比較它們並返回true
或false
與紅寶石?
a = [1,2,3,4,5,6,7,8]
b = [1,9,10,11,12,13,14,15]
a
陣列具有1
和b
陣列具有1
太。所以他們有相同的元素。
如何比較它們並返回true
或false
與紅寶石?
路口可以得到使用&運營商。如果你需要得到類似的元素成兩列,取相交爲
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
檢查a & b
爲空:
a & b
# => [1]
(a & b).empty?
# => false
如果每個數組的許多元素,做一個路口(&
)可以是一個昂貴的操作。我認爲這將是更快的「手」去:
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包含了許多重複」),您可以進一步優化操作(例如,通過調用uniq
或compact
第一,取決於你的數據)。
看到實際的基準會很有趣。
編輯
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?{}
)。
非常感謝。你的回答也很好。但是我不知道'&'能花多少錢?也許這種方法比'each'和'include'花費的時間要多。 –
查看給定場景的基準:)如此,使用您的給定數據很容易。無論如何,如果你有很多數據和性能是一個問題,那麼這樣的優化只會讓你感覺到不知所措。否則,選擇對你更好的東西。 – Felix
非常好的答案。非常感謝你!這是測試哪種方法更好的好方法。當數組太大時,似乎'&'是非常昂貴的。 –
@JakeGould是的。他們是一樣的。但這裏有不同的答案。 –
這裏發佈的答案與其他問題100%相同。沒有什麼新的提供。 – JakeGould
爲什麼急於選擇答案。快速選擇可能會阻礙其他答案,對於那些仍在尋找答案的人來說,他們是無禮的。重點是:不急。 –