Вычисление суммы столбцов в неравномерном 2D-массиве

#java #arrays #loops

#java #массивы #циклы

Вопрос:

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

             public class Testing {
                public static void main(String[] args) {
                    int[][] data = { {3, 2, 5},
                                     {1, 4, 4, 8, 13},
                                     {9, 1, 0, 2},
                                     {0, 2, 6, 3, -1, -8} };

                    int sum = 0;
                    int row = 0;
                    int col = 0;
                    int currentRow = 0;

                    while (currentRow < data.length) {
                        for (col = 0; col < data[currentRow].length; col  ) {
                            sum = 0;
                            for (row = 0; row < data.length; row  ) {
                                System.out.println(data[row][col]);
                                sum  = data[row][col];
                            }
                            System.out.println("Sum: "   sum);
                        } 
                        currentRow  ;
                    }   
                }
            }
  

Комментарии:

1. кажется, что одного цикла слишком много. Вы while проходите через первое измерение и for(row... второе измерение. Таким образом, нет необходимости снова просматривать данные с помощью `for(row …`

2. под суммами столбцов вы подразумеваете сумму элемента x в каждом массиве, поэтому в вашем случае сумма первого столбца будет равна 13, а 6-й столбец будет равен -8, поскольку это единственный столбец в столбце?

Ответ №1:

Если вы попытаетесь вычислить суммы строк

кажется, что одного цикла слишком много. Вы while проходите через первое измерение и for(row... второе измерение. Таким образом, нет необходимости снова просматривать данные, for(row... попробовав это с одним циклом меньше, чем:

        public class Testing {
            public static void main(String[] args) {
                int[][] data = { {3, 2, 5},
                                 {1, 4, 4, 8, 13},
                                 {9, 1, 0, 2},
                                 {0, 2, 6, 3, -1, -8} };

                int sum = 0;

                for (int currentRow = 0; currentRow < data.length; currentRow  ) {
                    sum = 0;
                    for (int col = 0; col < data[currentRow].length; col  ) {
                        System.out.println(data[currentRow][col]);
                        sum  = data[currentRow][col];
                    } 
                    System.out.println("Sum: "   sum);
                }   
            }
        }
  

Если вы попытаетесь вычислить суммы столбцов

 public class Testing {
    public static void main(String[] args) {
        int[][] data = { {3, 2, 5},
                         {1, 4, 4, 8, 13},
                         {9, 1, 0, 2},
                         {0, 2, 6, 3, -1, -8} };
            // get max length of a row == number of columns
        int length = 0;
        for (int r = 0; r < data.length; r  ) {
            int currLength = data[r].length;
            if(currLength>length) length = currLength;
        }
            // create array for column sums
        int[] sums = new int[length];
            // fill array with zeros
        Arrays.fill(sums, 0);
            // sum up
        for (int currentRow = 0; currentRow < data.length; currentRow  ) {
            for (int col = 0; col < data[currentRow].length; col  ) {
                System.out.println(data[currentRow][col]);
                sums[col]  = data[currentRow][col];
            } 
        }   
            // print sums
        for (int i = 0; i < sums.length; i  ) {
            System.out.println(i   ": "   sums[i]);
        }
    }
}
  

Комментарии:

1. Поддержано, но я бы предпочел, чтобы значение while преобразовывалось в for — если оно инициализирует значение int равным 0, выполняет циклы, пока оно меньше максимального, и увеличивает его каждый раз, оно выглядит лучше как for

2. Спасибо множеству sailingthorns, это сработало отлично, и я определенно могу понять, зачем понадобился массив для сумм. Я полагаю, что я застрял на суммировании всех элементов столбца по одному за раз, вместо того, чтобы распределять его и суммировать каждый постепенно. Еще раз спасибо!

3. нет проблем, рад вам помочь! Было бы мило с вашей стороны, если бы вы могли отметить мой ответ как правильный или поддержать его. спасибо

Ответ №2:

Если я правильно понимаю ваш вопрос, и вы хотите получить сумму первого, второго, третьего и т.д. Столбцов, вы могли бы попробовать следующее.

 // array for the sums of the columns
int[] colSums;
int largestSize = 0;

// loop through and find the largest array of values (in this example its the 4th)
for(int x = 0; x < data.length; x  ) {
    largestSize = Math.max(largestSize,data[x].length);
}

colSums = new int[largestSize]; // create the int array with the right length

// loop through the data array and add sums to the colSums array
for(int x = 0; x < data.length; x  ) {

    colSums[x] = 0; // so that its not null when we add to it

    for(int y = 0; y < data[x].length; y  ) {

        // here I add the number to the solSums array
        colSums[y]  = data[x][y];
    }
}

// now colSums[0] will be the sum of the first column, colSums[1] = sum of second, etc...
  

Комментарии:

1. Я не запускал код для его тестирования, но идея должна быть правильной.

2. JStephen, я протестировал, и первый столбец, а также последние два итоговых столбца работают корректно, хотя несколько в середине не суммировались правильно. Однако эта идея похожа на другую, опубликованную выше, и, похоже, почти точна. Спасибо за вашу помощь!