2015-04-25 2 views
0

Итак, у меня возникли проблемы с моим кодом при возврате суммы столбцов в двумерном массиве с строками разной длины. Например, массив 2X2 отлично работает, чтобы вычислить сумму столбцов. Но если бы у меня был, например, массив 2X3, это дало бы мне ошибку за пределы. Я хочу, чтобы он работал на любые числа, заданные пользователем для строк и столбцов, а не только фиксированное число, которое я сказал в качестве примера. Может ли кто-нибудь помочь мне решить эту проблему? Большое спасибо!Поиск суммы столбцов в двумерном массиве с строками разной длины

вот мой код:

public static void columnSum(int[][]anArray) { 
    int totalcol = 0; 
    for(int col =0; col < anArray.length; col++){ 
     totalcol = 0; 
     for(int row = 0; row < anArray[col].length; row++) { 
      totalcol += anArray[row][col]; 
     } 
    System.out.println("Sum of column " + col + " = " + totalcol); 
    } 
} 

ответ

0

У вас есть проблема в цикл

for(int row = 0; row < anArray[col].length; row++) { 
     totalcol += anArray[row][col]; 
    } 

Если массив 2X3, то в этом для цикла, когда вы используете col = 0 Затем anArray[col].length возвращается значение 3. Таким образом, ваша переменная row может иметь значения 0 - 2 в цикле for. Поэтому, когда значение row равно 2, а значение column равно 0 (как указано ранее), anArray[row][col] выдает ArrayOutOfBoundException, так как anArray[2][0] не существует.

Так попробуйте вместо этого:

for(int row = 0; row < anArray.length; row++) { 
     totalcol += anArray[row][col]; 
    } 

Я думаю, что это будет работать.

1

Ваши индексы перевернуты. Ваши циклы for написаны для упорядочивания столбцов, но ваш сумматор написан для строкового порядка. Вам нужно отменить одно или другое.

0

Вопрос не содержит order элементов массива. Есть два Каковы возможности:

  1. anArray[i][j] представляет собой элемент в строке i и столбца j (строка-мажор)
  2. 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); 
} 

Если ваши строки каждый может иметь различное количество столбцов (как указано в названии вопроса), вам необходимо:

  1. Определите, когда столбцов больше нет.
  2. При вычислении суммы столбца 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]); 
}