1

给定一个哈希 -

hash = { 
         1 => {"ID"         => ["NUMBER", 11]   }, 
         2 => {"TITLE"      => ["VARCHAR2", 5]  },
         3 => {"FIRST_NAME" => ["VARCHAR2", 50] }, 
         4 => {"LAST_NAME"  => ["VARCHAR2", 50] },         
         5 => {"BIRTH_DATE" => ["DATE", -2]     }
       }  

和 2 个输入参数 -"FIRST_NAME"["VARCHAR2",50].

最优雅的做法是什么 -

  1. 检查是否"FIRST_NAME"作为任何嵌套哈希的键存在。
  2. 如果它的值hash[3]["FIRST_NAME"]是否等于第二个参数即存在["VARCHAR2",50]
  3. 如果这 2 个参数匹配,则返回其值为该嵌套哈希的键,即在这种情况下为 3

目前我执行以下操作 -

array = hash.values.map {|h| h.to_a}.flatten(2)
puts hash.key(Hash["FIRST_NAME",["VARCHAR2",50]]) if !(index = array.index("FIRST_NAME")).nil? ? array[index+1] == ["VARCHAR2",50] : false # 3
4

3 回答 3

1

似乎您所做的事情违背了哈希的目的/性能。

您应该使用(我假设)唯一名称“ID”、“TITLE”、“FIRST_NAME”...作为您的顶级键;数字 1-5 似乎未使用。

按键搜索哈希映射很快,必须将所有值映射到数组中,而不是对数组进行线性搜索很慢。

于 2012-10-23T12:23:10.580 回答
1

你会发现很多信息在你检查hash api

a = 'FIRST_NAME'
b = ['VARCHAR2', 50]

hash.each do |k, v|
  if v.key?(a)            # ①
    return k if v[a] == b # ② and ③
  end
end

实际上,您也可以将其编写如下,因为如果它不包含密钥,它将永远不会匹配,只会转到下一次出现。

hash.each do |k, v|
  return k if v[a] == b
end

您的示例仅显示一对哈希,如果您需要做更多的新eachon v

于 2012-10-23T12:32:11.203 回答
1

有一种方法key可以做到这一点:

hash.key({"FIRST_NAME" => ["VARCHAR2",50]}) # => 3
于 2012-10-23T19:31:09.757 回答