3

約 150k 要素のハッシュと 25k 要素の配列があります。キーが配列にないすべての要素を削除するには、新しいハッシュを作成するか、既存のハッシュを変更する必要があります。これが私が今持っているものです:

hash.select {|k,v| array.include?(k)}
new_hash = hash.delete_if {|k,v| !array.include?(k)}

比較が複雑なため、2 つの方法は非常に遅くなります。高速化できる方法はありますか?

4

2 に答える 2

4
(hash.keys - array).each{|k| hash.delete(k)}

または、これはさらに高速な場合があります。

keys_to_be_removed = {}
hash.each{|k, _| keys_to_be_removed[k] = true}
array.each{|k| keys_to_be_removed[k] = false}
keys_to_be_removed.each{|k, v| hash.delete(k) if v}

ポイントは、配列操作を避け、すべてを可能な限りハッシュで行うことです。

于 2013-04-02T18:16:24.033 に答える