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 “}。

然后我循环第一个新哈希并使用密钥匹配第二个哈希并创建最终哈希。{"ABC" => "15", "LOP" => "22"}

我确信有一个更优雅的解决方案,但我就是想不出。

4

3 回答 3

3

检查内核#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

另一种选择:

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 回答