3 回答
TA贡献1871条经验 获得超13个赞
表达式 likenew int[2][5]将创建一个长度为 2 的外部数组,每个元素引用一个长度为 5 的数组,因此总共创建了 3 个数组。这在 Java 语言规范示例 15.10.2-2 中有详细记录。多维数组创建:
声明:
float[][] matrix = new float[3][3];
在行为上等同于:
float[][] matrix = new float[3][];
for (int d = 0; d < matrix.length; d++)
matrix[d] = new float[3];
这并不意味着(int[2])[5],即 5 个引用数组的数组 2。
因此,查找值的表达式从左到右求值,例如x[2][5]mean (x[2])[5],即在int[][] x变量 lookup 中x[2],它是 an int[],在该数组查找值中的 index 5。
int[][] x = new int[9][9];
// z = x[2][5]
int[] y = x[2];
int z = y[5];
TA贡献1828条经验 获得超6个赞
这样做的原因是数组访问的重要性。您有一组数组 ( int[][])。然后从中检索一个数组 ( int[])。然后从那个 ( int) 中检索一个元素。
有两种方法可以做到这一点。第一个是最重要的:
for (int i = 0; i < matrix.length; i++) {
int[] row = matrix[i];
for int j = 0; j < row.length; j++) {
int element = row[j];
}
}
必须int[] row = matrix[][i];在第一个示例中使用是荒谬的,因为约定是array[i]代表 的第一个元素array。在这种情况下,的第一个元素array是一行,而不是一个元素。
始终一致地应用相同的索引排序。
这也符合这样一个事实,即您可以使用Object[]数组拥有一个奇怪维度的类矩阵对象。也许该数组的一个元素将是int[][][]while 下一个将是int[]。必须以某种方式弄清楚是否放置array[][][][i]或array[][i]当您不知道子数组的维数i并且子数组甚至不一定具有一致的维数时,这会有点奇怪。
TA贡献1799条经验 获得超8个赞
您可能会将 Java 中的二维数组视为数组的数组。考虑以下一般二维数字数组:
1 2 3
4 5 6
7 8 9
我们可以将这个数组定义为:
int[][] array = new int[][] {{1,2,3}, {4,5,6}, {7,8,9}};
或者,我们可以使用一个空的构造函数,然后填充各个值:
int[][] array = new int[3][3];
array[0][0] = 1;
array[0][1] = 2;
// etc.
但是为了更好地理解 Java 中的 2D 数组是如何工作的,请考虑以下方法:
int[][] array = new int[3][];
arr[0] = new int[] {1, 2, 3};
arr[1] = new int[] {4, 5, 6};
arr[2] = new int[] {7, 8, 9};
希望很清楚二维数组实际上是什么;它是一个数组数组,因此我们可以将其可视化为:
[ ] -> [1, 2, 3]
[ ] -> [4, 5, 6]
[ ] -> [7, 8, 9]
也就是说,数组的第一个索引中的每个元素,大小为 3,对应于行,指向另一个 1D 数组,对应于列。请注意,在 Java 中,二维数组可以是jagged,这意味着我们也可以这样做:
int[][] array = new int[3][];
arr[0] = new int[] {1, 2, 3, 4, 5};
arr[1] = new int[] {1, 2, 3};
arr[2] = new int[] {7, 7, 7};
为了解决@Henry 在下面的评论中提出的问题,上面二维数组最左边部分的大小为 3,这与我们在绘制时看到的一致。即,我们看到一个具有 3 个桶的一维数组,每个桶都指向另一个具有某种大小的一维数组。
添加回答
举报