Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中搜索文本块并从哈希中提取匹配的元素?_Ruby_String_Search_Hash_Matching - Fatal编程技术网

如何在Ruby中搜索文本块并从哈希中提取匹配的元素?

如何在Ruby中搜索文本块并从哈希中提取匹配的元素?,ruby,string,search,hash,matching,Ruby,String,Search,Hash,Matching,我有一个包含32个NFL球队名称和位置字符串的散列列表(例如“巴尔的摩乌鸦队”、“匹兹堡钢人队”等) 我正在编写一个名为def search的类,它要求用户输入一个团队的名称,然后运行while循环来查看散列,尝试将用户输入的字符串与散列中的一段字符串匹配,并返回完整值 例如,如果输入Ravens,则应返回“Baltimore Ravens” 我不确定在代码中输入的内容是否正确,以获取输入的字符串片段并尝试将其与完整字符串匹配并返回结果。谷歌搜索没有帮我回答这个问题,所以我转向你们这些伟大的人

我有一个包含32个NFL球队名称和位置字符串的散列列表(例如“巴尔的摩乌鸦队”、“匹兹堡钢人队”等)

我正在编写一个名为def search的类,它要求用户输入一个团队的名称,然后运行while循环来查看散列,尝试将用户输入的字符串与散列中的一段字符串匹配,并返回完整值

例如,如果输入Ravens,则应返回“Baltimore Ravens”

我不确定在代码中输入的内容是否正确,以获取输入的字符串片段并尝试将其与完整字符串匹配并返回结果。谷歌搜索没有帮我回答这个问题,所以我转向你们这些伟大的人

提前感谢你的帮助


实数代码:

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

这是在
nfl
数组中打印所有球队(不是散列,我犯了一个错误)。不完全确定我应该写什么来让它寻找
团队(这是用户已经输入的)来将其与数组中的值进行比较。

考虑到
h
中的散列以及在
s
中查找的子字符串:

key = h.detect { |k, v| v.downcase.index(s.downcase) }.to_a.first
将为您提供
h
中的第一个键,其值包含
s
(不区分大小写)。调用
to_a
只是将可能的
nil
返回转换为空数组而不需要额外检查的一种简单方法

如果你想要全部,那么:

keys = h.find_all { |k, v| v.downcase.index(s.downcase) }.map(&:first)
您可能希望在迭代之前对
s
进行downcase,但对于32个值来说,这并不重要

参考资料:

  • (又名
    查找
  • (又名
    选择

更新以匹配更新的问题:因为您实际上有一个数组而不是散列:

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

您仍然可以使用
find\u all
(或者
select
,如果您更喜欢这个名称,只需调整block参数以匹配数组上
find\u all
提供给您的内容。

考虑到
h
中的哈希值以及在
s
中查找的子字符串:

key = h.detect { |k, v| v.downcase.index(s.downcase) }.to_a.first
将为您提供
h
中的第一个键,其值包含
s
(不区分大小写)。调用
to_a
只是将可能的
nil
返回转换为空数组而不需要额外检查的一种简单方法

如果你想要全部,那么:

keys = h.find_all { |k, v| v.downcase.index(s.downcase) }.map(&:first)
您可能希望在迭代之前对
s
进行downcase,但对于32个值来说,这并不重要

参考资料:

  • (又名
    查找
  • (又名
    选择

更新以匹配更新的问题:因为您实际上有一个数组而不是散列:

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

您仍然可以使用
find_all
(或者
select
,如果您更喜欢这个名称,只需调整block参数以匹配数组上的
find_all
提供给您的内容。

这是我的代码:def search(team,nfl)favTeam=nfl.find_all{i | i=team}将favTeam置于打印nfl数组中所有团队的末尾(不是散列,我犯了一个错误)。不完全确定我应该写什么来让它查找team(这是用户已经输入的)以将其与数组中的值进行比较。因此,这是我的代码:def search(team,nfl)favTeam=nfl.find|all{I | I=team}将favTeam end打印到nfl数组中的所有团队(不是散列,我犯了一个错误)。我不完全确定我应该写什么来让团队(这是用户已经输入的)将其与数组中的值进行比较。