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}
使用該代碼,您遍歷散列一次即可創(chuàng)建新的散列,并且后續(xù)的散列查找非常有效。使用原始代碼,您可以遍歷字符串中每個字母的整個哈希值。

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
似乎您想要一個不區(qū)分大小寫的搜索,因此我同時調用upcase了這兩個數據源。如果text保證小寫或哈希值保證大寫,則可以刪除其中之一。與現(xiàn)有答案相比,它的一個好處是它僅進行搜索,直到找到匹配的值為止,我認為這就是您想要的。nil如果找不到匹配的值,則返回搜索。
添加回答
舉報