对Java中任何多维数组的全面理解



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

例如,当二维数组初始化时:

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

这仅仅意味着元素"1"是"第一行,第一列",元素"2"是"第一行,第二列"但是

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

这是否意味着元素"1"在3d数组b中是"1 x, 1 y, 1 z"?

如果是多维数组呢?比如:

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

你怎么能想象呢?这是因为我读过的所有教科书都没有描述过二维以上的数组。他们会简单地说,存在无数次元数组。但我无法想象他们。

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

你的代码示例都不是合法的Java。这个声明:

int[][] a;

声明aint的数组的数组。(Java实际上没有二维数组。)你可以用数组的数组来初始化它:

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

但是,不能用{1, 2, 3}初始化,因为{1, 2, 3}int[]而不是int[][](也就是说,"int的数组"与"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语言规范非常详细地介绍了数组的创建。

请与@Ted Hopp的回答一起阅读。

我只是想解释为什么你给的例子不是有效的Java。

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

这(现在)是有效的(除了末尾缺少分号)

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

这是无效的,因为数组初始化器指定了一个二维数组,而你将它赋值给了一个三维数组。

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

这是无效的,因为数组初始化器指定了一个二维数组,而您正在将其分配给一个4d数组。

事实上,这应该澄清您对在这些情况下发生的事情的关注。答案是什么都没有。这种行为是违法的。声明的数组类型和初始化式的维数必须相同。


对于像这样创建的矩形数组(或n维类似物)。

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

每个维度的长度可以简单地从初始化式中读取;也就是说,这是声明一个4x5x6x7 4-D矩阵的Java等价物。你也可以在代码中这样做。

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. 实际上,用于一维和二维数组的相同模式以一种自然而明显的方式扩展到高维数组。(或者至少,这对大多数Java程序员来说是很自然和明显的…)

因此,花额外的书页来解释一些"明显"one_answers"很少使用"的东西是很难证明的,特别是如果这意味着从书的其他地方剪掉材料。

和FWIW,典型的Java教科书也没有提到Java语言的其他晦涩的角落,如标签中断,初始化块,变量名中的'$',Java名称解析规则等等。这可能是件好事1


1 -是的…

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

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

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

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

考虑一下这样的多维数组,过一会儿,你就会完全忽略它的维度。

祝你好运!

实际上,Java使用锯齿数组,意思是数组的数组。

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

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

string[,] array = new string[2,3];

您将如何声明和初始化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} } } };  

相关内容

  • 没有找到相关文章

最新更新