Как суммировать строки и столбцы 2D-массива индивидуально с помощью Java?

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

Вот пример выполнения: Введите матрицу 3 на 4 строка за строкой:

1.5 2 3 4
5.5 6 7 8
9.5 1 3 1

Sum of the elements at column 0 is 16.5
Sum of the elements at column 1 is 9.0
Sum of the elements at column 2 is 13.0
Sum of the elements at column 3 is 13.0
Sum of the elements at Row 0 is: 10.5
Sum of the elements at Row 0 is: 26.5
Sum of the elements at Row 0 is: 14.5

и вот код, который я придумал:

package multidimensionalarrays;

public class MultidimensionalArrays {

    public static void main(String[] args) {
        double sumOfRow = 0;
        double[][] matrix = new double[3][4];
        java.util.Scanner input = new java.util.Scanner(System.in); //Scanner
        System.out.println("Enter a 3 by 4 matrix row by row: ");
        //Prompt user to enter matrix numbers
        for (int row = 0; row < matrix.length; row++) {
            for (int col = 0; col < matrix[0].length; col++) {
                matrix[row][col] = input.nextDouble();
            }
        }
        double[] sumOfCol =new double[matrix[0].length];  
        for (int i = 0; i < matrix.length; i++) { //row
            for (int j = 0; j < matrix[i].length; j++) { //column
                sumOfRow += matrix[i][j];
                sumOfCol[j] += matrix[i][j];
            }
            System.out.println("Sum of the elements at row " + row + " is: " + sumOfRow);
        }
        System.out.println("Sum of the elements at column " + col + " is: " + sumOfCol);
    }             
}   

Моя проблема в том, что когда доходит до конца, чтобы распечатать суммы для столбцов и строк, он не распознает переменные row или col. Я играл с этим и менял вещи, наверное, уже несколько часов, и я просто не могу понять это правильно, может ли кто-нибудь помочь мне с тем, что я делаю неправильно? Также я не знаю, правильно ли я суммирую столбец?

В вашем текущем коде есть синтаксическая ошибка, особенно с строками и столбцами.

Ṃųỻịgǻňạcểơửṩ 29.07.2018 07:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
9 883
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Переменная, подсчитывающая строки, называется i в том месте, где вы печатаете сумму строк.

Для сумм столбцов вам понадобится еще один цикл, чтобы печатать их одну за другой.

поэтому я заменяю строку на i?

Britney 29.07.2018 07:09

Кроме того, мне нужно полностью вывести сумму столбца из этого цикла и поместить в другой цикл? извините, я только сейчас учусь программировать в первый раз, так что это меня очень сбивает с толку

Britney 29.07.2018 07:10

@Britney Кроме того, здесь есть синтаксическая ошибка. По соглашению вы рассматриваете первую координату как координату строки.

Ṃųỻịgǻňạcểơửṩ 29.07.2018 07:10

@Britney: да, вы использовали i как строковую переменную. Суммы строк вычисляются правильно, просто для их вывода понадобится еще один цикл.

Henry 29.07.2018 07:10

@ Генри Я предложил более простой алгоритм. Есть ли еще более эффективный алгоритм, который требует всего одного прохода для получения сумм всех строк и столбцов?

Ṃųỻịgǻňạcểơửṩ 29.07.2018 07:17

@Mulliganaceous Я не предоставил полное решение специально, чтобы дать ОП возможность разобраться.

Henry 29.07.2018 07:19

@ Генри Спасибо. Однако из исходного кода Бритни использовала только один цикл и, возможно, захотела сохранить результаты во вспомогательном массиве, таком как sumOfCol.

Ṃųỻịgǻňạcểơửṩ 29.07.2018 07:22
Ответ принят как подходящий

В вашем matrix это матрица 3 на 4 из сегмента кода double[][] matrix = new double[3][4];. Первый индекс - это индекс строки, а второй индекс - индекс столбца.

Обратите внимание, что ваша матрица double[][] - это массив массивов. А именно, matrix представляет собой массив из трех массивов длиной 4, и по соглашению каждый подмассив можно рассматривать как массив объектов, расположенных в одну строку. Это называется основным порядком строк.

Например, в массиве

0 1 2 4
0 1 3 9
0 1 5 15

он действительно хранится как

  • matrix[0]: [matrix[0][0], matrix[0][1], matrix[0][2], matrix[0][3] и так [0 1 2 4]
  • matrix[1]: [matrix[1][0], matrix[1][1], matrix[1][2], matrix[1][3] и так [0 1 3 9]
  • matrix[2]: [matrix[2][0], matrix[2][1], matrix[2][2], matrix[2][3] и так [0 1 5 25]

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

/* After the prompt code segment and sumOfCol in the main method */

    // Row (major index)
    for (int row = 0; row < matrix.length; row++) {
        int rowSum = 0;
        for (int col = 0; col < matrix[row].length; col++) {
            rowSum += matrix[row][col];
        }
        System.out.println("Sum of the elements at row " + row + " is: " + rowSum);
    }

    // Column (minor index)
    // Assuming the length of each row is the same
    for (int col = 0; col < matrix[0].length; col++) {
        int colSum = 0;
        for (int row = 0; row < matrix.length; row++) {
            colSum += matrix[row][col];
        }
        System.out.println("Sum of the elements at col " + col + " is: " + colSum);
    }

На выходе

Enter a 3 by 4 matrix row by row: 
0 1 2 4
0 1 3 9
0 1 5 15
Sum of the elements at row 0 is: 7
Sum of the elements at row 1 is: 13
Sum of the elements at row 2 is: 21
Sum of the elements at col 0 is: 0
Sum of the elements at col 1 is: 3
Sum of the elements at col 2 is: 10
Sum of the elements at col 3 is: 28

хорошо, вы объяснили это так, что помогли мне лучше понять это, массивы действительно сбивали меня с толку. Спасибо!!

Britney 29.07.2018 07:20

@Britney Это соглашение использовать имена row и col для индексации 2D-массива в этом контексте.

Ṃųỻịgǻňạcểơửṩ 29.07.2018 07:21

Вы имеете в виду вместо i & j, который я использовал?

Britney 29.07.2018 07:22

@ Бритни, да. Вы не назвали переменные индекса последовательно. Хорошая практика - постоянно называть

Ṃųỻịgǻňạcểơửṩ 29.07.2018 07:23

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

Britney 29.07.2018 07:28

Объем i и j является локальным. Следовательно, имена i и j могут повторяться в разных циклах при условии, что они существуют только в циклах for.

Ṃųỻịgǻňạcểơửṩ 29.07.2018 07:31

Другие вопросы по теме