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

时间:2013-04-26 01:39:32

标签: java arrays multidimensional-array

我是一名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}}

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

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

5 个答案:

答案 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

你也可以用粗糙的数组做到这一点......除了你会发现各种子阵列的长度不均匀。相反,它们取决于相应的子阵列在初始化器中的大小,或者其他什么。


  

这是因为我读过的所有教科书都没有描述过多于二维数组的数组。

为教科书作者辩护:

  1. 真正的Java程序使用2-D以上的数组是不常见的,使用{{{...}}}样式初始化程序初始化它们更不寻常。

  2. 实际上,用于1-D和2-D阵列的相同模式以自然而明显的方式扩展到更高维数组。 (或者至少,大多数Java程序员都很自然而且很明显......)

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

    而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} } } };