【问题标题】:How do I merge data from two hashes and remember which hash the original data came from?如何合并来自两个散列的数据并记住原始数据来自哪个散列?
【发布时间】:2013-12-03 21:17:26
【问题描述】:

我有两个哈希:

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 是一种技能,ServeForehand 是类别。 可能是这样的:

"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"]}

然后返回数组第一个对象中哈希键值最高的对象,然后用第二个值声明该对象是技能还是类别。

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

【问题讨论】:

  • 看来你正在陷入数据结构的地狱。我建议创建一个 Player 类来封装逻辑,为上述行为提供名称,并简化代码。
  • 想想你的问题;听起来您确实在要求我们为您编写代码,但您没有展示您尝试过的内容。 “要求代码的问题必须证明对正在解决的问题有最低限度的了解。包括尝试过的解决方案、它们为什么不起作用以及预期的结果。另请参阅:Stack Overflow question checklist
  • 抱歉,我觉得我现有的代码只会让读者感到困惑,因为它是一团糟(这就是我在这里发布的原因)。也许它会更适合 codereview.stackexchange.com 。

标签: ruby-on-rails ruby hash


【解决方案1】:

我可能会尝试面向对象的方法。比如:

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>]

【讨论】:

  • 你也可以在 Base 中实现 &lt;=&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2019-12-22
相关资源
最近更新 更多