0

我有以下数组

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

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

谢谢!

4

5 回答 5

3

你可以这样做:

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"]]
于 2013-04-22T09:33:52.277 回答
3

使用功能方法:

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

使用方面

require 'facets'
pairs.map_by { |k, v| [k, v.to_i] }.map { |k, vs| [k, vs.reduce(:+)] }
于 2013-04-22T09:51:44.473 回答
1
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
于 2013-04-22T09:33:26.293 回答
1

这是我对此的猜测:

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

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

于 2013-04-22T09:33:30.983 回答
1
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"]]
于 2013-04-22T09:36:12.780 回答