【问题标题】:In a Hash where every value is an array, how to find a key using an array item?在每个值都是数组的哈希中,如何使用数组项找到键?
【发布时间】:2014-06-06 08:46:37
【问题描述】:

我有一个哈希。其中,每个键的值都是一个数组。我想测试一个值是否在其中一个数组中,如果是,它对应于哪个键。例如,假设我正在编写一个带有命令列表的命令行程序,并且每个命令都有一些昵称,如下所示:

commands = {
  :exit => ['exit', 'ex'],
  :start_car => ['start_engine', 'start'],
  :accelerate => ['speed_up', 'accelerate'],
  :help => ['help', '?']
}

所以如果我想启动汽车,我可以输入start_enginestart,两者都可以。

假设我需要一个函数来测试给定的字符串是否是命令的名称。如果没有,请返回false。如果是,则返回命令的名称,如下所示:

def is_command? string
  if # string is a nickname
    # return the key to which it belongs, i.e. 'ex' to :exit
  else
    return false
  end
end

我尝试浏览哈希和数组的函数列表,但我找不到任何东西,我什至无法开始考虑如何在谷歌上搜索类似的东西。非常欢迎任何帮助。

【问题讨论】:

    标签: ruby arrays hash


    【解决方案1】:

    使用find:

    commands = {:exit => ['exit', 'ex'], :start_car => ['start_engine', 'start'], :accelerate => ['speed_up', 'accelerate'], :help => ['help', '?']}
    commands.find { |key,value| value.include?( '?' ) }
    > [:help, ["help", "?"]] 
    

    【讨论】:

    • 太棒了!十分优雅。我喜欢 Enumerable 和它的相关方法。
    • 这正是我一直在寻找的。非常感谢!
    • 除了,如果这种事情经常发生,应该构建逆哈希以使其更快
    【解决方案2】:

    最好构建一个反向哈希,像这样

    commands = {
      :exit       => ['exit', 'ex'],
      :start_car  => ['start_engine', 'start'],
      :accelerate => ['speed_up', 'accelerate'],
      :help       => ['help', '?'],
    }
    
    command_for = {}
    commands.each_pair do
      | cmd, names |
      names.each { |name| command_for[name] = cmd }
    end
    
    puts command_for['start']
    puts command_for['help']
    puts command_for['?']
    

    输出

    start_car
    help
    help
    

    【讨论】:

    • 我不太明白这是如何工作的,或者顶级解决方案没有做到的。
    • @EdenLandau,高效查找。上面的程序创建了一个哈希,其中键是每个昵称,每个键的值是命令。当您查找“?”时,BAM!,您会得到命令。另一方面,第一个解决方案是遍历每个键的每个数组以寻找匹配项。
    • 我现在明白了。非常感谢,我实施了这个解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 2019-04-19
    • 2012-06-12
    • 2011-12-15
    • 2017-12-10
    • 2018-04-07
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多