【问题标题】:rails, inserting into hash then counting occurrences logicrails,插入哈希然后计算出现逻辑
【发布时间】:2014-11-16 19:19:59
【问题描述】:

我需要创建一个哈希/数组来存储 2 个元素:国家代码和国家出现的次数。

我想审查一些概念逻辑:我想创建一个传递国家列表的辅助方法。然后,我遍历每个国家,并通过一系列 if 语句将国家代码合并到哈希中:

@map_country = Hash.new
if country == "United States" 
    @map_country.merge(:us => ??)

我不太确定如何添加一个计数器来推入散列。任何人都可以帮忙吗?基本上,我想实现“美国”出现的次数。

此外,一旦我完成了这个哈希 - 我想根据计数对每个国家/地区做一些不同的事情。如何从键中提取值?此外,我如何才能获得密钥?

<% if @map_country[:country] > 5 %>
... do this with @map_country...

谢谢!抱歉,如果这令人困惑,但真的可以在这里使用一些帮助。谢谢!

【问题讨论】:

  • 我的回答对 @gitastic 有帮助吗?

标签: ruby-on-rails ruby arrays hash


【解决方案1】:

对我来说,这听起来像是您正在尝试使用 #inject 方法来计算出现次数:

[1] pry(main)> countries = ["United States", "Canada", "United States", "Mexico"]
=> ["United States", "Canada", "United States", "Mexico"]
[2] pry(main)> countries.inject({}) { |hash, ctr| hash[ctr] = hash[ctr].to_i + 1; hash }
=> {"United States"=>2, "Canada"=>1, "Mexico"=>1}

然后说你想用那个哈希做点什么,你可以像这样循环遍历它:

[3] pry(main)> occ = countries.inject({}) { |hash, ctr| hash[ctr] = hash[ctr].to_i + 1; hash }
=> {"United States"=>2, "Canada"=>1, "Mexico"=>1}
[4] pry(main)> occ.each do |country, val|
[4] pry(main)*   if val == 2
[4] pry(main)*     puts "There are two occurences of #{country}"
[4] pry(main)*   end
[4] pry(main)* end
There are two occurences of United States

【讨论】:

    【解决方案2】:

    如果您为此设置使用 Hash(而不是自定义类),那么只需使用 default_proc 自动激活零条目,您只需要一个简单的增量即可:

    @map_country = Hash.new { |h, k| h[k] = 0 }
    if country == 'United States'
      @map_country[:us] += 1
    

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 2016-06-23
      • 2021-03-22
      • 2014-03-28
      • 2017-02-04
      • 2012-04-14
      • 2014-01-14
      • 1970-01-01
      相关资源
      最近更新 更多