3 回答
TA贡献1772条经验 获得超6个赞
这是您的代码的直接翻译(顺便说一句,它与您的描述不匹配):
hash = {
"abc" => 1,
"def" => 2,
}
str = "abcdef"
str.downcase.each_char do |char|
hash.each_pair do |key, val|
puts val if key.include?(char)
end
end
--output:--
1
1
1
2
2
2
但是,这就是O(n ^ 2),这意味着效率低下。您可能最好构造一个更好的哈希值:
hash = {
"abc" => 1,
"def" => 2,
}
new_hash = {}
hash.each_pair do |key, val|
key.each_char do |char|
new_hash[char] = val
end
end
p new_hash
--output:--
{"a"=>1, "b"=>1, "c"=>1, "d"=>2, "e"=>2, "f"=>2}
使用该代码,您遍历散列一次即可创建新的散列,并且后续的散列查找非常有效。使用原始代码,您可以遍历字符串中每个字母的整个哈希值。
TA贡献1883条经验 获得超3个赞
test = "abcdef"
dic = {2 => "ABC", 3 => "DEF"}
test.each_char { |s|
dic.each { |key, val|
puts key if val.include?(s.upcase)
}
}
是你的意思吗?
TA贡献2021条经验 获得超8个赞
text = "abcdef"
hash = {2 => "ABC", 3 => "DEF"}
text.upcase.each_char do |c|
puts hash.keys.find{|k| hash[k].include?(c.upcase)}
end
输出:
2个
2个
2个
3
3
3
似乎您想要一个不区分大小写的搜索,因此我同时调用upcase了这两个数据源。如果text保证小写或哈希值保证大写,则可以删除其中之一。与现有答案相比,它的一个好处是它仅进行搜索,直到找到匹配的值为止,我认为这就是您想要的。nil如果找不到匹配的值,则返回搜索。
添加回答
举报