Java开发笔记(二十一)二维数组的扩展
前面介绍的数组容纳的是一串数字,仿佛一根线把这组数字串了起来,故而它只是一维数组。一维数组用来表示简单的数列尚可,要是表达复杂的平面坐标系,那就力不从心了。由于平面坐标系存在水平和垂直两个方向,因此可用二维数组来保存平面坐标系上的一组坐标顶点,其中第一维是顶点队列,第二维是顶点的横纵坐标。许多个平面组合起来变成一幅动画,每个平面都构成动画的一个帧,这样就形成了三维数组。二维数组、三维数组,乃至更多维度的数组,统称为多维数组。多维数组全由一维数组扩展而来,它们的用法大同小异,因而只要学会如何使用二维数组,即可举一反三运用其他多维数组。下面就以二维数组为例,统一介绍多维数组的常见用法。
如同一维数组那样,二维数组也有两种声明形式,一种是在变量名称后面添加两对方括号,例如“double triangle[][]”;另一种是在类型后面添加两对方括号,例如“int[][] triangle”。前述的二维数组triangle表示平面坐标系上的三角形,其中第一对方括号表示这个三角形有几个顶点,第二对方括号表示每个顶点由几个坐标方向构成。
给二维数组分配存储空间也有三种方式,分别说明如下:
1、利用语句“new 变量类型[顶点数量][方向数量]”分配空间,比如三角形triangle有三个顶点,每个顶点由横纵两个坐标方向组成,则可通过下面这行语句实现:
// 在两对方括号内分别填入数字,表示数组有多少行多少列 triangle = new double[3][2];
2、在分配存储空间的时候立即对数组进行初始化赋值,此时方括号中间不填数字,而在方括号后面添加花括号,并且花括号内部是以逗号分隔的几个一维数组。此时初始化赋值的代码如下所示:
// 方括号内留空,然后紧跟花括号,花括号内部是以逗号分隔的几个一维数组 double[][] triangle = new double[][]{ new double[]{-2.0, 0.0}, new double[]{0.0, -1.0}, new double[]{2.0, 1.0} };
3、可见上面的第二种写法实在啰嗦,完全可以参照一维数组的简化写法,把多余的“new double***”统统去掉,于是整个初始化代码精简如下:
// 赋值等号右边直接跟着花括号,花括号又内嵌好几个花括号分别表示对应的一维数组 double[][] triangle = { {-2.0, 0.0}, {0.0, -1.0}, {2.0, 1.0} };
以上的赋值等号右边直接跟着花括号,花括号里面又有三组花括号,每组花括号分别容纳两个数字。这便告诉编译器:该二维数组需要分配三个顶点,并且每个顶点都有两个坐标方向。
若要获取二维数组里面的某个元素,可采取“数组名称[元素行号][元素列号]”的形式,表示当前操作的是第几行第几列的数组元素。与一维数组不同的是,对于二维数组来说,“数组名称.length”不能获得所有元素的数量,而是获得该数组的行数;要想获取某行的列数,则需通过“triangle[行号].length”来得到,把所有行的列数累加起来,才能求得该二维数组的元素个数。下面是声明一个浮点型的二维数组,并对每个数组元素赋值,最后遍历打印各元素的完整代码例子:
// 以下是声明二维数组的第一种形式:“变量类型 数组名称[][]” double triangle[][]; // 以下是分配二维数组空间的第一种形式 // 在两对方括号内分别填入数字,表示数组有多少行多少列 triangle = new double[3][2]; // 数组名称后面的“[数字1][数字2]”,就是数组元素的行列下标,表示当前操作的是第几行第几列的数组元素 triangle[0][0] = -2.0; triangle[0][1] = 0.0; triangle[1][0] = 0.0; triangle[1][1] = -1.0; triangle[2][0] = 2.0; triangle[2][1] = 1.0; // 下面通过循环语句依次读出数组中的所有元素。 // “二维数组名称.length”表示获取该数组的行数 for (int i=0; i<triangle.length; i++) { // “triangle[i].length”表示获取该数组第i行的列数 for (int j=0; j<triangle[i].length; j++) { // 打印第i行第j列的数组元素 System.out.println("triangle["+i+"]["+j+"]="+triangle[i][j]); } }
上述示例代码中的二维数组,存放了平面坐标系上的三个顶点,它们的坐标分别是(-2.0, 0.0)、(0.0, -1.0)、(2.0, 1.0)。这三个坐标点构成了一个三角形的三个顶点,正如下图所示的A点(坐标为(-2,0))、B点(坐标为(0,-1))、C点(坐标为(2,1))。
看到了熟悉的平面坐标图,这下平面几何的知识可派上用场了,例如根据两点的坐标来计算两点之间的距离。既然三角形有三个顶点A、B、C,接下来不妨计算它的三条边长,包括AB、AC和BC三条边的长度。于是分别求得两个顶点在横轴方向的距离,以及在纵轴方向的距离,然后利用勾股定理算出连接两顶点的斜边长度。以下便是由二维数组保存的坐标数值求解三角形各边长的演示代码:
// 下面通过循环语句依次计算三角形每条边的长度 // 假设第一个数组元素代表点A,第二个数组元素代表点B,第三个数组元素代表点C, // 则本循环将依次求得AB、AC、BC这三条边的长度 for (int i=0; i<triangle.length-1; i++) { for (int j=i+1; j<triangle.length; j++) { // 获取两个顶点在横轴方向的距离 double xDistance = Math.abs(triangle[j][0] - triangle[i][0]); // 获取两个顶点在纵轴方向的距离 double yDistance = Math.abs(triangle[j][1] - triangle[i][1]); // 根据勾股定理计算连接两顶点的斜边长度 double distance = Math.sqrt(xDistance*xDistance + yDistance*yDistance); System.out.println("i="+i+",j="+j+",distance="+distance); } }
运行上述的演示代码,打印出来的三角形边长计算结果如下所示:
i=0,j=1,distance=2.23606797749979 i=0,j=2,distance=4.123105625617661 i=1,j=2,distance=2.8284271247461903