Программа Ruby для подсчета количества раз, когда значение появляется среди всех значений в хэше

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