2

{"P1" => "ABC", "R1" => "15", "P2" => "LOP", "R2" => "22"} を変換する必要
があります。ハッシュ キーの順序は任意です。

たとえば、{"P1" => "ABC"、"R2" => "22"、"R1" => "15"、"P2" => "LOP"} または {"R1" => の場合もあります。 "15", "R2" => "22", "P1" => "ABC", "P2" => "LOP"}

この {"ABC" => "15", "LOP" => "22 "}

キー間のマッチャーは数字です。
{P1.value => R1.value、P2.value => R2 を探しています。

私が現在行っている方法は、最初のハッシュをループして {1 => 'ABC', 2 => 'LOP'} のようなハッシュを作成し、{1 => "15", 2 => "22 "}。

次に、最初の新しいハッシュをループし、キーを使用して 2 番目のハッシュを照合し、最終的なハッシュを作成します。{"ABC" => "15", "LOP" => "22"}

もっと洗練された解決策があると確信していますが、思いつきません。

4

3 に答える 3

3

Kernel#Hashを確認してください。これは、任意の数のPn/Rnで機能します。

h = {"P1" => "ABC", "R2" => "22", "R1" => "15", "P2" => "LOP"}
Hash[*h.sort_by { |k, v| [k[1..-1].to_i, k[0]] }.map { |k, v| v }]
#=> {"ABC"=>"15", "LOP"=>"22"}

キーの順序にトリックがない、よりオーソドックスなアプローチ:

groups = h.group_by { |k, v| k[1..-1].to_i }
Hash[groups.map do |id, pairs|
  h2 = Hash[pairs]
  h2.values_at("P#{id}", "R#{id}")
end]
#=> {"ABC"=>"15", "LOP"=>"22"}
于 2013-03-19T10:16:00.983 に答える
1

もう1つのオプション:

Hash[h.keys.grep(/P\d+/).map {|k| [h[k], h[k.tr('P','R')]] }]
于 2013-03-19T10:53:11.367 に答える
0
h = {"P1" => "ABC", "R2" => "22", "R1" => "15", "P2" => "LOP"}
Hash[*h.sort_by{|k, _| [k[/\d+/].to_i, k[/\D+/]]}.map(&:last)]
于 2013-03-19T10:41:21.213 に答える