在Ruby中搜索子字符串和返回键的哈希值
我有一个数组:在Ruby中搜索子字符串和返回键的哈希值,ruby,arrays,hash,Ruby,Arrays,Hash,我有一个数组: array=[“一个够了”,“两个是一对”,“牛肉在哪里?”,“一”] 然后我有一个散列: hash = {"one" => "Defined", "two" => "Test" } 我需要在数组中的每个对象上循环,并查看该对象是否包含在散列键中找到的子字符串。如果找到它,它应该返回散列值。否则,它应该返回未定义的。最终目标是创建一个如下所示的数组: final_array=[“已定义”、“测试”、“未定义”、“已定义”] 如何有效地编
array=[“一个够了”,“两个是一对”,“牛肉在哪里?”,“一”]
然后我有一个散列:
hash = {"one" => "Defined",
"two" => "Test"
}
我需要在数组
中的每个对象上循环,并查看该对象是否包含在散列
键中找到的子字符串。如果找到它,它应该返回散列
值。否则,它应该返回未定义的。最终目标是创建一个如下所示的数组:
final_array=[“已定义”、“测试”、“未定义”、“已定义”]
如何有效地编写该循环?以下是一种方法:
array = ["One is enough", "Two is a couple", "Where's the beef?", "One"]
hash = {"one" => "Defined","two" => "Test"}
array.map{|e| hash.find(proc{["undefined"]}){|k,v| e.downcase.include? k}.last}
# => ["Defined", "Test", "undefined", "Defined"]
说明:
是个好主意。正如doc所说-将枚举中的每个条目传递给块。返回块不为false的第一个条目。如果没有对象匹配,则调用ifnone并在指定时返回其结果,否则返回nil。
我使用了Array#map
,并将每个元素字符串传递给块。现在在块内我调用了#find
onhash
。现在hash。find
将每个键/值
对传递给哈希。find
方法块。在该块内我调用string.\include>方法one
,pa使用key作为#include?
方法的参数。如果#include?
测试结果true
,则返回该迭代的key/value
,否则将执行默认参数proc{[“undefined”]}。调用
希望有帮助
hash = {"one" => "Defined", "two" => "Test"}
array = ["One is enough", "Two is a couple", "Where's the beef?", "One"]
hash.default = "Undefined"
keys = hash.keys
array.map {|a| hash[(a.split.map(&:downcase) & keys).first]}
- 如果哈希不包含键“k”,则哈希[k]=>“未定义”
- a、 split.map(&:downcase)更改,例如,a=“一个足够”到“一个足够”
- 与关键点的交点分别等于[“一”]、[“两”]、[nil]、“一”]
- 。首先是从1元素数组中提取哈希键
- 在计算的哈希键处计算哈希值,哈希值[nil]=>“未定义”(默认值)
非常有效-您有没有可能解释一下这种方法的原理?我必须更好地使用和理解这些一行程序。