二维数组 - sum' row'并添加为数组的新元素

时间:2012-01-10 03:33:09

标签: ruby arrays multidimensional-array

我有一个二维数组,表示数据的列和行。我需要将列和行相加,但我需要从新的“summary”行中总计。

数据(6x5阵列)

[1, 0, 3, 0, 0], 
[0, 4, 0, 0, 4], 
[0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0]

所以结果应该是7x6数组

[1, 0, 3, 0, 0, 4], 
[0, 4, 0, 0, 4, 8], 
[0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0],
[1, 4, 3, 0, 4, 12]

我知道我可以对每一列求和,并通过

在我的二维数组中添加一行
# Sum the columns, add additional one row for summary
a << a.transpose.map{|x| x.reduce(:+)}

但如何添加其他列

2 个答案:

答案 0 :(得分:4)

a.map! {|row| row + [row.reduce(:+)]}

map!获取数组的每个元素,将其传递给块并用该块返回的任何内容替换该元素。因此,既然我们在二维数组上调用它,row将是一个1d数组 - 原始数组的行。

然后我用该行的reduce(:+)计算总和。然后我需要将它追加到那一行。我在这里做的是将sum的结果包装成一个数组,然后使用+来连接这两个数组。

我本可以这样做:

a.map! {|row| row << row.reduce(:+) }

答案 1 :(得分:0)

当我问这个问题时,我想出了一个解决方案,但我想知道是否有更好的方法。

我的解决方案

# Sum the rows (including the new summary row)
row_sum = a.map{|x| x.reduce(:+)}

# transpose the original array, add the summary column as a new row
c = a.transpose << row_sum

# transpose it back to the original view, now we have both summary of rows and columns
c.tranpose

更新

感谢Jakub Hampl

,这是我的新答案
# Create the summary column (row totals), update the array
a.map! {|r| r + [r.reduce(:+)]}

# Create the summary row (column totals)
a.transpose.map{|x| x + [x.reduce(:+)]}