课时27:二维数组
摘要:本次分享的主题是二维数组。主要分为两个部分:
1.传统的数组
2.二维数组在程序中的定义语法
接下来看一下二维数组的概念。什么叫做二维数组?在之前所定义的数组中,大家会发现只有一个中括号。所以那个时候的数组就好像是一行数据一样。那么可以利用所谓的索引,也就是下标来访问这行数据。
01.传统的数组
那么现在来观察什么?首先来看传统的数组,它就像是一行数据。在这里简单地做一个下标操作的控制示例。比如在这里写上 82 ,然后在其后放一个数字 2 作为示例。第一个数字表示下标,下标实际上就是用来访问数组的索引。第二个数字则是实际存储的数据,在整个过程中下标的划分是从 0 开始的,依次是 0 、 1 、 2 、 3 、 4 、 5 、 6 ,数据就随便写几个作为示例。并且代码已经写完了。
如果现在把数据放在这里,就会有一个最直接的问题。首先在操作过程中下标是由系统来维护的,所以不需要去改动它,而数据则是由自己设置的,那么如果现在想找到 789 这个数据,那么只需要知道找到一个数据只需要确定一个下标即可,而之前所理解的可以称之为一维数组。
那么什么是二维数组?如果你现在需要一个多行多列的结构会想到什么?一定是表的结构。在这种情况下就需要通过两个坐标,也就是两个下标才能描述出一个具体的数据位置。
以这个程序为例来说明。比如现在稍微增加一些内容,先在这写上0 。接着在这个位置写上 2 。我们仍然会在这部分设置一些具体的数据,随便写一些作为示例,仅供演示之用。
假设现在在这段代码中想要确定 756 这个数据,如果想要确定这个数据,在整个代码中需要知道它是在哪一行、哪一列。并且需要行下标与列下标共同来确定一个数据的位置。这样才能准确地找到它。
因此这种数组形式就被称为二维数组。如果一个数组后面有两个中括号,那么它就是二维数组。那么什么叫三维数组?想象一下脸是不是一个三维的物体?三维就是具有立体面的。同理三维数组就是在二维数组的基础上再增加一个维度,希望你们能理解这个含义。
02.二维数组在程序中的定义语法
首先来看第一点,即数组的动态初始化。接着再看数组的静态初始化。对于动态初始化代码可以这样写:首先指定数据类型,然后给出数组的名称,接着是两个中括号,之后使用 New 关键字加上数据类型,并指定行数和列数。而对于静态初始化则是直接指定数据类型和数组名称,并通过花括号内的一系列数据来初始化数组。
接下来将写出完整的语法,而不是简化语法。使用 New 关键字后跟上数据类型和中括号就可以进行数组的初始化。在这个位置还可以继续追加若干个数据元素。这个过程就构成了数组的静态初始化,如果单独来看的话就会有一个问题:这每一行是不是又可以看作是一个数组,如果单独观察每一行其实就相当于一个数组元素。所以大家发现所谓的二维数组,其实就是对数组进行了嵌套。
接下来将在这个过程中定义二维数组,但这里不做重点讲解,因为二维数组不是本次课程的重点。其代码可以这样写:首先声明一个Int 类型的二维数组变量 Date ,然后使用 New Int 来分配内存空间,并指定行数和列数。最后在代码中填充我们所需的操作数据。
public class ArrayDemo { public static void main(String args[]){ int data[] } }
首先在这段程序代码中可以这样写:先列出 12345 ,这是一个包含五个元素的序列,然后再列出 123 和 5678 。那么你们注意到这些数据排列的规则了吗?其实它们并不规则,但现在并不考虑这一点,只是想给大家做一个正常的演示。
从这段数据中可以看出最多有五列数据,而行数则是三行。所以可以简单地把这个数据结构画下来:最多五列,这里是三行数据。那么根据这样的数据结构来说,这个地方需不需要添加索引?答案是需要的。那么就可以这样设定:六列对应三行数据。所以 4 号是 6 月 4 号。那么第一个要描述的是整个过程中使用的索引。
索引实际上就是下标,这两个概念在大多数情况下是相通的,通常不会强制区分索引和下标,大家习惯上认为它们是一个意思就可以了。
这是其中一组操作示例。在索引方面首先要注意的是为了后续内容的清晰展示会稍微改变一下底色,以便区分。
现在来看索引:首先是 0 、 1 、 2 、 3 、 4 ,然后是 0 、 1 、2 。观察这个结构,第一个数组是 12345 ,它是不是全齐的? 12345 放在这里,第二个数组是 123 ,它位于前面,紧接着后面的是 5678 。到现在为止应该已经大致清楚了当前这个数组的形式。
首先这块区域是没有数据的,按照刚才所说的既然二维数组的每一行都可以看作是一个数组,那么在这种情况下就可以通过每一行的数组来求出该行的数组长度。所以现在可以这样来思考:之前一个中括号用一个 For 循环来遍历,那么现在有两个中括号就需要用两个 For 循环来遍历。
0x 现在小于之前的 Date.length x++ 。完成这一步后,在当前的代码中使用 For 循环的 Int y ,再跟上 Oy ,并且 Oy 小于Date x,那么它的文字对吗?在X++之后,也要求Y++,注意别写错了,这个经常会误写成X。之后先这样写一个输出语句,关于 X 需要写得稍微详细一点。
在这个位置找到一个叫做 Y 的变量,那么 Y 应该等于什么?现在加上一个叫做 Date 的变量,后面跟上 Y 。然后在后面加一个换行符,也叫做换行。
现在写完之后来看一下结果,编译并运行一下。大家看数据是不是已经出来了?所以说这就是一个二维数组,对二维数组的输出肯定需要进行两次循环过程。但是这种不规则的二维数组,一般不建议大家使用。如果现在要求使用For 循环来进行输出,该怎么办?那么会很复杂吗?
首先已经知道了二维数组的本质是数组中的数组,那么这样写行不行?看这里 Int Temp 等于: Date 是什么意思?是想要获取第一行的数组元素,于是再跟上 For 循环,而 Int Num 用于遍历这些元素。
那么在代码中可以这样写:使用 System.out.print ,在这个过程中遍历每一个 Num ,并在其后加上一个顿号,然后加上一个换行符。按照刚才所说的二维数组就是数组的数组。现在在代码中再次编译并执行。如果成功了那么你们也可以完成这个任务。所以通过 For-each 输出格式可以清楚地观察到二维数组其实就是数组的嵌套使用。
随着开发技术的不断发展,当进行应用层的程序开发时,而这里的应用层程序开发指的是那些不需要过多涉及底层细节,只需按照既定流程编写代码的开发工作。在这样的场景下很少会用到二维数组,更不用说更高维度的数组,比如三维数组或多维数组。
或许有同学会问如果真的遇到三维数组怎么办?那就需要三层循环来处理,这无疑会增加整个程序的复杂度。所以就目前的开发需求而言,二维数组的使用相对较少,不必将其视为重点学习内容。但是至少大家应该知道包含两个或两个以上中括号的数组都被称为多维数组。