Ruby中查询嵌套哈希及按语言快速检索哈希的方法
在Ruby中查询嵌套哈希及按语言快速检索的方法
嘿,我来帮你搞定这个嵌套哈希查询的问题!
一、基础嵌套哈希查询方式
嵌套哈希的查询其实很灵活:
- 如果你知道明确的层级路径,直接链式访问键就行,比如想拿德国的税率,写
COUNTRIES["DE"][:tax_rates]就能得到[19,7]。 - 要是需要动态筛选符合条件的条目,就像你已经用到的
select方法,它会遍历所有键值对,返回满足条件的子集——这也是你用货币检索的思路,非常正确。
二、按语言检索的实现方法
你的COUNTRIES里,:languages是一个数组,所以不能直接用==判断,得用数组的include?方法来检查目标语言是否在数组中。比如要找包含"en-us"的国家,代码可以这么写:
COUNTRIES.select { |country_code, country_data| country_data[:languages].include?("en-us") }
执行后会返回{"US"=>{:currency=>"USD", :tax_rates=>[10], :languages=>["en-us"]}},和你用货币检索的结果格式一致。
三、最快的按语言检索方法
如果需要频繁按语言查询,每次用select遍历整个哈希的效率会很低(尤其是当哈希条目很多的时候)。最优方案是预先构建一个反向映射哈希,把语言作为键,对应的国家信息作为值,这样查询就能达到O(1)的时间复杂度:
# 预先构建语言到国家的映射表 LANGUAGE_TO_COUNTRY = COUNTRIES.each_with_object({}) do |(code, data), mapping| # 遍历每个国家的语言列表,给每个语言绑定对应的国家信息 data[:languages].each do |lang| mapping[lang] = { country_code: code, **data } end end # 之后查询直接通过语言键取值,速度极快 LANGUAGE_TO_COUNTRY["en-us"] # 返回结果:{:country_code=>"US", :currency=>"USD", :tax_rates=>[10], :languages=>["en-us"]}
这个映射表只需要初始化一次,之后每次查询都是直接取值,比每次遍历高效太多。
内容的提问来源于stack exchange,提问作者Tintin81
相关产品推荐
相关产品推荐

