2012-01-10 5 views
2

У меня есть двумерный массив, который представляет столбцы и строки данных. Мне нужно суммировать как столбцы, так и строки, но мне нужно суммировать их из новой строки «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(:+)} 

но как я добавить дополнительный столбец

ответ

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

принимает каждый элемент массива, передает его в блок и заменяет этот элемент тем, что возвращается этим блоком. Поэтому, поскольку мы называем это 2d-массивом, row будет 1d-массивом - строкой исходного массива.

Затем я вычисляю сумму с reduce(:+) этой строки. Затем мне нужно добавить его в эту строку. То, что я сделал здесь, это обернуть результат суммы в массив, а затем использовать +, чтобы объединить эти два массива.

Я мог бы также сделать это:

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

Именно то, что я искал! Не могли бы вы объяснить короткое объяснение в терминах простых мужчин? –

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 

Update

Вот мой новый короткий ответ благодаря Якуб 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(:+)]} 
Смежные вопросы