Как мне найти фрагмент текста и извлечь элемент, который совпадает с хешем в Ruby? - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть хеш, заполненный 32 строками имен и местоположений команд НФЛ (например, "Балтиморские вороны", "Питтсбург Стилерс" и т. Д.)

Я пишу класс, называемый def search, которыйпросит пользователя ввести имя команды, а затем запускает цикл while, который просматривает хеш, пытается сопоставить введенную пользователем строку с фрагментом строки в хэше и вернуть полное значение.

Например, если вы введете Ravens, он должен вернуть «Baltimore Ravens»

Я не уверен в правильности того, что нужно ввести в мой код, чтобы взять фрагмент введенной строки и попытаться сопоставить его сполная строка и вернуть результат.Гугл не помог мне ответить на мой вопрос, поэтому я обращаюсь к вам, замечательные люди.

Заранее благодарен за вашу помощь.


Реальный код:

def search(team, nfl)
  favTeam = nfl.find_all { |i| i = team }
  puts favTeam
end

Это печать всех команд в массиве nfl (не хэш, я ошибся).Не совсем уверен, что я должен написать, чтобы заставить его искать team (это то, что пользователь уже ввел), чтобы сравнить его со значениями в массиве.

1 Ответ

3 голосов
/ 05 сентября 2011

Учитывая ваш хеш в h и подстроку, которую вы ищете в s:

key = h.detect { |k, v| v.downcase.index(s.downcase) }.to_a.first

даст вам первый ключ в h, значение которого содержит s (caseнечувствителен).Вызов to_a - это простой способ преобразования возможного возврата nil в пустой массив без дополнительной проверки.

Если вы хотите их все, тогда:

keys = h.find_all { |k, v| v.downcase.index(s.downcase) }.map(&:first)

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

Ссылки:


Обновления в соответствии с обновленным вопросом : Поскольку у вас есть массив вместо хеша:

matches = nfl.find_all { |name| name.downcase.index(team.downcase) }

Вы по-прежнему будете использовать find_all (или select, если вам больше нравится это имя), просто измените аргумент блока, чтобы он соответствовалчто find_all на массиве дает вам.

...