在 Java 中创建多维数组也很方便:
//:c04:MultiDimArray.java
// Creatingmultidimensional arrays.
import com.bruceeckel.simpletest.*;
import java.util.*;
public class MultiDimArray {
static Test monitor = new Test();
static Random rand = new Random();
public static void main(String[] args) {
int[][] a1 = {
{ 1, 2, 3, },
{ 4, 5, 6, },
};
for(int i = 0; i < a1.length; i++)
for(int j = 0; j < a1[i].length; j++)
System.out.println(
"a1[" + i + "][" + j + "] = " + a1[i][j]);
// 3-D arraywith fixed length:
int[][][] a2 = new int[2][2][4];
for(int i = 0; i < a2.length; i++)
for(int j = 0; j < a2[i].length; j++)
for(int k = 0; k < a2[i][j].length; k++)
System.out.println("a2[" + i + "][" + j + "][" +
k + "] = " + a2[i][j][k]);
// 3-D arraywith varied-length vectors:
int[][][] a3 = new int[rand.nextInt(7)][][];
for(int i = 0; i < a3.length; i++) {
a3[i] = new int[rand.nextInt(5)][];
for(int j = 0; j < a3[i].length; j++)
a3[i][j] = new int[rand.nextInt(5)];
}
for(int i = 0; i < a3.length; i++)
for(int j = 0; j < a3[i].length; j++)
for(int k = 0; k < a3[i][j].length; k++)
System.out.println("a3[" + i + "][" + j + "][" +
k + "] = " + a3[i][j][k]);
// Array ofnonprimitive objects:
Integer[][] a4 = {
{ new Integer(1), new Integer(2)},
{ new Integer(3), new Integer(4)},
{ new Integer(5), new Integer(6)},
};
for(int i = 0; i < a4.length; i++)
for(int j = 0; j < a4[i].length; j++)
System.out.println("a4[" + i + "][" + j +
"] =" + a4[i][j]);
Integer[][] a5;
a5 = new Integer[3][];
for(int i = 0; i < a5.length; i++) {
a5[i] = new Integer[3];
for(int j = 0; j < a5[i].length; j++)
a5[i][j] = new Integer(i * j);
}
for(int i = 0; i < a5.length; i++)
for(int j = 0; j < a5[i].length; j++)
System.out.println("a5[" + i + "][" + j +
"] =" + a5[i][j]);
// Output test
int ln = 0;
for(int i = 0; i < a3.length; i++)
for(int j = 0; j < a3[i].length; j++)
for(int k = 0; k < a3[i][j].length; k++)
ln++;
monitor.expect(new Object[] {
"a1[0][0]= 1",
"a1[0][1]= 2",
"a1[0][2]= 3",
"a1[1][0]= 4",
"a1[1][1]= 5",
"a1[1][2]= 6",
new TestExpression(
"%%a2\\[\\d\\]\\[\\d\\]\\[\\d\\] = 0", 16),
new TestExpression(
"%%a3\\[\\d\\]\\[\\d\\]\\[\\d\\] = 0", ln),
"a4[0][0]= 1",
"a4[0][1]= 2",
"a4[1][0]= 3",
"a4[1][1]= 4",
"a4[2][0]= 5",
"a4[2][1]= 6",
"a5[0][0]= 0",
"a5[0][1]= 0",
"a5[0][2]= 0",
"a5[1][0]= 0",
"a5[1][1]= 1",
"a5[1][2]= 2",
"a5[2][0]= 0",
"a5[2][1]= 2",
"a5[2][2]= 4"
});
}
} ///:~
注意打印部分的代码中使用了 length,所以它不会依赖于固定数组的大小。
第一个例子演示了基本数据类型的多维数组。你可用花括号标出数组中的每个向量:
int[][] a1 = {
{ 1, 2, 3, },
{ 4, 5, 6, },
};
每对方括号都会帮你访问下一级数组。
第二个例子用new 分配了一个三维数组。这里整个数组分配是一次完成的:
int[][][] a2 = new int[2][2][4];
第三个例子表明,数组中用以构成矩阵的那些向量可以有任意的长度:
int[][][] a3 = new int[rand.nextInt(7)][][];
for(int i = 0; i < a3.length; i++) {
a3[i] = new int[rand.nextInt(5)][];
for(int j = 0; j < a3[i].length; j++)
a3[i][j] = new int[rand.nextInt(5)];
}
第一个 new 创建了数组,其第一维的长度是由随机数确定的,其他维的长度则没有定义。
位于 for 循环内的第二个 new 则会决定第二维的长度,直到碰到第三个 new,第三维的长度
才得以确定。
通过输出结果可见:如果没有明确指定初始化值,数组值就会自动置为零。
你可以用类似的方式处理非基本类型的对象数组。第四个例子演示了用花括号把多个 new
表达式组织到一起的能力:
Integer[][] a4 = {
{ new Integer(1), new Integer(2)},
{ new Integer(3), new Integer(4)},
{ new Integer(5), new Integer(6)},
};
第五个例子展示了如何逐步创建非基本类型的对象数组:
Integer[][] a5;
a5 = new Integer[3][];
for(int i = 0; i < a5.length; i++) {
a5[i] = new Integer[3];
for(int j = 0; j < a5[i].length; j++)
a5[i][j] = new Integer(i*j);
}
i*j 只是为了在 Integer里放入一个有趣的值。
![](http://www.jiangyea.com/boke/00.jpg)