Двумерный массив - сумма 'строка' и добавление в качестве нового элемента массива - PullRequest
2 голосов
/ 10 января 2012

У меня есть двумерный массив, который представляет столбцы и строки данных. Мне нужно суммировать столбцы и строки, но мне нужно суммировать из новой строки «итоги».

Данные (массив 6х5)

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

4 голосов
/ 10 января 2012
a.map! {|row| row + [row.reduce(:+)]}

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

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

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

a.map! {|row| row << row.reduce(:+) }
0 голосов
/ 10 января 2012

Когда я задавал вопрос, я нашел решение, но я хотел бы знать, есть ли лучший подход.

Мое решение

# 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

Обновление

Вот мой новый короткий ответ благодаря Якубу Хэмплу

# 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(:+)]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...