我想从一个非常大的哈希中访问一对随机的键值。 我检查了this回答,这使我得到了这个解决方案 -
original_hash.to_a.sample(n).to_h
效果很好,但每次调用都会将整个哈希转换为array
,
对于非常大的hash
,有没有其他方法可以有效地完成这项工作?
答案 0 :(得分:0)
如果将所有密钥保存在缓存变量中,然后随机访问一个密钥并返回密钥值,则可以选择一个选项。 e.g。
def random_paire(amount: 1)
@keys ||= @large_hash.keys
@keys.sample(amount).map {|key| { key => @large_hash[key] } }
end
但我认为只有在课堂上使用它才能实用。将它用于全球可用的方法并不是一个好的选择。
答案 1 :(得分:0)
你可以先使用随机数生成一个随机数,然后再使用
n = rand(large_hash.count)
new_h = [large_hash.find.with_index { |_h,i| i == n }].to_h
#alternatively new_h = large_hash.find.with_index { |h,i| [h].to_h if i == n }
现在new_h
将是来自Hash
的随机键值对large_hash
,而不会将整个large_hash
转换为Array
。或者更钝的版本:
large_hash.find.with_index.with_object({}) do |((k,v),i),obj|
obj[k] = v if i == n
end
注意:这将选择单个对