如何合并来自两个哈希的数据并记住原始数据来自哪个哈希?

Ecn*_*lyr 0 ruby hash ruby-on-rails

我有两个哈希:

skills => {"Slice"=>9, "Kick"=>2, "Angle"=>1, "Topspin"=>1, "Shorten Backswing"=>1, "Balance"=>1}
categories => {"Serve"=>8, "Forehand"=>7}
Run Code Online (Sandbox Code Playgroud)

我需要返回与两个列表中最大的三个值相关联的键.我还需要跟踪密钥来自哪个哈希.

最终我需要上面两个哈希来产生:

"Slice"=>9, "Serve"=>8, "Forehand"=>7
Run Code Online (Sandbox Code Playgroud)

并且不知何故需要知道这Slice是一种技能,Serve而且Forehand是类别.也许是这样的:

"Slice"=>[9, "skill"], "Serve"=>[8, "category"], "Forehand"=>[7, "category"]
Run Code Online (Sandbox Code Playgroud)

我认为这样做的一种有效方法是将值更改为数组,其中第一个对象是我的整数值,第二个对象是技能或类别:

skills => {"Slice"=>[9, "skill"], "Kick"=>[2, "skill"], "Angle"=>[1, "skill"], "Topspin"=>[1, "skill"], "Shorten Backswing"=>[1, "skill"], "Balance"=>[1, "skill]}
categories => {"Serve"=>[8, "category"], "Forehand"=>[7, "category]}
Run Code Online (Sandbox Code Playgroud)

然后合并两个:

all_objects => {"Slice"=>[9, "skill"], "Kick"=>[2, "skill"], "Angle"=>[1, "skill"], "Topspin"=>[1, "skill"], "Shorten Backswing"=>[1, "skill"], "Balance"=>[1, "skill"], "Serve"=>[8, "category"], "Forehand"=>[7, "category"]}
Run Code Online (Sandbox Code Playgroud)

然后使用在数组的第一个对象中具有最高值的散列键返回对象,然后使用第二个值来声明对象是技能还是类别.

然而,这变得非常麻烦,感觉我错过了一些更优雅的方式来完成类似的任务.

Ste*_*fan 7

我可能会尝试面向对象的方法.就像是:

class Base
  attr_accessor :name, :value

  def initialize(name, value)
    @name, @value = name, value
  end

  def inspect
    "#<#{self.class} name=#{name.inspect} value=#{value.inspect}>"
  end
end

class Skill < Base
end

class Category < Base
end

skills = [Skill.new("Slice", 9), Skill.new("Kick", 2), Skill.new("Angle", 1), Skill.new("Topspin", 1), Skill.new("Shorten Backswing", 1), Skill.new("Balance", 1)]
categories = [Category.new("Serve", 8), Category.new("Forehand", 7)]

(skills + categories).sort_by(&:value).reverse.first(3)
#=> [#<Skill name="Slice" value=9>, #<Category name="Serve" value=8>, #<Category name="Forehand" value=7>]
Run Code Online (Sandbox Code Playgroud)