Ruby:从2d数组中收集具有匹配元素的所有数组

时间:2014-03-27 09:55:06

标签: ruby multidimensional-array

我有一个看起来像

的二维数组
array = [["apples", 11], ["oranges", 3], ["bananas", 7], ["oranges", 4], ["apples", 6], ["oranges", 9]]

我想以某种方式收集所有匹配的字符串并对相关数组中的整数求和。 例如,我希望输出看起来像

totals_array = [["apples", 17], ["oranges", 16], ["bananas", 7]]

我并没有以某种方式做到这一点,但却无法想出一个巧妙的方法来做到这一点。 任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:4)

你可以这样做:

array = [["apples", 11], ["oranges", 3], ["bananas", 7], ["oranges", 4], ["apples", 6], ["oranges", 9]]

totals_array = array.reduce(Hash.new(0)) { |h, s| h[s[0]] += s[1]; h }.to_a

totals_array = array.each_with_object(Hash.new(0)) { |(name,count),hash| hash[name] += count }.to_a

答案 1 :(得分:3)

我会这样做:

array.group_by(&:first).map { |k,v| [k,v.map(&:last).inject(:+)] }
# => [["apples", 17], ["oranges", 16], ["bananas", 7]]

答案 2 :(得分:-1)

我想这样做: -

array.map{|a| [a[0], array.inject(0){|sum, e| e[0] == a[0] ? 
sum + e[1] : sum}]}.uniq
#=>[["apples", 17], ["oranges", 16], ["bananas", 7]]