从一个大的'访问随机对。哈希

时间:2017-10-03 07:49:01

标签: ruby hash

我想从一个非常大的哈希中访问一对随机的键值。 我检查了this回答,这使我得到了这个解决方案 -

original_hash.to_a.sample(n).to_h

效果很好,但每次调用都会将整个哈希转换为array
对于非常大的hash,有没有其他方法可以有效地完成这项工作?

2 个答案:

答案 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

注意:这将选择单个