首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算两个哈希之间的三角?

如何计算两个哈希之间的三角?
EN

Stack Overflow用户
提问于 2014-11-08 11:32:37
回答 3查看 125关注 0票数 1

我想为我的数据计算三角值。我已经尝试过HashDiff gem来比较散列。

代码语言:javascript
复制
a = {"Lima, Peru"=>"83", "Chicago, IL"=>"35"}
b = {"Lima, Peru"=>"80", "Chicago, IL"=>"40", "Krakow, Poland" => '3'}

CalculateDelta.new(a,b).execute

代码语言:javascript
复制
b = {"Lima, Peru"=>"-3", "Chicago, IL"=>"5", "Krakow, Poland" => '3'}

甚至更好

代码语言:javascript
复制
b = {"Lima, Peru"=>["-", "3"], "Chicago, IL"=>["+", "5"], "Krakow, Poland" => ["+", '3']}

我已经写过这样的东西了

代码语言:javascript
复制
class CalculateDeltas < Struct.new(:a, :b)
  def calculate
    aa = a.to_a
    ba = b.to_a
    c = aa + ba
    c.group_by(&:first).map{|k,v| [k, v.map(&:last).inject(:+)]}
  end
end
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-08 11:43:59

像这样吗?:

代码语言:javascript
复制
class CalculateDelta
  attr_reader :source, :target
  def initialize(source, target)
    @source = source
    @target = target
  end

  def execute
    target.each_with_object({}) do |(k, v), result|
      result[k] = if source[k]
        source_value, v = source[k].to_i, v.to_i
        source_value > v ? ['-', "#{source_value - v}"]: ['+', "#{v - source_value}"]
      else
        ['+', v]
      end
    end
  end
end

a = {"Lima, Peru"=>"83", "Chicago, IL"=>"35"}
b = {"Lima, Peru"=>"80", "Chicago, IL"=>"40", "Krakow, Poland" => '3'}

puts CalculateDelta.new(a,b).execute
#=> {"Lima, Peru"=>["-", "3"], "Chicago, IL"=>["+", "5"], "Krakow, Poland"=>["+", "3"]}
票数 2
EN

Stack Overflow用户

发布于 2014-11-08 14:21:10

保持简单:

代码语言:javascript
复制
b.keys.each { |k| b[k] = (b[k].to_i-a[k].to_i).to_s if a.key?(k) }
b #=> {"Lima, Peru"=>"-3", "Chicago, IL"=>"5", "Krakow, Poland" => "3"}

请注意,规范是对b进行变异。

进一步简化是可能的,但我不建议:

代码语言:javascript
复制
b.keys.each { |k| b[k] = (b[k].to_i-a[k].to_i).to_s }
b

我听到有人反对a[k] = nil,如果a没有密钥k。是的,但是nil.to_i => 0。:-)

票数 1
EN

Stack Overflow用户

发布于 2014-11-08 11:47:05

Hash.new().tap{|h| b.each{|k,v| h[k] = v.to_i}; a.each{|k,v| h[k] -= v.to_i}}

返回{"Lima, Peru"=>-3, "Chicago, IL"=>5, "Krakow, Poland"=>3}

编辑使此代码仅返回散列中的字符串:

代码语言:javascript
复制
Hash.new().tap{|h| b.each{|k,v| h[k] = v.to_i}; a.each{|k,v| h[k] -= v.to_i}}.
  tap{|h| h.each{|k,v| h[k] = h[k].to_s }}

返回{"Lima, Peru"=>"-3", "Chicago, IL"=>"5", "Krakow, Poland"=>"3"}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26816653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档