2012-02-17 18 views

Respuesta

11

que podría hacerlo de esta manera:

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

Primero coloque las matrices junto con + ya que no le importan a y b, solo se preocupa por sus elementos. Luego, el group_by divide la matriz combinada por el primer elemento para que las matrices internas se puedan trabajar fácilmente. Luego solo tiene que extraer los segundos (o últimos) elementos de las matrices internas con v.map(&:last) y sumarlos con inject(:+).

Por ejemplo:

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

Un trazador de líneas agradable, más una buena explicación de cómo funciona, gracias. – Agush

8

También puede hacerlo la forma de hash:

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

En este caso particular 'Hash [* a.flatten]' es lo mismo que 'Hash [a]', solo que este último es más rápido, supongo. –

+0

Gracias! Tienes razón. Edité la respuesta – alf

+0

¡Por supuesto, no pensé en convertirlos en hashes, gracias! – Agush