5.1.2 二维数组对象
一维数组使用数组名与一个索引来指定存取数组中的元素,您也可以定义二维数组。二维数组使用数组名与两个索引来指定存取数组中的元素。其定义方式与一维数组类似:
int[][] arr = {{1, 2, 3},
{4, 5, 6}};
从上面这个程序片段,就可以清楚地看出二维数组的索引方式。其定义了2行(Row)3列(Column)的数组,使用{ }与适当的断行可以协助您指定数组初值。范例5.5简单地示范了二维数组的存取。
Ü 范例5.5 TwoDimArray.java
public class TwoDimArray {
public static void main(String[] args) {
int[][] arr = {{1, 2, 3},
{4, 5, 6}};
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[0].length; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
}
}
}
执行结果:
1 2 3
4 5 6
数组值arr[i][j]表示指定的是第i行第j列的值。在使用二维数组对象时,注意length所代表的长度,数组名后直接加上length(如arr.length),所指的是有几行(Row);指定索引后加上length(如arr[0].length),指的是该行所拥有的元素,也就是列(Column)数目。
lang=EN-US>
良葛格的话匣子:
初学者对于二维数组的了解到这里就可以了。接下来的内容是高级的二维数组说明,初学者可以先试着了解,如果觉得有点难,可以先跳过待以后对象观念更清楚后,再来看接下来的内容。
要了解范例5.5中length成员各代表哪一个长度,必须从对象配置的角度来了解。以对象的方式来配置一个二维数组对象,要使用以下的语法:
int[][] arr = new int[2][3];
上面这个程序片段中,配置了2行3列的二维数组对象,由于数据类型是int,所以数组元素的预设元素为0。
来细究一下二维数组的配置细节,其实arr[0]、arr[1]是两个一维数组对象,其长度各为3,而arr类型是int[] [],内容值为arr[0]与arr[1]。其关系如图5-1所示。
图5-1 二维数组的配置关系
从图5-1中可以看到,arr引用int[] []类型的对象,内容包括arr[0]与arr[1],而arr[0]与arr[1]再分别引用一个一维数组对象,这也就是范例5.5使用的arr.length与arr[0].length所表示的长度意义。有了数组配置的观念,可以改写范例5.5为范例5.6,让程序中的一维数组变量foo来依次取出arr[0]与arr[1]中的每个元素值,执行结果是相同的。
Ü 范例5.6 TwoDimArray2.java
public class TwoDimArray2 {
public static void main(String[] args) {
int[][] arr = {{1, 2, 3},
{4, 5, 6}};
int[] foo = arr[0];
for(int i = 0; i < foo.length; i++) {
System.out.print(foo[i] + " ");
}
System.out.println();
foo = arr[1];
for(int i = 0; i < foo.length; i++) {
System.out.print(foo[i] + " ");
}
System.out.println();
}
}
如果在使用new配置二维数组后想要一并指定初值,则可以编写如下:
int[][] arr = new int[][] {{1, 2, 3},
{4, 5, 6}};
同样的道理,也可以定义三维以上的数组,如果要定义同时初始元素值,可以使用以下的简便语法:
int[][][] arr = {
{{1, 2, 3}, {4, 5, 6}},
{{7, 8, 9}, {10, 11, 12}}
};
上面这个程序片段所定义的三维数组是2×2×3,您将之想象为两面2×3二维数组交叠在一起就是了。每一面的元素如图5-2所示。
图5-2 三维数组的配置关系
如果要动态定义三维数组,就使用以下的语法:
int[][][] arr = new int[2][2][3];
三维以上的更多维数组的定义,在Java中也是可行的,但并不建议使用。使用多维数组会让元素索引的指定更加困难,此时适当地将数据加以分割,或是使用其他的数据结构来解决,会比直接定义多维数组实在。
通过以上的说明,接下来讨论“不规则数组”。数组的维度不一定要是四四方方的,您也可以制作一个二维数组,而每个维度的长度并不相同。范例5.7是一个简单的示范。
Ü 范例5.7 TwoDimArray3.java
public class TwoDimArray3 {
public static void main(String[] args) {
int arr[][];
arr = new int[2][];
arr[0] = new int[3];
arr[1] = new int[5];
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++)
arr[i][j] = j + 1;
}
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
}
}
}
这个例子只是先前说明的概念延伸,在这个例子中,数组第一行的长度是3,而第二行的长度是5。执行结果如下:
1 2 3
1 2 3 4 5
程序编写风格:
在定义二维数组时,也可以使用int arr[][]这样的定义方式。这种定义方式源于C/C++中对数组定义的语法,不过在Java中建议使用int[][] arr这样的定义方式。同样地,也可以使用int arr[][][]这样的方式定义三维数组。