加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

红宝石有效的方式来获取给定值的多个哈希键

发布时间:2020-12-16 19:55:32 所属栏目:百科 来源:网络整理
导读:从给定值获取所有散列键的最有效方式是什么? my_hash = {"a"="aa","b"="bb","c"="bb"} 我想把散列“bb”作为一个输入值,并将它们的所有键(b,c)作为数组返回 只返回一个键: my_hash.index("bb")# returns only b 这有效但似乎效率不高: my_hash.select{|k,
从给定值获取所有散列键的最有效方式是什么?
my_hash = {"a"=>"aa","b"=>"bb","c"=>"bb"}

我想把散列“bb”作为一个输入值,并将它们的所有键(b,c)作为数组返回

只返回一个键:

my_hash.index("bb")
# returns only b

这有效但似乎效率不高:

my_hash.select{|k,v| v == 'bb' }.map{|i| i[0] }
# returns b and c

我已经阅读了所有的文档.我觉得有一些明显的东西我失踪了.

谢谢!

更新:

我结束了切换哈希创建的键和值,并使用数组的值.这是一个更有效的解决方案.如果需要,请参阅下面的最佳方法来进行价值查询.

新结构:

my_hash = {"aa"=>["a"],"bb"=>["b","c"]}

解决方法

稍微快一点
my_hash.map{ |k,v| v=='bb' ? k : nil }.compact

较小的哈希和单个查询的速度较慢.如果需要为多个值请求反向映射,则更快.如果这对您的应用程序很重要,我建议维护一个反向地图.

rev = Hash.new{ |h,k| h[k]=[] }
my_hash.each{ |k,v| rev[v] << k }
rev['bb']

基准测试:

require 'benchmark'
N = 1_000_000
my_hash = {"a"=>"aa","c"=>"bb"}

Benchmark.bmbm do |x|
  x.report('select/map'){ N.times{
    my_hash.select{|k,v|v=='bb'}.map{|i| i[0]}
  }}
  x.report('select/map/destructure'){ N.times{
    my_hash.select{|k,v|v=='bb'}.map{|k,v| k}
  }}
  x.report('map/compact'){ N.times{
    my_hash.map{|k,v|v=='bb' ? k : nil}.compact        
  }}
  x.report('reverse map'){ N.times{
    rev = Hash.new{|h,k|h[k]=[]}
    my_hash.each{ |k,v| rev[v]<<k }
    rev['bb']
  }}
  x.report('reject'){ N.times{
    my_hash.reject{|k,v|v != "bb"}.keys
  }}
end
#=> Rehearsal ----------------------------------------------------------
#=> select/map               1.950000   0.000000   1.950000 (  1.950137)
#=> select/map/destructure   1.960000   0.010000   1.970000 (  1.963740)
#=> map/compact              1.200000   0.000000   1.200000 (  1.197340)
#=> reverse map              3.660000   0.000000   3.660000 (  3.658245)
#=> reject                   2.110000   0.000000   2.110000 (  2.115805)
#=> ------------------------------------------------ total: 10.890000sec
#=> 
#=>                              user     system      total        real
#=> select/map               1.950000   0.000000   1.950000 (  1.948784)
#=> select/map/destructure   1.970000   0.010000   1.980000 (  1.966636)
#=> map/compact              1.190000   0.000000   1.190000 (  1.192052)
#=> reverse map              3.670000   0.000000   3.670000 (  3.664798)
#=> reject                   2.140000   0.000000   2.140000 (  2.135069)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读