Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了红宝石有效的方式来获取给定值的多个哈希键大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
从给定值获取所有散列键的最有效方式是什么? @H_139_2@my_hash = {"a"=>"aa","b"=>"bb","c"=>"bb"}

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

只返回一个键:

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

这有效但似乎效率不高:

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

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

谢谢!

更新:

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

新结构:

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

解决方法@H_801_28@
稍微快一点 @H_139_2@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.bR_978_11845@bm 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)
#=> ------------------------------------------------ @R_318_10586@l: 10.890000sec
#=> 
#=>                              user     system      @R_318_10586@l        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)

大佬总结

以上是大佬教程为你收集整理的红宝石有效的方式来获取给定值的多个哈希键全部内容,希望文章能够帮你解决红宝石有效的方式来获取给定值的多个哈希键所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。