2014-03-27 3 views
3

에서 요소를 일치하는 모든 배열을 수집 나는루비 : 2 차원 배열

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

보이는 2 차원 배열을 가지고 어떻게 든 일치하는 모든 문자열을 수집하고 관련 배열의 정수를 요약하고자합니다. 예를 들어 I 출력이

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 [this one] (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]]