Вопрос не содержит order элементов массива. Есть два Каковы возможности:
anArray[i][j]
представляет собой элемент в строке i
и столбца j
(строка-мажор)
anArray[i][j]
представляет собой элемент в столбце i
и строки j
(колонка-мажор)
Более простая задача - найти суммы столбцов в массиве столбцов или полностью эквивалентно --- суммы строк в массиве строк. Предлагаемое решение в вопросе только должно заменить totalcol += anArray[row][col]
на totalcol += anArray[col][row]
и уже будет работать для этого случая.
Сложно вычислить суммы столбцов в массиве строк, или, опять же, эквивалентно --- суммы строк в массиве столбцов. Остальная часть этого ответа показывает, как вычислять суммы столбцов для массива строк. В этом случае anArray.length
- это количество строк, а anArray[i].length
- количество столбцов в строке i
.
В более обычном случае, когда все ваши строки имеют одинаковое количество столбцов, вы можете сделать это:
int numrows = anArray.length;
int numcols = (numrows > 0) ? anArray[0].length : 0; // Guard against 0x0 array
for(int col = 0; col < numcols; col++) {
int totalcol = 0;
for(int row = 0; row < numrows; row++) {
totalcol += anArray[row][col];
}
System.out.println("Sum of column " + col + " = " + totalcol);
}
Если ваши строки каждый может иметь различное количество столбцов (как указано в названии вопроса), вам необходимо:
- Определите, когда столбцов больше нет.
- При вычислении суммы столбца
col
, убедитесь, чтобы пропустить строки, которые слишком коротка
Один из способов будет:
int numrows = anArray.length;
for(int col = 0; /* not known a priori*/; col++) {
int totalcol = 0;
boolean emptySum = true; // At first, assume no rows are long enough
for(int row = 0; row < numrows; row++) {
if(anArray[row].length <= col) continue; // Skip short row
emptySum = false; // Mark assumption as wrong
totalcol += anArray[row][col];
}
// Exit the loop if we did not sum anything, i.e. no row had a column with index col
if(emptySum) break;
System.out.println("Sum of column " + col + " = " + totalcol);
}
Вместо того, чтобы использовать неудобный emptySum
флаг бросить петля, вы можете определить максимальную длину колонки в предварительном поле:
int numrows = anArray.length;
int maxnumcols = (numrows > 0) ? anArray[0].length : 0; // Guard against 0x0 array
for(int row = 1; row < numrows; row++) {
maxnumcols = Math.max(maxnumcols, anArray[row].length);
}
for(int col = 0; col < maxnumcols; col++) {
int totalcol = 0;
for(int row = 0; row < numrows; row++) {
if(anArray[row].length <= col) continue; // Skip short row
totalcol += anArray[row][col];
}
System.out.println("Sum of column " + col + " = " + totalcol);
}
Наконец, если вы имеете право хранить суммы (вместо того, чтобы сразу их вывода), это будет еще чище решение (обратите внимание, что ряд-мажорных порядок итерации, который прекрасно вписывается в ряд-мажорных порядок самого массива):
int numrows = anArray.length;
int maxnumcols = (numrows > 0) ? anArray[0].length : 0; // Guard against 0x0 array
for(int row = 1; row < numrows; row++) {
maxnumcols = Math.max(maxnumcols, anArray[row].length);
}
int[] colsums = new int[maxnumcols]; // In Java, all elements are initialized to zero
for(int row = 0; row < numrows; row++) {
for(int col = 0; col < anArray[row].length; col++) {
colsums[col] += anArray[row][col];
}
}
for(int col = 0; col < colsums.length; col++) {
System.out.println("Sum of column " + col + " = " + colsums[col]);
}