Почему вложенный в циклы, используемые для генерации 2D-массива из другого 2D-массива, возвращает 0 для последнего индекса каждого внутреннего массива? - PullRequest
0 голосов
/ 22 января 2020

Я хотел бы построить массив столбцов из этого массива, цель состоит в том, чтобы этот метод принимал неровные array IE не квадратные или прямоугольные angular, как в моем примере кода является прямоугольным angular для пример. Как вы можете видеть из моих выходных данных, каждый 4-й индекс одного внутреннего массива равен нулю, хотя может показаться, что значение в то время, когда ему назначено, фактически равно правильному значению из массива продаж. В основном методе обратите внимание, что при выводе salesByColumn[2][4] это значение равно 0.0 (это последняя запись в консоли). Если вы посмотрите в классе Sales, где используется метод для создания этого двумерного массива, то, когда он присваивает salesByColumn, он делает это, например, salesByColumn[ i ][ j ], поэтому вы можете определить, что при назначении этого индекса это i = 2 и j = 4. Метод присваивает salesByColumn[2][4] sales[4][2], что, если вы наблюдаете массив продаж sales[4][2] = 2391.0. Внутри метода я также печатаю значение sales[4][2] при вызове метода и, как вы можете видеть в верхней части его вывода оценивается как 2391.0. Так почему же он присваивает ему 0.0, когда метод вызывается и повторяется? Спасибо за ваше время и внимание.

ГЛАВНЫЙ КЛАСС

public class Main {

    public static void main(String[] args) {
        double[][] salesByColumn = Sales.salesByColumn();
        for(double[] column : salesByColumn) {
            for(double sale : column) {
                System.out.println(sale);
            }
            System.out.println();
        }

        System.out.println(salesByColumn[2][4]);
    }

}

ПРОДАЖ КЛАСС

public class Sales {

    static double[][] sales = {
        {1540.0, 2010.0, 2450.0, 1845.0},
        {1130.0, 1168.0, 1847.0, 1491.0}, 
        {1580.0, 2305.0, 2710.0, 1284.0}, 
        {1105.0, 4102.0, 2391.0, 1576.0},
        {1105.0, 4102.0, 2391.0, 1576.0}
    }

    public static double[][] salesByColumn() {
        int maxColumns = 0;
        for(double[] row : sales) {
            if(row.length > maxColumns) {
                maxColumns = row.length;
            }
        }

        System.out.println("Look here " + sales[4][2]);

        double[][] salesByColumn = new double[maxColumns][];
        for(int i = 0; i < maxColumns; i++) {
            salesByColumn[i] = new double[(sales.length)];
            for(int j = 0; j < sales[i].length; j++) {
                salesByColumn[i][j] = sales[j][i];
            }
        }
        return salesByColumn;
    }
}

ВЫХОД

run:

Look here 2391.0
1540.0
1130.0
1580.0
1105.0
0.0

2010.0
1168.0
2305.0
4102.0
0.0

2450.0
1847.0
2710.0
2391.0
0.0

1845.0
1491.0
1284.0
1576.0
0.0

0.0
BUILD SUCCESSFUL (total time: 0 seconds)

1 Ответ

0 голосов
/ 22 января 2020

Индекс в вашей внутренней l oop неверен. Вы не хотите выполнять итерации по длине sales[i], вам нужно общее количество строк, чтобы вы могли превратить каждую строку в столбец.

Вот рабочая l oop

        System.out.println("Look here " + sales[4][2]);

        double[][] salesByColumn = new double[maxColumns][];
        for(int i = 0; i < maxColumns; i++) {
            salesByColumn[i] = new double[(sales.length)];
            for(int j = 0; j < sales.length; j++) {
                System.out.println("Assigning "+i+", "+j+" to" +sales[j][i]);
                salesByColumn[i][j] = sales[j][i];
            }
        }

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

...