2014-03-27 87 views
3

匹配元素我有一個二維數組,看起來像紅寶石:收集所有陣列與來自2D陣列

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

,我想以某種方式收集所有匹配的字符串,並在相關聯的陣列求和整數。 比如我想輸出看起來像

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

我不是一個辦法做到這一點剋制,但不能想出一個巧妙的方法來做到這一點。 任何幫助,將不勝感激。

回答

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 
+0

'each_with_object'我喜歡這個.. :-) –

+0

你想'array.each_with_object(Hash.new(0)){|(name,count),hash | hash [name] + = count} .to_a'? –

+1

@ArupRakshit謝謝,補充說,版本:) – xdazz

3

我會怎麼做:

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

這正是我一直在尋找的。謝謝。 – user70434

+0

@ user70434與[這一個]去(http://stackoverflow.com/a/22684081/2767755)..我的速度較慢.. –

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