Как я могу скопировать 2D-массив и добавить новую строку для хранения суммы столбцов в Java? - PullRequest
0 голосов
/ 13 марта 2020

В основном у меня есть функция, которая получает двумерный массив, добавляет дополнительную строку, а затем вычисляет сумму столбцов и сохраняет результаты для каждого отдельного столбца в дополнительной строке, созданной ранее. Вот мой код:

public static int[][] sum(int[][] array) {
    int tempArray[][] = new int[array.length + 1][array[0].length];

    for (int column = 0; column < tempArray[0].length; column++) {
        int total = 0;
        for (int row = 0; row < tempArray.length; row++) {
            total += tempArray[row][column];
        }

        tempArray[tempArray.length][column] = total;

    }

    return tempArray;
}

Так что, когда я запускаю для l oop для печати результатов, я получаю ошибку ArrayIndexOutOfBounds по какой-то причине, которая относится к функции. Я думаю, что мой лог c правильный, но я не могу заставить его работать. Для некоторого большего контекста значения для массива вводятся пользователем. Спасибо, кто ответит!

Ответы [ 3 ]

2 голосов
/ 13 марта 2020

Вы получаете ArrayIndexOutOfBounds, потому что вы обращаетесь к индексу, превышающему границу массива в следующей строке:

tempArray[tempArray.length][column] = total;

Замените его на следующую строку, чтобы решить вашу проблему:

tempArray[tempArray.length - 1][column] = total;

Однако ваш код все равно не будет работать, так как в логах суммирования c есть ошибка. Вы рассчитываете сумму по следующей строке.

total += tempArray[row][column];

Но ваш tempArray не имеет никакого значения, кроме нулей. Чтобы решить эту проблему, убедитесь, что вы запускаете tempArray со значениями массива, как показано ниже:

int tempArray[][] = new int[array.length + 1][array[0].length];

for(int i = 0; i < array.length; i++) {
    for(int j = 0; j < array[0].length; j++) {
        tempArray[i][j] = array[i][j];
    }
}

Надеюсь, это решит вашу проблему. Удачного кодирования!

0 голосов
/ 13 марта 2020

Упомянутые решения не будут работать, если строки имеют разную длину. Например, если входной массив равен

int[][] input = new int[][] { { 1, 2, 3 }, { 2, 3 } };

Это решение устраняет такую ​​проблему

public static int[][] sum(int[][] array) {
    int[][] tempArray = new int[array.length + 1][];

    int maxLength = 0;
    for (int i = 0; i < array.length; i++) {
        tempArray[i] = Arrays.copyOf(array[i], array[i].length);

        maxLength = Math.max(maxLength, array[i].length);
    }

    tempArray[tempArray.length - 1] = new int[maxLength];
    for (int i = 0; i < maxLength; i++ ) {
        int total = 0;
        for (int[] row : tempArray) {
            if (i <= row.length - 1) {
                total += row[i];
            }
        }
        tempArray[tempArray.length - 1][i] = total;
    }
    return tempArray;
}

И тест

public static void main(String[] args) {
    int[][] arr = new int[][] { { 1, 2, 3 }, { 2, 3 } };
    System.out.println(Arrays.deepToString(sum(arr))); 
    // Output
    // [[1, 2, 3], [2, 3], [3, 5, 3]]
}
0 голосов
/ 13 марта 2020

Вы не инициализировали tempArray[][].

tempArray[tempArray.length][column] = total

, измените его на

tempArray[tempArray.length-1][column] = total

, это разрешит индекс вне связанной проблемы.

public static int[][] sum(int[][] array) {
    int tempArray[][] = new int[array.length + 1][array[0].length];

    for (int column = 0; column < array[0].length; column++) {
        int total = 0;
        for (int row = 0; row < array.length; row++) {
            tempArray[row][column] = array[row][column];
            total += array[row][column];
        }

        tempArray[tempArray.length-1][column] = total; // resolves the index out of bound issue

    }

    return tempArray;
}

...