我有两个哈希:
skills => {"Slice"=>9, "Kick"=>2, "Angle"=>1, "Topspin"=>1, "Shorten Backswing"=>1, "Balance"=>1} categories => {"Serve"=>8, "Forehand"=>7}
我需要返回与两个列表中最大的三个值相关联的键.我还需要跟踪密钥来自哪个哈希.
最终我需要上面两个哈希来产生:
"Slice"=>9, "Serve"=>8, "Forehand"=>7
并且不知何故需要知道这Slice
是一种技能,Serve
而且Forehand
是类别.也许是这样的:
"Slice"=>[9, "skill"], "Serve"=>[8, "category"], "Forehand"=>[7, "category"]
我认为这样做的一种有效方法是将值更改为数组,其中第一个对象是我的整数值,第二个对象是技能或类别:
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]}
然后合并两个:
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"]}
然后使用在数组的第一个对象中具有最高值的散列键返回对象,然后使用第二个值来声明对象是技能还是类别.
然而,这变得非常麻烦,感觉我错过了一些更优雅的方式来完成类似的任务.
我可能会尝试面向对象的方法.就像是:
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>]