【问题标题】:Ruby - Iterating over a Nested Hash and counting valuesRuby - 迭代嵌套哈希并计算值
【发布时间】:2011-10-18 00:42:03
【问题描述】:

尽管有很多关于嵌套哈希的问题,但我没有找到任何解决问题的方法。

我正在拉入字符串并将每个字符与哈希匹配,如下所示:

numberOfChars = {}
string.each_char do |c|
    RULES.each do |key, value|
        if c === key
            numberOfChars[value] += 1
        end
    end
end

这很好,会输出类似“a 出现 3 次”的内容,直到我意识到我的哈希需要嵌套,类似于:

RULES = {
    :limb {
        :colour {
            'a' => 'foo',
            'b' => 'bar'
        },         
        'c' => 'baz'
    }
}

那么我将如何获得“叶”键及其价值?

在迭代哈希时,它还需要计算每个键出现的次数,例如'a' 出现的次数比 'b' 多吗?如果是这样,请添加一个新哈希。但是我很不知道它在实践中是如何工作的,不知道它将如何迭代嵌套哈希。

在我看来,这样做是一种过于复杂的方式,但如果有人得到任何指点,他们将不胜感激!

另外,如果还不是很清楚我是 Ruby 新手,那么我可能会犯一些基本错误。

【问题讨论】:

  • 您使用的是什么版本的 ruby​​? (ruby -v) 当我尝试使用您的 RULES 示例时,Ruby 会抱怨。
  • 见下面的例子。您在 RULES 设置中缺少一个 cmets。
  • @NoahClark 我使用的是 1.9.2,不过你是对的,在那个示例中我确实错过了一个逗号,我已经对其进行了编辑以包含它。
  • 我认为它可能会抱怨的原因是因为我们使用了不同版本的 ruby​​。 1.9 与以前的版本不同。如果下面的答案回答了您的问题,您应该接受它。如果您不这样做,那么人们将来回答您的问题的可能性就会降低。
  • 你试过使用递归吗?这至少可以让你访问叶节点。

标签: ruby hash nested


【解决方案1】:

你在寻找这样的东西吗?

RULES = {
  :limb => {
    :colour => {
      'a' => 'foo',
      'b' => 'bar'
    },
    'c' => 'baz',
    :color => {
      'b' => 'baz'
    }
  }
}

def count_letters(hash, results = {})
  hash.each do |key, value|
    if value.kind_of?(Hash)
      count_letters(value, results)
    else
      results[key] = (results[key] || 0) + 1
    end
  end
  results
end

p count_letters(RULES)

【讨论】:

  • 嗨@TuteC,非常感谢您的快速回复!我已经实现并对其进行了一些调整,您的计算了一个字符出现在哈希中的次数,而我需要它来 比较 一个字符与哈希中的值(所以如果字符 == 键),如果确实如此,则计算总数。我相信您的解决方案是朝着正确方向迈出的一步,但并不完全正确。我会在接下来的一天左右工作:)干杯!
猜你喜欢
  • 1970-01-01
  • 2019-02-21
  • 2019-08-08
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多