如哈希a
是{:name=>'mike',:age=>27,:gender=>'male'}
和哈希b
是{:name=>'mike'}
有沒有更好的方法來判斷一個ruby散列是否在另一個散列?
我想知道是否有更好的方法來判斷是否b
哈希散列a
內,而不是每一個鍵一個一個比較?
我找到了一種方法來做到這一點,比比較鍵更有效嗎?
a.merge(B)==一個
如哈希a
是{:name=>'mike',:age=>27,:gender=>'male'}
和哈希b
是{:name=>'mike'}
有沒有更好的方法來判斷一個ruby散列是否在另一個散列?
我想知道是否有更好的方法來判斷是否b
哈希散列a
內,而不是每一個鍵一個一個比較?
我找到了一種方法來做到這一點,比比較鍵更有效嗎?
a.merge(B)==一個
我喜歡計算交叉口,的做法是你想要做什麼:
a = { :a => :b, :c => :d }
b = { :e => :f, :a => :b }
c = { :a => :f, :e => :c }
(a.to_a & b.to_a).any? # => true
(a.to_a & c.to_a).any? # => false
b.all? do |key, value|
a.include? key &&
a[key] == value
end
該循環是在B的大小線性,因爲迴路取(平均)恆定的時間內這兩個步驟。
調用** include **然後** a [key] **使得此代碼非常低效,因爲它試圖找到兩次密鑰。 –
@MaurícioLinhares:訪問哈希是O(1),所以我不明白爲什麼這將是低效的。實際上,我認爲這是最有效的概念代碼(儘管轉換爲數組並將它們相交可能會更快,因爲此交叉點在C中實現)。我會把'include?'改成'has_key?',這更清楚一點。爲什麼要爲第二個條件創建一個新的(縮進)行? – tokland
由於它是一個哈希,比較鍵**是非常有效的**,你不必關心它。 –
此外,合併效率低下,因爲它將在內存中生成** new **哈希,您應該比較鍵。 –
謝謝Mauricio,你是上師! –