1

我是一名 Java 初学者,之前曾问过多维数组问题,但没有一个答案是清晰简洁的。

例如,当一个二维数组像这样初始化时:

int[][] a = {{1,2,3}}

这只是意味着元素“1”是“第 1 行,第 1 列”,元素“2”是“第 1 行,第 2 列”,但是呢?

int[][][] b = {{1,2,3}}

这是否意味着元素“1”是 3-D 数组 b 中的“1 x, 1 y, 1 z”?

像这样说的多维数组怎么样:

int[][][][] c = {{1,2,3}}

你会怎么想象?这是因为我读过的每一本教科书都没有描述一个超过二维数组的数组。他们会简单地说,存在无数维数组。但我无法想象它们。

请帮助我尽可能清楚地回答这个问题,以便任何其他用户只需阅读答案即可完全掌握任何多维数组。

4

5 回答 5

3

您的代码示例都不是合法的 Java。本声明:

int[][] a;

声明a为 的数组的数组int。(Java 实际上没有二维数组。)您可以使用数组数组对其进行初始化:

int[][] a = { {1, 2, 3}, {4, 5, 6} };

但是,您不能使用初始化,{1, 2, 3}因为{1, 2, 3}is anint[]而不是 an int[][](即“array of int”与“array of array of int”的类型不同)。

类似的考虑将适用于其他情况。例如:

int[][][][] c;

声明一个数组数组数组数组的数组int

一旦理解了数组数组的基本概念,理解具体的声明就不难了。例如:

int[][][] b = new int[3][4][2];

声明b为长度为 3 的数组。 的每个元素b是 4 个数组的数组,每个数组是 2 个int值的数组。像往常一样,所有int值都初始化为 0。您不必初始化尾随维度:

int[][][] b = new int[3][][];

声明b为一个 3 长的数组。每个元素都必须是int[][],但最初所有元素都是null

不要求元素具有相同的长度。因此,例如,b[1]可能设置为长度为 7 的数组,而b[2]长度可能为 12。

Java 语言规范详细介绍了数组创建。

于 2013-04-26T01:44:49.650 回答
2

请结合@Ted Hopp 的回答阅读本文。

我只想解释为什么您提供的示例不是有效的 Java。

int[][] a = {{1,2,3}}

这(现在)有效(除了最后缺少的分号)

int[][][] b = {{1,2,3}}

这是无效的,因为数组初始值设定项指定了一个 2-D 数组,而您正在将它分配给一个 3-D 数组。

int[][][][] c = {{1,2,3}}

这是无效的,因为数组初始值设定项指定了一个二维数组,而您将它分配给了一个 4 维数组。

事实上,这应该消除您对在这些情况下会发生什么的担忧。答案是什么。该代码是非法的。声明的数组类型和初始化器的维数必须相同。


关于这样创建的矩形阵列(或 N 维类似物)。

int[][][][] d = new int[4][5][6][7];

每个维度的长度可以简单地从初始化器中读取;即声明Java 等效于4x5x6x74-D 矩阵。你也可以在代码中做到这一点。

System.out.println(d.length);   // prints 4 
System.out.println(d[0].length);   // prints 5 
System.out.println(d[0][0].length);   // prints 6
System.out.println(d[0][0][0].length);   // prints 7

你也可以用参差不齐的数组来做到这一点......除了你会发现各种子数组的长度不均匀。相反,它们取决于初始化程序中各个子数组的大小,或者其他。


这是因为我读过的每一本教科书都没有描述一个超过二维数组的数组。

为教科书作者辩护:

  1. 真正的 Java 程序使用二维以上的数组是不寻常的,使用{{{...}}}样式初始化器来初始化它们更不寻常。

  2. 事实上,用于 1-D 和 2-D 数组的相同模式确实以一种自然而明显的方式扩展到更高维数组。(或者至少,这对大多数 Java 程序员来说是自然而明显的......)

因此,花费额外的教科书页数来解释“显而易见”和“很少使用”的东西是很难证明的,特别是如果这意味着在其他地方从书中删减材料。

并且 FWIW,典型的 Java 教科书也没有提到 Java 语言的其他晦涩的角落,比如 break-to-label、初始化块、变量名中的“$”、Java 名称解析规则等等。这可能是一件好事1


1 - 是的......我一直在阅读“1066 and all that”。

于 2013-04-26T02:11:23.820 回答
0

当我第一次遇到多维数组时,我自己也很难理解这个概念。

首先将二维数组视为图像。每个元素都是一个像素。

一个 3D 数组就是一部电影。[i, j, k] 处的元素是电影第 k 帧中坐标 (i, j) 处的像素。

一个 4D 数组是由多个摄像机组成的电影,[i, j, k, l] 是第 l 个摄像机的第 k 帧坐标 (i, j) 处的像素。

想一想这样的多维数组,过了一会儿,你就会完全忽略它的维数。

祝你好运!

于 2013-04-26T01:46:06.577 回答
0

实际上,Java 使用交错数组,这意味着数组的数组。

int[][] array = {{1, 2}, {3, 4}};

而在 C# 等其他语言中,它们具有多维数组(除了锯齿状数组):

string[,] array = new string[2,3];
于 2013-04-26T01:48:33.350 回答
0

这是您声明和初始化 1D、2D、3D 和 4D 数组的方式:

int[] oneD = {1,2,3,4,5,6};
int[][] twoD = { {1,2,3}, {4,5,6} };
int[][][] threeD = { { {1,2,3,4,5}, {2,3}, {3}}, {{4}, {5,6,6,7}, {10,6,7} } };
int[][][][] fourD = { { { {1,1}, {2}},{{1,2}, {3}}, {{3}, {4,5,6,7,8,9,10}}}, {{{4},{5,6,7}}, {{5},{6}}, {{6,1,2},{0,7} } } };  
于 2013-04-26T02:03:23.013 回答