Ruby - перебор вложенного хэша и подсчет значений - PullRequest
0 голосов
/ 17 октября 2011

Несмотря на то, что было много вопросов по вложенным хэшам, я не нашел решения для моей проблемы.

Я тяну строки и сопоставляю каждый символ с хэшем, например:

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'
    }
}

Так как же мне получить 'лист "ключ, и это значение?

Хотя он выполняет итерации по хешу, ему также необходимо подсчитать, сколько раз появляется каждый ключ, например, «а» больше, чем «b»?Если это так, добавьте новый хэш.Но я довольно растерялся относительно того, как это будет работать на практике, не зная, как оно будет перебирать вложенный хеш для начала.

Мне кажется, это слишком запутанный способ сделать это, но еслиу кого-нибудь есть какие-нибудь указатели, которые они будут очень благодарны!

Кроме того, если это не до боли ясно, я новичок в Ruby, поэтому я, вероятно, делаю некоторые фундаментальные ошибки.

1 Ответ

3 голосов
/ 17 октября 2011

Вы ищете что-то подобное?

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)
...