2012-02-17 8 views

Odpowiedz

11

można zrobić to wygląda następująco:

(a + b).group_by(&:first).map { |k, v| [k, v.map(&:last).inject(:+)] } 

Najpierw umieść tablice razem z +, ponieważ nie interesują Cię a i b, zależy ci tylko na ich elementach. Następnie group_by rozdziela połączoną macierz na pierwszy element, dzięki czemu wewnętrzne macierze mogą z łatwością pracować. Następnie musisz wyciągnąć drugi (lub ostatni) element wewnętrznych macierzy przy pomocy v.map(&:last) i zsumować je z inject(:+).

Na przykład:

>> a = [[1,10],[2,20],[3,30]] 
>> b = [[1,50],[3,70]] 
>> (a + b).group_by(&:first).map { |k,v| [k, v.map(&:last).inject(:+)] } 
=> [[1, 60], [2, 20], [3, 100]] 
+2

Przyjemna jedna linijka plus dobre wytłumaczenie, jak to działa, dziękuję. – Agush

8

Można również zrobić to sposób hash:

Hash[a].merge(Hash[b]){|k,a,b|a+b}.to_a 
+2

W tym szczególnym przypadku 'Hash [* a.flatten]' jest tym samym co 'Hash [a]', tylko ten drugi jest szybszy, jak przypuszczam. –

+0

Dzięki! Masz rację. Edytowałem odpowiedź: – alf

+0

Oczywiście, nie myślałem o wrzucaniu ich do haszy, gracias! – Agush