4.3 二维数组
一维数组是表示一个线性顺序关系,正如队伍方阵中的一列或者一行。如果队伍有100个人,该怎么排列呢?排成一排吗?这显然不合理,肯定是多列多行来排列。当处理这类问题时,就需要用到二维数组了。
4.3.1 创建二维数组
二维数组常用于表示二维表,表中的信息以行和列的形式表示,它有2个下标,第1个下标代表元素所在的行,第2个下标代表元素所在的列。
二维数组可以看作是特殊的一维数组,它有两种声明方式:
二维数组声明实例:
char myChars[][]; int[][] myInts;
同一维数组一样,二维数组在声明时也没有分配内存空间,同样要使用关键字new来分配内存,然后才能访问每个数组元素。分配内存空间的语法格式如下:
数组名= new 数组元素类型[行数][列数];
为二维数组分配内存空间有两种方式,一种是直接分配行列,如下:
另一种是先分配行,再分配列,如下:
综合上述创建二维数组并为其分配空间的过程,二维数组的声明语法格式如下:
数组元素类型 数组名 = new 数组元素类型[行数][列数];
例如,下面声明一个三行两列的int型二维数组:
二维数组的两个[ ]方括号分别表示行和列。行号和列号用来确定一个元素,相当于一个面上的一点。二维数组中数据的分布如表4-1所示。
表4-1 二维数组中数据的分布
从表4-1中可见,二维数组中的数据如同坐标上的点一样,这样能更为方便地表示生活中的事物。
☆大牛提醒☆
创建二维数组时,可以只声明“行”的数量,而不声明“列”的数量,例如:
int myInts[ ][ ]=new int[2][ ];
如果不声明“行”的数量,就是错误的写法,例如:
int myInts[ ][ ]= new int[ ][ ]; int myInts[ ][ ]= new int[ ][2];
4.3.2 二维数组的赋值
二维数组的初始化与一维数组类似,也有3种方式。但不同的是,二维数组有两个索引(下标),构成由行和列组成的一个矩阵。
第1种方式:
第2种方式:
第3种方式:
前两种是通过{ }中的元素来确定二维数组的行和列,所以不能在[][]中写行数和列数。可以发现,数组的每一行对应的是一个数组数据,就可以理解为一维数组的元素对应的是另一个一维数组。最后一种是先申请确定数组行列数,然后再在对应行列位置进行赋值。
当二维数组元素较多时,例如100行、100列的10000个数据,就可以通过for循环语句赋值,例如如下代码:
【例4.8】创建二维数组,使用for循环语句输出二维数组中的值(源代码\ch04\4.8.txt)。
运行结果如图4-12所示。创建了一个二维数组num,num是一个3行3列的二维数组,并为每个元素赋值,通过for循环语句将数组的所有元素显示出来。
图4-12 通过for循环语句输出数组元素
4.3.3 遍历二维数组
遍历二维数组需要使用双层for循环语句,而且通常需要使用length属性来获取数组的长度。对于二维数组中的元素值,我们可以直接使用行号和列号作为索引来访问。例如:
但是这样一个一个地写不但麻烦,而且程序代码也不够整洁,这时,我们就可以使用for循环语句来遍历二维数组元素。例如:
运行结果如图4-13所示。这里的二维数组是通过两层for循环语句输出的结果,其中外层for循环语句遍历的是数组的行数,内层for循环语句遍历的是每行的每一列元素。
图4-13 二维数组输出结果
☆大牛提醒☆
不能访问索引号大于或等于行数和列数的内容,该内容不属于该数组的内存空间,系统会报错。
另外,使用foreach循环语句也可以遍历二维数组的元素,并输出访问结果。
【例4.9】使用foreach循环语句遍历数组,并输出数组元素值(源代码\ch04\4.9.txt)。
运行结果如图4-14所示。这里创建了一个二维数组num,num是一个3行3列的二维数组,并为每个元素赋值,通过foreach循环语句将数组的所有元素显示出来。
图4-14 通过foreach循环语句输出数组元素
4.3.4 不规则数组
Java除了支持行、列固定的矩形方阵数组类型外,还支持不规则的数组。例如二维数组中,不同行的元素个数可以不同,例如:
这个不规则数组的内存空间分布如表4-2所示。
表4-2 不规则数组中数据的分布
【例4.10】使用不规则二维数组输出课程表信息。这里二维数组0行是星期,0列是节序,其余内容是课程名,没课的内容是空的(源代码\ch04\4.10.txt)。
运行结果如图4-15所示。
图4-15 课程表输出结果
☆大牛提醒☆
当不确定数组行列信息,就用length属性获取对应行列数进行遍历,以免访问非法地址。