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"]また、 の値が2 番目のパラメータと等しいかどうかが存在する場合、つまり["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

それを行う方法がありますkey

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

あなたがしていることは、ハッシュの目的/パフォーマンスを無効にしているようです。

トップレベルのキーとして、一意の名前「ID」、「TITLE」、「FIRST_NAME」を使用する必要があります。数字の 1 ~ 5 は未使用のようです。

キーによるハッシュ マップの検索は高速ですが、配列に対して線形検索を行うよりもすべての値を配列にマップする必要があります。

于 2012-10-23T12:23:10.580 に答える