Создание динамических имен ключей в хэше Ruby? - PullRequest
1 голос
/ 26 сентября 2019

Я пишу небольшую программу, которая принимает слово (или несколько слов в массиве) и список слов («словарь») в качестве входных данных и возвращает количество раз, когда введенные слова были найдены вСловарь.Результаты должны отображаться в хэше.

В моем коде я перебираю введенные слова и проверяю, входит ли в словарь .include? слово.Затем я добавляю пару ключ / значение в мой хэш, причем ключом является слово, которое было найдено, а значение увеличивается на единицу каждый раз, когда слово встречается в словаре.

Я не вижу явных проблем в моем коде, но в результате я получаю пустой хеш.Этот конкретный пример должен возвращать что-то вроде

{"sit" => 3,
"below" => 1}

Код:

dictionary = ["below","down","go","going","horn","how","howdy","it","i","low","own","part","partner","sit", "sit", "sit"]

def Dictionary dictionary, *words
    word_count = Hash.new(0)
words.each{|word|
if dictionary.include?(word)
word_count[word] += 1
end
}
print word_count
end

Dictionary(dictionary, ["sit", "below"])

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Вы должны удалить оператор splat (*) в определении метода:

def Dictionary(dictionary, words)
  word_count = Hash.new(0)
  words.each do |word|
    word_count[word] += 1 if dictionary.include?(word)
  end
  print word_count
end

Dictionary(dictionary, ["sit", "below"])
# {"sit"=>1, "below"=>1}

Причина в том, что Ruby заключает аргумент words в массив, что делает его [["sit", "below"]]и когда вы повторяете это, вы получаете значение ["sit", "below"] как единственный элемент, и, следовательно, условие возвращает false.


Как указано в NullUserException, результат не соответствует ожидаемому.Для этого вам нужно поменять массив итерируемых слов:

...
dictionary.each do |word|
  word_count[word] += 1 if words.include?(word)
end
...

Вы также можете взглянуть на метод each_with_object.Это очень хорошо подходит для таких случаев:

dictionary.each_with_object(Hash.new(0)) do |word, hash|
  next unless words.include?(word)

  hash[word] += 1 
end
0 голосов
/ 26 сентября 2019

Когда вы используете оператор splat (*), слова params будут принимать все параметры, передаваемые методу, и преобразовывать его в массив,

Это означает, что ваш ["sit", "below"] принимается какпервый элемент массива, и вы получаете [["sit", "below"]] в виде слов.

Вы можете:

  1. удалить оператор splat (*), чтобы массив воспринимался как естьили
  2. Измените аргументы в вызове метода, например Dictionary(dictionary, "sit", "below")

Но, как вы сказали в вопросе, вы хотите иметь возможность указать строку или массив., Я бы продолжил с 1. и удалил оператор splat

Кроме того, вы испортили порядок цикла.Вы должны пройтись по своему словарю и сосчитать экземпляры ваших слов.

def Dictionary dictionary, words
    word_count = Hash.new(0)
    dictionary.each{ |word|
        if words.include?(word)
            word_count[word] += 1
        end
    }
    print word_count
end

Это должно исправить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...