0

嗯,这可能是一个奇怪的问题,也许只是因为我对 Java 不够熟悉。

所以,我声明了一个 2D int 数组:

int[][] arr = new int[0][10]

现在,如您所见,第二维的长度为 10,而第一维的长度为 0。我不确定 Java 是如何处理这类数组的,但编译器不会产生任何错误,这意味着它是合法的宣言。

好吧,我将数组传递给某个函数,我想从函数中检索第二维的长度。当然是这样的:

arr[0].length

不会工作。还有另一种方法吗?

4

3 回答 3

3

new int[0][10]和创建的对象new int[0][20]是等价的。这里没有逻辑上的“第二维度”。实际上你正在运行这样的东西:

int[][] createArray(int d1, int d2) {
    int[][] ret = new int[d1][];
    for (int i = 0; i < d1; i++) {
        ret[i] = new int[d2];
    }
    return ret;
}

现在,如果您将其转换为您的场景,您将得到永远不会读取d2的代码。

如果要表示通用矩形数组(而不是数组数组),您可能需要考虑为其创建自己的类型。

于 2012-05-26T15:16:48.657 回答
1

Java 中的数组以及大多数其他编程语言中的数组都是从零开始的。考虑这个二维数组:

int[][] arr = new int[1][10];

这意味着其中有一行十列。

现在,考虑这个数组:

int[][] arr = new int[0][10];

这意味着其中有零行和(无关数量的列)。

如果你尝试索引到第二个数组,你会发现你做不到——长度为零的数组没有起点。

编译器认为它是有效的,因为您使用它声明了维度,但您将无法在 Java 中以任何有意义的方式实际使用它。

于 2012-05-26T15:21:06.173 回答
0

没有第二维的长度这样的东西。考虑:

int[][] arr = new int[10][10];
arr[5] = new int[42];

第二维的长度是多少?10 还是 42?

不,这种方式行不通。arr是一个有十个元素的数组,每个元素都必须是一个 int 数组的引用(或 null)。这就是所有要说的。

于 2012-05-26T15:29:35.437 回答