为什么嵌套的 for 循环用于从另一个二维数组 returns 0 生成二维数组作为每个内部数组的最后一个索引?

Why does nested for loops used to generate a 2D array from another 2D array returns 0 for last index of each inner array?

我想从这个数组构建一个列数组,目标是让这个方法接受锯齿状的 array I.E.不是正方形或矩形,例如我的代码示例中的 on 是矩形。正如您从我的输出中看到的那样,一个内部数组的每个第 4 个索引都等于零,尽管看起来分配它时的值实际上等于 sales 数组中的正确值。请注意,在 main 方法中,当我输出 salesByColumn[2][4] 时,该值为 0.0 (这是控制台的最后一个条目)。如果您查看 Sales class,其中用于生成此 2D 数组的方法在分配 salesByColumn 时会像 salesByColumn[ i ][ j ],因此您可以确定在分配该索引时 i = 2j = 4。该方法将 salesByColumn[2][4] 分配给 sales[4][2],如果您观察销售数组 sales[4][2] = 2391.0. 在方法内部,我还会在调用该方法时打印 sales[4][2] 的值,您可以在输出的顶部看到它的计算结果为 2391.0. 那么为什么在调用和迭代该方法时将其分配给 0.0?感谢您的时间和考虑。

主要CLASS

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]);
    }

}

销售额 CLASS

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)

您的内部循环中的索引不正确。您不想遍历 sales[i] 的长度,您需要总行数,以便可以将每一行变成一列。

这是一个工作循环

        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];
            }
        }

如果您的实际输入数据确实像您提到的那样参差不齐,那么您需要在内循环中进行索引检查。