【问题标题】:issue with sum of values for similar keys in rubyruby中类似键的值总和问题
【发布时间】:2013-04-22 09:25:23
【问题描述】:

我有以下数组

[["a", " 3"], ["a", " 5"], ["b", " 5"], ["c", " 2"], ["a", " 5"], ["a", " 5"], [
"b", " 4"], ["c", " 1"], ["c", " 2"], ["d", " 3"]]

我希望得到以下输出

[["a", "18"], ["b", "9"], ["c", " 5"], ["d", "3"]]

18 表示键 'a' 和所有值的总和 3+5+5+5

我有以下代码

ary.group_by{|a, b| a}

我得到以下输出

{"a"=>[["a", " 3"], ["a", " 5"], ["a", " 5"], ["a", " 5"]], "b"=>[["b", " 5"], [
"b", " 4"]], "c"=>[["c", " 2"], ["c", " 1"], ["c", " 2"], ["c", " 3"]]}

我尝试在按键对它们进行分组后进行合并,然后在合并后对值求和,但出现错误!你能指出我正确的方向吗..

谢谢!

【问题讨论】:

    标签: ruby arrays hashmap


    【解决方案1】:

    使用函数式方法:

    pairs.group_by(&:first).map do |key, groups|
      [key, groups.map { |k, v| v.to_i }.reduce(:+)]
    end 
    #=> [["a", 18], ["b", 9], ["c", 5], ["d", 3]]
    

    使用Facets

    require 'facets'
    pairs.map_by { |k, v| [k, v.to_i] }.map { |k, vs| [k, vs.reduce(:+)] }
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      A = [["a", " 3"], ["a", " 5"], ["b", " 5"],
           ["c", " 2"], ["a", " 5"], ["a", " 5"],
           ["b", " 4"], ["c", " 1"], ["c", " 2"],
           ["d", " 3"]]
      
      hash = A.reduce(Hash.new(0)) do |acc, (k, v)|
        acc[k] += v.to_i
        acc
      end
      
      array = hash.map { |k, v| [k, v.to_s] }
      
      p array
      
      # => [["a", "18"], ["b", "9"], ["c", "5"], ["d", "3"]]
      

      【讨论】:

        【解决方案3】:
        array = [["a", " 3"], ["a", " 5"], ["b", " 5"], ["c", " 2"], ["a", " 5"], 
                 ["a", " 5"], ["b", " 4"], ["c", " 1"], ["c", " 2"], ["d", " 3"]]
        
        array.each_with_object(Hash.new(0)) do |ar,hash|
          hash[ar.first] += ar.last.to_i
        end.map { |k,v| [k, v.to_s] }
        
        #=> [["a", "18"], ["b", "9"], ["c", "5"], ["d", "3"]]
        

        【讨论】:

          【解决方案4】:

          这是我的猜测:

          ary.inject({}) { |init, (k,v)| init[k] = init[k].to_i + v.to_i; init }.to_a
          

          你会得到[["a", 18], ["b", 9], ["c", 5], ["d", 3]]

          值是整数,但如果需要,您可以将它们转换回字符串。

          【讨论】:

            【解决方案5】:
            grouped = ary.group_by{|a, b| a}
            result = grouped.map do |key, value|
              sum_over_arrays = value.map do |sub_arr|
                sub_arr.last.to_i # get only the second element and transform it in integer
              end.inject(:+) # sum over the resulting array of integer
              [key, sum_over_arrays] # return the new mapping [key, sum]
            end
            

            【讨论】:

              猜你喜欢
              • 2021-12-11
              • 1970-01-01
              • 2017-05-17
              • 2012-07-18
              • 2020-05-25
              • 2021-05-17
              • 2015-02-27
              • 1970-01-01
              • 2016-05-02
              相关资源
              最近更新 更多