#ruby #hash
Вопрос:
Я пытаюсь написать программу на ruby, чтобы подсчитать, сколько раз значение появляется среди всех значений в хэше. Для этого я создаю метод —
значение count_value(хэш, значение)
def count_value(hash, value)
Hash[hash.group_by { |k, value| value }.map { |k, value| [k, value.count] }]
end
puts count_value(hash, 2)
Но я не получаю реального результата. Я хочу получить результат в этом формате :-
count_value(hash, 2) => 1
count_value(hash, 3) => 1
count_value(hash, 5) => 2
count_value(hash, 10) => 0
Как этого добиться? В чем ошибка, которую я допустил в фрагменте кода?
Комментарии:
1. Ваш метод требует
hash
аргументации. Но вы затеняете его, переназначая его в первой строке метода (hash = {a: 5, b:2, c: 3, d: 5}
).2.
hash.values.count {|v| v == value}
. Однако то, что вы называете все «ценностью», не помогает; это немного усложняет понимание кода 😉3. @max — Если я удалю этот аргумент хэша, то получу такой результат — {5=>2, 2=>>1, 3=>>>1} . что не соответствует тестовым наборам.
4. Спасибо @TomLord — Это сработало .
5. Кроме того, есть небольшой хитрый способ, которым вы могли бы решить эту более сложную проблему «построения списка событий…» — у ruby есть специальный метод, называемый
tally
🙂 Вы могли бы сделать это:hash.values.tally
. Затем, чтобы получить желаемый результат, используйтеhash.values.tally[value] || 0
Ответ №1:
h = {a: 5, b:2, c: 3, d: 5}
value_to_be_counted = 5
p h.count{|k, v| v == value_to_be_counted } # => 2
Ответ №2:
Попробуйте выполнить приведенный ниже код:
def get_hash_dup_count(hash_data)
arr_elem_count = Hash.new(0)
hash_values = hash_data.values
puts "Hash values are : #{hash_values}"
hash_values.each do |v|
arr_elem_count[v] = 1
end
return arr_elem_count
end
def count_value(hash_data, value)
arr_val_count = get_hash_dup_count(hash_data)
puts arr_val_count[value]
end
hash_data = {
"x" => 1,
"y" => 2,
"z" => 1,
"k" => 0
}
count_value(hash_data, 2)