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

Я изучал 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++;
                    }   
                }
            }

person TheGuy101    schedule 01.07.2014    source источник
comment
кажется, что одной петли слишком много. Ваш while проходит по первому измерению, а for(row... по второму измерению. Таким образом, нет необходимости снова просматривать данные с помощью `for(row...``   -  person sailingthoms    schedule 01.07.2014
comment
под суммами столбцов вы имеете в виду сумму элементов x в каждом массиве, поэтому в вашем случае сумма первого столбца будет равна 13, а 6-го столбца будет -8, поскольку это единственный в столбце?   -  person JStephen    schedule 01.07.2014


Ответы (2)


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

кажется, что одной петли слишком много. Ваш 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]);
        }
    }
}
person sailingthoms    schedule 01.07.2014
comment
Проголосовал, но я бы предпочел, чтобы while был преобразован в for - если он инициализирует int значением 0, зацикливается, пока он меньше максимума, и каждый раз увеличивает его, он выглядит лучше как for - person tucuxi; 02.07.2014
comment
Большое спасибо Sailingthorns, это сработало отлично, и я определенно могу понять, зачем нужен массив для сумм. Я полагаю, что застрял на суммировании всех элементов столбца по одному по порядку вместо того, чтобы распределять его и суммировать каждый постепенно. Спасибо еще раз! - person TheGuy101; 02.07.2014
comment
нет проблем, рад помочь вам! Было бы неплохо с вашей стороны, если бы вы могли отметить мой ответ как правильный или проголосовать за него. спасибо - person sailingthoms; 02.07.2014

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

// 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...
person JStephen    schedule 01.07.2014
comment
Я не запускал код для проверки, но идея должна быть правильной. - person JStephen; 02.07.2014
comment
JStephen, я проверил, и первый столбец, а также последние два столбца работают правильно, хотя некоторые в середине не складываются правильно. Однако эта идея похожа на другую, опубликованную выше, и кажется почти правильной. Спасибо за вашу помощь! - person TheGuy101; 02.07.2014