问题与红宝石
问题描述:
类似键的值的总和我有以下阵列问题与红宝石
[["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"]]}
我试着做合并由键将它们分组后,然后在合并后的值相加,但我得到一个错误!你能指点我吗?
谢谢!
答
与功能的方法:
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(:+)] }
答
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
答
这是我的猜测是:
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]]
值为整数,但你可以根据需要将其转换回字符串。
答
你可以这样说:
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"]]
答
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"]]