2013-04-22 125 views
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"]]} 

我試着做合併由鍵將它們分組後,然後在合併後的值相加,但我得到一個錯誤!你能指點我嗎?

謝謝!

回答

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(:+)] } 
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 
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]]

值爲整數,但你可以根據需要將其轉換回字符串。

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