3.1小节介绍的数组都是把数组元素从逻辑上排成一行,因此它们被称为“一维数组”。如果一个班级内有15个学生,这些学生按照身高又分成3排就坐,其排列形式如图3-2所示:
3-2学生身高排列图
如果程序员希望按照每个学生在班级内的位置来存储他们的身高数据该怎么办呢?一些读者想到可以创建a、b、c 3个数组来存储这3排学生的身高值。如果采用这样的方式解决问题,每当要打印某个学生的身高时,就必须先要判断该学生的身高值位于哪一个数组之内,这显然会增加程序的复杂度,并且从逻辑上也无法体现出这3排学生是一个整体,他们属于同一个班级。
那么,有没有一种“高级数组”,它既能够把3组身高存数据储在一起,又能使任意一组身高值独立于另外两组数据呢?在Java语言中,确实存在这样能满足需求的“高级数组”,专业上把这种数组称为“二维数组”。二维数组的结构如图3-2所示,它可以分为N行M列。二维数组有行和列两个维度,为了能够体现出二维数组有两个维度,在声明它的时候要用两对方括号,语法格式如下:
数据类型[][] 数组名; |
或者:
数据类型数组名[][]; |
声明一个用来存储身高数据的二维数组可以用以下代码实现:
double[][] height;
同样,如果初始化一个二维数组,也需要用两对方括号来设定两个维度的大小。例如把height数组初始化为一个3行5列的二维数组,代码如下:
double[][] height = new double[3][5];
通过图3-2很容易看出,二维数组其实是多个一维数组组成的。例如height数组就是由3个长度为5的一维数组组成的。因此,如果用一些已知的数据直接初始化二维数组,可以先用大括号把这些数据分成N组,每组数据就是一个一维数组,这N组数据之间用逗号隔开,之后在这N组数据的外围再添加一对大括号,用来表示它们共同组成了一个二维数组,例如用全班15个同学的身高数据初始化height数组,代码如下:
double[][] height =
{
{1.56,1.55,1.58,1.61,1.63},//第1行
{1.64,1.67,1.68,1.71,1.74},//第2行
{1.77,1.79,1.80,1.83,1.85} //第3行
};
访问二维数组与访问一维数组一样,都是通过下标的方式进行的,并且无论是行下标还是列下标也都是从0开始的。例如,打印height数组中第2行中第3个元素,代码是:
System.out.println(height[1][2]);
以上所有示例代码中,height数组的每一行都存储了5个身高数据。但现实生活中,也许某个班级的人数并不能完全平均分成N组。假如班级中只有13个学生,如果他们还坐3排,这样就变成了前两排5个人,最后一排只有3个人。那么是否能够按照这种学生的排列结构,创建一个与之对应二维数组呢?也就是说,能否创建一个前两行有5个元素、最后一行仅有3个元素的二维数组。
在Java语言中,允许二维数组的各个行长度不统一,专业上把这种各行长度不统一的二维数组称为“不规则二维数组”。创建不规则二维数组,需要通过两个步骤实现:1、先设定二维数组总共有多少行 2、分别设定每一行的长度。在步骤1中,暂时先不设定每一行的长度,因此new关键字之后第二对方括号中不需要填写数字。以下示例展示了创建不规则二维数组的过程:
【例03_02创建不规则二维数组】
Exam03_02.java
public class Exam03_02 {
public static void main(String[] args) {
double[][] height = new double[3][];// 先设定二维数组有3行
height[0] = new double[5];// 设定二维数组的第1行长度为5
height[1] = new double[5];// 设定二维数组的第2行长度为5
height[2] = new double[3];// 设定二维数组的第3行长度为3
System.out.println(height.length);
}
}
在【例03_02】中,height[0]、height[1]、height[2] 分别表示二维数组的第1、2、3行,它们都是一维数组。程序中单独对这3个一维数组设定了各自的长度,这样就能创建出不规则二维数组。此外,在程序的最后一行还输出了height数组length属性值。需要提醒各位读者,对于二维数组而言,其length属性表示它有多少行,而不是总共包含多少个元素,因此程序的输出结果为3。
如果用已知的数据直接初始化二维数组,也可以把二维数组的各行中置放数量不等元素,例如:
double[][] height =
{
{1.56,1.55,1.58,1.61,1.63},//第1行
{1.64,1.67,1.68,1.71},//第2行
{1.77,1.79,1.80}//第3行
};
在以上代码中,height数组的第一行内置放了5个元素,第2行置放了4个元素,第3行仅置放了3个元素。
二维数组如同是一张印有方格的纸,如果把二维数组叠加在一起,还可以形成三维数组,三维数组的结构如图3-3所示:
图3-3 三维数组示意图
从图3-3可以看出,三维数组有3个维度,它们分别表示第几层、第几行和第几列,因此声明三维数组需要3对方括号。以此类推,还可以把三维数组叠加在一起形成四维数组。继续推衍还可以形成更高维度的数组。
需要提醒各位读者,任何维度数组的length属性,都表示组成该数组的低阶维度数组的个数。例如:三维数组是由多个二维数组组成,因此它的length属性就表示了该三维数组中包含多少个二维数组。同理,四维数组是由多个三维数组组成的,它的length属性就表示了该四维数组中包含多少个三维数组,更高维度数组的length属性也都是相同含义。
除此文字版教程外,小伙伴们还可以点击这里观看我在本站的视频课程学习Java。