1

我有一个hash像这样的哈希:

hash = {"Addaptive Accessibility"=>["one","two"],

        "Atmosphere (Feeling/Safety)"=>["three", "four"],

        "Aquatics (Size)"=>["five", "six"]}

然后我有一个数组array

array = ["one","seven"]

我需要在我的数组中搜索每个单词的哈希,如果找到这个单词,我需要key从哈希中返回相关的。像这样的东西:

array.each do |word|
  if hash.include? word
    puts key
  end
end

我怎样才能写出来,并且写得更好?

4

3 回答 3

3

为了回答您最初的问题,我将提出另一个我认为最容易理解的解决方案:

hash.find{|k,v| v.include? word }.first

这只会迭代直到找到匹配项,即您可能会节省几个周期。与@ArupRakshit 的解决方案相反,这只会找到第一个匹配项。

但是,我必须强调,您确实在错误的方向使用哈希 - 只需翻转键和值!

于 2013-10-20T11:06:02.457 回答
2

这怎么样 ?

hash.select{ |_,v| v.any?{|e| array.include? e } }.keys
# => ["Addaptive Accessibility"]
hash.select{ |_,v| v.any?(&array.method(:include?)) }.keys
# => ["Addaptive Accessibility"]
于 2013-10-19T18:38:15.047 回答
1
hash.keys.select {|k| !(array & hash[k]).empty?}
  • array & hash[k]array是由和共有的元素组成的数组hash[k]
  • 我们只关心这个“交叉点”是否为空([])。
  • 我们可以使用(array & hash[k]).any?更简单的 ,前提是您永远没有键 falsenil,因为[nil, false].any?=> false。
于 2013-10-19T20:50:49.320 回答