二维数组初始化错误

时间:2012-09-10 20:00:45

标签: java initialization multidimensional-array

目前我创建了一个2D数组来表示迷宫的网格。我的迷宫构造函数如下:

public Maze(int rows, int columns)
{
    this.rows = rows;
    this.cols = columns;
    curr = new Square[rows][columns];
}

我的测试课中有以下内容:

Maze m = new Maze(4, 4);

然而,当我遍历迷宫时,在调试时我注意到curr被初始化为Square [4] [],没有列的参数。有谁知道这里的问题是什么?

编辑:这就是我打算做的;我做了curr = Square [rows] [columns]但是当我在下面的循环中检查curr的值时,在调试器工具中curr的值为Square [4] [],无论何时它进入curr [i] [j ]在循环中。

    for(int i = 0; i < maze.length; i++)
    {
        for(int j = 0; j < maze[i].length; j++)
        {
            /* Entrance */
            if(maze[i][j] == start)
            {
                startX = j;
                startY = i;
                curr[i][j] = new Square(i, j, start, this);
            }
            /* Exit */
            else if(maze[i][j] == end)
            {
                endX = j;
                endY = i;
                curr[i][j] = new Square(i, j, end, this);
            }
            /* Traversable Squares */
            else if(maze[i][j] == traverse)
            {
                curr[i][j] = new Square(i, j, traverse, this);
            }
            /* Non-traversable Squares */
            else
            {
                curr[i][j] = new Square(i, j, noTraverse, this);
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

Java为其多维数组使用“不规则数组”。换句话说,即使指定了一个矩形数组 - 一个所有行具有相同长度的数组,java也允许行可能具有不同的长度。

结果,curr = new Square [r] [c]创建了r + 1个对象:

1 array with length r, where each element is an array of Squares (Square[])

r arrays of Squares, each of length c (although c could be changed for any of them)

所以curr实际上是Square[r][]:它是一个可变长度的方阵的r元素数组,每个数组恰好都是c个元素。

curr[n]应为Square[],而curr[n][m]Square

答案 1 :(得分:1)

enter image description here

这就是你所看到的吗?在这种情况下,调试器只知道curr是Square数组的数组,而不知道子数组中有多少个元素。 new Square[4][4]是一个自动创建内部数组的快捷方式。另一种方法是:

Square[][] curr = new Square[4][];

for (int ctrOut = 0; ctrOut < 4; ctrOut++) {
    curr[ctrOut] = new Square[5];

    for (int ctrIn = 0; ctrIn < 5; ctrIn++) {
        curr[ctrOut][ctrIn] = new Square();
    }
}

那么调试器告诉你的内容似乎是正确的。 (注意,为了清晰起见,我使用了4x5而不是4x4。)