不同大小的数组之和

我有一个数组,其元素是不同大小的数组,例如:

[[45, 96, 0.0, 96, 96, 96, 0.0], [04, 55, 06, 55, 04, 04, 02, 55]] 

我想找到两个数组的总和,即

 [49, 151, ...] 

你可以使用这样的东西:

 a.flat_map{|x| x.in_groups_of(a.max_by(&:size).size, 0)}.transpose.map(&:sum) 

或这个:

 a.max_by(&:size).map.with_index{|_, i| a.sum{|x| x[i]||0}} 

不是很漂亮,但有效:

 >> a = [[45, 96, 0.0, 96, 96, 96, 0.0], [04, 55, 06, 55, 04, 04, 02, 55]] => [[45, 96, 0.0, 96, 96, 96, 0.0], [4, 55, 6, 55, 4, 4, 2, 55]] >> sorted_a = a.sort_by(&:size).reverse => [[4, 55, 6, 55, 4, 4, 2, 55], [45, 96, 0.0, 96, 96, 96, 0.0]] >> zipped_a = sorted_a.first.zip(sorted_a.last) => [[4, 45], [55, 96], [6, 0.0], [55, 96], [4, 96], [4, 96], [2, 0.0], [55, nil]] >> zipped_a.map{ |arr| arr.map{ |v| v || 0 } }.map(&:sum) => [49, 151, 6.0, 151, 100, 100, 2.0, 55] 

首先,您必须对从zip开始最长的数组进行排序才能正常工作。 然后,压缩将在较短arrays的冗余值中创建nil值。 所以下一步是将这些nil替换为零(使用嵌套map ),最后你可以对这些值sum

你也可以尝试这种方式

 k =[] for i in 0..ar.max_by(&:size).length-1 do k << ar.map { |x| [x[i]] } end k.map(&:flatten).map{|a| a.compact.sum} => [49, 151, 6.0, 151, 100, 100, 2.0, 55] 
 a = [[45, 96, 0, 96, 96, 96, 0], [ 4, 55, 6, 55, 4, 4, 2, 55]] Array.new(a.max_by(&:size).size) { |i| a.reduce(0) { |t,e| t+e[i].to_i } } #=>[49, 151, 6, 151, 100, 100, 2, 55] 

请注意, nil.to_i #=> 0 ( ref )。

另一个例子:

 a = [[1], [2,3,4], [5,6]] Array.new(a.max_by(&:size).size) { |i| a.reduce(0) { |t,e| t+e[i].to_i } } #=> [8,9,4]