あるRubyハッシュに他のものに存在しないキーが存在するかどうかを調べる高速(または最速の方法)とは何ですか?私は、ハッシュがこれを行うための最も効率的なデータ構造であると仮定していますが、私はSetに物事を入れるなどの何かのために開いています。それがために高速ですようあるハッシュのキーが別のハッシュに存在しないかどうかを確認します。
hash1.keys - hash2.keys
あなたの結果は、hash2
あるRubyハッシュに他のものに存在しないキーが存在するかどうかを調べる高速(または最速の方法)とは何ですか?私は、ハッシュがこれを行うための最も効率的なデータ構造であると仮定していますが、私はSetに物事を入れるなどの何かのために開いています。それがために高速ですようあるハッシュのキーが別のハッシュに存在しないかどうかを確認します。
hash1.keys - hash2.keys
あなたの結果は、hash2
a = { :a => 1, :b => 2 , :v => 3}
b = { :a => 3, :b => 22 , :g => 3}
a.keys - b.keys
#=> [:v]
b.keys - a.keys
#=> [:g]
簡単な方法は何かに似ています私(コーダー)。しかし、あなたは「高速」を要求し、「コンピュータのための高速」を意味するかもしれないので、あなたがこれを呼び出すたびに、両方のキーのセットを完全に歩かなければならないことに気づくべきです。
頻繁にこの操作を行う必要があり、不足している可能性があります任意ののキーがある場合は、あなたが本当に唯一気にする場合は、ような何かがありますが上がらない場合
def same_keys?(a, b)
a.length == b.length && a.keys.all?{ |k| b.key?(k) }
end
をあなたが早期に出します同じ数の鍵を持っておらず、もう一方の鍵に存在しない鍵が見つかるとすぐに早期に鍵を取得します。配列セットの数学を使用したより強力な答えとは異なり、1つのハッシュにいくつのキーまたはキーが存在するかを知ることはできません。
注:私はではありません。は上記のベンチマークテストより速くなることを示しています。配列の計算がCで実装されているとすれば、すべてのキーに対してall?
を呼び出してkey?
メソッドを呼び出すことは、気になる多くのハッシュの違いの完全な配列を取得するよりも遅くなる可能性があります。
@fl00r's answerにないhash1
内のキーは、私が個人的に書くだろうかです: