前面介绍的数组容纳的是一串数字,仿佛一根线把这组数字串了起来,故而它只是一维数组。一维数组用来表示简单的数列尚可,要是表达复杂的平面坐标系,那就力不从心了。由于平面坐标系存在水平和垂直两个方向,因此可用二维数组来保存平面坐标系上的一组坐标顶点,其中第一维是顶点队列,第二维是顶点的横纵坐标。许多个平面组合起来变成一幅动画,每个平面都构成动画的一个帧,这样就形成了三维数组。二维数组、三维数组,乃至更多维度的数组,统称为多维数组。多维数组全由一维数组扩展而来,它们的用法大同小异,因而只要学会如何使用二维数组,即可举一反三运用其他多维数组。下面就以二维数组为例,统一介绍多维数组的常见用法。
如同一维数组那样,二维数组也有两种声明形式,一种是在变量名称后面添加两对方括号,例如“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

  

Java开发笔记(二十一)二维数组的扩展的更多相关文章

  1. Java开发笔记(一百二十一)AWT输入框

    前面介绍了文本标签Label,该控件展示的文字是不可编辑的,若要用户在界面上输入文本,就得使用专门的编辑框控件.在AWT的控件家族当中,用作编辑框的有两种控件,分别是单行输入框TextField和多行 ...

  2. Java开发笔记(一百二十五)AWT图像加工

    前面介绍了如何使用画笔工具Graphics绘制各种图案,然而Graphics并不完美,它的遗憾之处包括但不限于:1.不能设置背景颜色:2.虽然提供了平移功能,却未提供旋转功能与缩放功能:3.只能在控件 ...

  3. Java开发笔记(九十二)文件通道的基本用法

    前面介绍的各色流式IO在功能方面着实强大,处理文件的时候该具备的操作应有尽有,可流式IO在性能方面不尽如人意,它的设计原理使得实际运行效率偏低,为此从Java4开始增加了NIO技术,通过全新的架构体系 ...

  4. Java开发笔记(一百二十)AWT文本标签

    前面介绍了AWT窗口及其面板的简单用法,其中展示出来的控件只有按钮一种,还有很多好用好玩的控件有待介绍.首先是文本标签Label,该控件用于显示一段平铺文本,它不花哨也不跳动,完全就是素面朝天的文本字 ...

  5. Java开发笔记(一百二十二)AWT选择框

    前面介绍了两种文本输入框的用法,不过实际应用很少需要用户亲自文字,而是在界面上列出几个选项,让用户勾勾点点完成选择,这样既方便也不容易弄错.依据选择的唯一性,可将选项控件分为两类:一类是在方框中打勾的 ...

  6. Java开发笔记(一百二十三)AWT图像视图

    前面介绍了AWT的几种基础控件,从按钮到文本标签,从输入框到选择框,无一例外都能显示文字,唯独无法显示某张图片文件.本以为AWT会提供专门的控件来显示图片,然而偏偏没有意料之中的图像控件,这可真是弱爆 ...

  7. Java开发笔记(一百二十四)AWT绘图操作

    前面介绍了如何使用画笔在控件上展示图像,可是图像来源于磁盘图片,无法即兴绘制个性化的图案.所幸画笔工具Graphics不仅能够描绘图像,还支持绘制常见的几何形状,也支持绘制文本字符串,除了绘制图像用到 ...

  8. Java开发笔记(一百二十六)Swing的窗口

    前面介绍了AWT界面编程的若干技术,在编码实践的时候,会发现AWT用起来甚是别扭,它的毛病包括但不限于下列几点:1.对中文的支持不好,要想在界面上正常显示汉字,还得在运行时指定额外的运行参数“-Dfi ...

  9. Java开发笔记(一百二十七)Swing的标签

    提起AWT的标签控件Label,那个使用体验可真叫糟糕,不但不支持文字换行,而且对中文很不友好,既可能把中文显示为乱码,还不支持博大精深的各种中文字体.所幸Swing的升级版标签JLabel在各方面都 ...

  10. Java开发笔记(一百二十八)Swing的图标

    前面提过,AWT没提供能够直接显示图像的控件,这无疑是个令人诟病的短板,因为一上来就得由程序员自己去定义新控件,对于初学者来讲很不友好.这个问题在Swing中也解决掉了,不过Swing并未提供单独的图 ...

随机推荐

  1. 有关promise的技巧

    其实promise的作用是将异步的代码转化为同步,这里的异步指的是request1,request2.

  2. Linux常用服务器搭建

    1.Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于Internet上的控制文件 ...

  3. placeholde属性在IE10以下浏览器上的兼容方案

    首先,判断浏览器是否支持placeholder属性:目前经验来看placeholder属性在     IE10及以上   才能正常显示,而我们实际项目中往往要求兼容到   IE8 var input ...

  4. [Swift]LeetCode74. 搜索二维矩阵 | Search a 2D Matrix

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  5. 小程序webview实践

    小程序webview实践 -- 张所勇 大家好,我是转转开放业务部前端负责人张所勇,今天主要来跟大家分享小程序webview方面的问题,但我并不会讲小程序的webview原理,而我主要想讲的是小程序内 ...

  6. 雷达无线电系列(一)几种常见的幅度分布函数(matlab)

    文件下载地址: https://github.com/mufasa007/myblog/tree/master/%E9%9B%B7%E8%BE%BE%E6%97%A0%E7%BA%BF%E7%94%B ...

  7. Java9发布回顾Java 8的十大新特性

    java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9. 今天,我们先来一起复习一下2014年发布的Java 8的十大新特性.先来喝杯java~~~ 按 ...

  8. C# 使用 HttpClient 调用 WebService 提示 NoSOAPAction

    问题 在自行构造 HttpClient 请求 SOAP 接口之后,返回 500 错误,并且提示 NoSOAPAction 信息. 原因 造成这个问题的主要原因是因为缺少了 SOAPAction 标头, ...

  9. android 垃圾回收机制

    1.垃圾收集算法的核心思想 java语言提供了自动的GC机制,系统会经常检查内存,采用对象引用计数的方式,将引用次数为0的对象回收.这样可以防止两个危险:(1)防止无用对象占用内存资源 (2)防止有用 ...

  10. replugin插件化,插件转场动画失效的问题解决

    说明 随着应用功能的丰富,Android程序的安装包也逐渐变大,这成为应用程序现有框架下难以摆脱的瓶颈.所以引入了rePlugin插件化框架,将应用按功能拆分为插件,以此减小apk的大小并同时增加应用 ...