Ruby - перебор вложенного хэша и подсчет значений
Несмотря на множество вопросов о вложенных хэшах, я не нашел решения своей проблемы.
Я вытягиваю строки и сопоставляю каждый символ хешу так:
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 ответ
Вы ищете что-то подобное?
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)