在Ruby中搜索子字符串和返回键的哈希值

时间:2013-10-20 17:11:26

标签: ruby arrays hash

我有一个数组:

array = ["One is enough", "Two is a couple", "Where's the beef?", "One"]

然后我有一个哈希:

hash = {"one" => "Defined",
        "two" => "Test"
       }

我需要遍历array中的每个对象,看看该对象是否包含hash键中的子字符串。如果找到,则应返回hash值。否则,它应该返回undefined。最终目标是创建一个如下所示的数组:

final_array = ["Defined,"Test","Undefined","Defined"]

如何有效地编写该循环?

2 个答案:

答案 0 :(得分:2)

这是一种方法:

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"]

说明:

Enumerable#find 将是个好主意。正如doc所说 - 通过enum中的每个条目来阻止。返回第一个块不为false的块。 如果没有对象匹配,则调用ifnone并在指定时返回其结果,否则返回nil。

我使用Array#map并将每个元素字符串传递给块。现在在块中,我在#find上调用了hash。现在hash.find将每个key/value对传递给hash.find方法块。在该块中,我在String#include?上调用e方法,将 key 作为参数传递给#include?方法。如果#include?测试结果true,则返回该迭代的key/value,否则将执行默认参数proc{["undefined"]}.call

希望有所帮助!

答案 1 :(得分:0)

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 =“One is Enough”改为“one is enough”
  • 与键的交集分别等于[“one”],[“two”],[nil],[“one”]
  • .first是从1元素数组中提取哈希键
  • 在计算的散列密钥处评估散列,散列[nil] => “未定义”(默认)