我是一名Java初学者,之前曾问过多维数组问题,但没有一个答案清晰简洁。
例如,当像这样初始化二维数组时:
int[][] a = {{1,2,3}}
这仅仅意味着元素“1”是“第1行,第1列”,元素“2”是“第1行,第2列” 但是呢?
int[][][] b = {{1,2,3}}
这是否意味着元素“1”在3-D数组中是“1 x,1 y,1 z”?
多维数组如何说:
int[][][][] c = {{1,2,3}}
你怎么想象?这是因为我读过的每本教科书都没有描述过多于二维数组的数组。他们会简单地说,存在无数维数组。但我无法想象他们。
请尽可能清楚地回答这个问题,这样任何其他用户都可以通过阅读答案完全掌握任何多维数组。
答案 0 :(得分:3)
您的代码示例都不是合法的Java。这个声明:
int[][] a;
将a
声明为int
的数组数组。 (Java实际上并不具有二维数组。)您可以使用数组数组初始化它:
int[][] a = { {1, 2, 3}, {4, 5, 6} };
但是,您无法使用{1, 2, 3}
初始化,因为{1, 2, 3}
是int[]
,而不是int[][]
(即“{1}}数组”是与“int
数组数组”的类型不同。
类似的考虑适用于其他案例。例如:
int
声明int[][][][] c;
。
一旦理解了数组数组的基本概念,理解特定声明就不难了。例如:
int
将int[][][] b = new int[3][4][2];
声明为长度为3的数组。b
的每个元素都是一个包含4个数组的数组,每个数组都是2个b
值的数组。像往常一样,所有int
值都初始化为0.您不必初始化尾随维度:
int
声明int[][][] b = new int[3][][];
为数组3长。每个元素必须是b
,但最初所有元素都是int[][]
。
不要求元素具有相同的长度。因此,例如,null
可能设置为长度为7的数组,而b[1]
的长度可能为12。
Java Language Specification详细介绍了数组创建。
答案 1 :(得分:2)
请结合@Ted Hopp的回答阅读此内容。
我只想解释为什么您提供的示例不是有效的Java。
int[][] a = {{1,2,3}}
这是(现在)有效(除了最后丢失的分号)
int[][][] b = {{1,2,3}}
这是无效的,因为数组初始化程序指定了一个二维数组,并且您将它分配给一个三维数组。
int[][][][] c = {{1,2,3}}
这是无效的,因为数组初始化程序指定了一个二维数组,并且您将它分配给一个4-D数组。
事实上,这应该清除你对这些案件中发生的事情的担忧。答案是什么。代码是非法的。声明的数组类型和初始值设定项的维度必须相同。
关于像这样创建的矩形阵列(或N维模拟物)。
int[][][][] d = new int[4][5][6][7];
每个尺寸的长度可以简单地从初始化器读出;即声明Java等效于4x5x6x7
4-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
你也可以用粗糙的数组做到这一点......除了你会发现各种子阵列的长度不均匀。相反,它们取决于相应的子阵列在初始化器中的大小,或者其他什么。
这是因为我读过的所有教科书都没有描述过多于二维数组的数组。
为教科书作者辩护:
真正的Java程序使用2-D以上的数组是不常见的,使用{{{...}}}
样式初始化程序初始化它们更不寻常。
实际上,用于1-D和2-D阵列的相同模式以自然而明显的方式扩展到更高维数组。 (或者至少,大多数Java程序员都很自然而且很明显......)
因此,花费额外的教科书来解释“明显”和“很少使用”的东西是很难证明的,特别是如果这意味着在其他地方将材料从书中删除。
而FWIW,典型的Java教科书也未提及Java语言的其他模糊角落,如标签符号,初始化程序块,变量名称中的'$',Java名称解析规则等。这可能是一件好事 1 。
1 - 是的......我一直在阅读“1066和所有这些”。
答案 2 :(得分:0)
当我第一次遇到多维数组时,我很难用这个概念。
首先将2D阵列视为图像。每个元素都是一个像素。
3D阵列就是一部电影。 [i,j,k]处的元素是电影的帧k中坐标(i,j)处的像素。
4D阵列是由多个摄像机组成的电影,[i,j,k,l]是第l个摄像机第k帧中坐标(i,j)处的像素。
考虑一下这样的多维数组,过了一段时间,你将完全忽略它的维数。
祝你好运!答案 3 :(得分:0)
实际上,Java使用锯齿状数组,这意味着数组数组。
int[][] array = {{1, 2}, {3, 4}};
在C#等其他语言中,它们具有多维数组(除了锯齿状数组):
string[,] array = new string[2,3];
答案 4 :(得分: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} } } };