一、第五章数组

数组是最为常见的一种数据结构,是相同类型的用一个材标识符封装到一起的基本类型数据序列或对象序列。可以用一个统一的数组名和下标来唯一确定数组中中的元素。实质上,数组是一个简单的线性序列,因此访问速度很快。

2b4bf11ffb4b4361835cd230ad9195ce.png

一、数组概述

数组是具有相同数据类型的一组数据的集合。例如, 球类的集合--足球、篮球、羽毛球等;电器集合--电视机、洗衣机、电风扇等。在程序设计中, 可以将这些集合称为数组。数组中的每个元 素具有相同的数据类型。在 Java 中同样将数组看作一个对象,虽然基本数据类型不是对象,但由基本数据类型组成的数组却是对象。在程序设计中引入数组可以更有效地管理和处理数据。可根据数组的维数将数组分为一维数组、二维数组……

二、一维数组

在程序中可以使用下标变量,即说明这些变量的整体为数组,数组中的每个变量的数据类型是相同的。当数组中每个元素都只带有一个下标时,称这样的数组为一维数组。一维数组是由数字组成的以单纯的排序结构排列的结构单一的数组。一维数组是计算机程序中最基本的数组。二维及多维数组可以看作是一维数组的多次叠加产生的。

(1)创建一维数组

数组作为对象允许使用 new 关键字进行内存分配2。在使用数组之前,必须首先定义数组变量所属的类型。一维数组的创建有两种形式。

1.先声明,在用new关键字进行内存分配

声明一维数组有下列两种方式:

数组元素类型 数组名字[];

数组元素类型[] 数组名字;

数组元素类型决定了数组的数据类型,它可以是Ja wa 中任意的数据类型,包括简单类型和组合类型。数组名字为一个合法的标识符,符号“[]”指明该变量是一个数组类型变量。单个“[]”表示要创建的数组是一个一维数组。

声明一维数组,代码如下:

int arr[];                              //声明 int 型数组,数组中的每个元素都 都是int 型数值

声明数组后,还不能立即访问它的任何元素,因为声明数组只是给出了数组名字和元素的数据类型,要想真正使用数组,还要为它分配内存空间。在为数组分配内存空间时必须指明数组的长度。为数组分配内存空间的语法格式如下:

数组名字 = new      数组元素的类型[数组元素的个数];

数组名字:

被连接到数组变量的名称。

数组元素的个数:

指定数组中变量的个数,即数组的长度。

通过上面的语法可知,使用 new 关键字为数组分配内存4时,必须指定数组元素的类型和数组元素的个数,即数组的长度。

为数组分配内存,代码如下:

arr=new int[5];

以上代码表示要创建一个含有5个元素的整型数组,并且将创建的数组对象赋给引用变量arr,即通过引用变量 ar 来引用这个数组。

arr 为数组名称,方括号“[]”中的值为数组的下标。数组通过下标来区分数组中不同的元素。数组的下标是从0开始的。由于创建的数组 arr 中有5个元素,因此数组中元素的下标为 0~4。

2.声明的同时为数组分配内存

这种创建数组的方法是将数组的声明和内存的分配合在一起执行。语法如下:

数组元素的类型   数组名 =new   数组元素的类型[数组元素的个数];

声明并为数组分配内存,代码如下:

int   month[]=new  int[12]

上面的代码创建数组month,并指定了数组长度为12。

(2)初始化一维数组

组与基本数据类型一样可以进行初始化操作。数组的初始化可分别初始化数组中的每个元素。数组的初始化有以下两种方式:

int arr[]= new int[]{1,2,3,5,25}; //第一种初始化方式 

int arr2[]= {34,23,12,6}; //第二种初始化方式 

从中可以看出,数组的初始化就是包括在大括号之内用逗号分开的表达式列表。用逗号(,)分割数组中的各个元素,系统自动为数组分配一定的空间。用第一种初始化方式,将创建5个元素的数组其元素依次为1、2、3、5、25。第二种初始化方式,会创建4个元素的数组,其元素依次为34、23、12、6。

(3)使用一维数组

使用一维数组输出 1~12 月每个月份的天数

mnth 在项目中创建 GetDay 类,在主方法中创建并初始化一 个用于存储 1~12 月每个月份天数的int型数组,在控制台上输出 1~12 月每个月份的天数。实例代码如下:

a88e1846a5964606b8c17049f2eca31e.png

 三、二维数组

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。

(1)创建二维数组

1.先声明,再用new关键字进行内存分配

2.声明的同时为数组分配内存

(2)初始化二维数组

二维数组的初始化与一维数组初始化类似,同样可以使用大括号完成。 语法如下:

type arrayname[][] ={value1,value2,...,valuen};

type:数组数据类型。

arrayname:数组名称,一个合法的标识符。

 value:二维数组中各元素,都代表一个一维数组。

初始化二维数组,代码如下:

int myarr[][]= {{12,0},{45,10}};

初始化二维数组后,要明确数组的下标都是从0开始。例如,上面的代码中 myarr[1][1]的值为10。 int型二维数组是以inta[][]来定义的,所以可以直接给 a[x][y]赋值。例如,给 a[1]的第2个元素赋值的语句如下:

a[1][1] = 20

(3)使用二维数组

上维数组在实际应用中用得非常广泛。下面的实例就是使用二维数组输出一个3行4列且所有元素都是0的矩阵。

输出一个3行4列且所有元素都为0的矩阵

项目中创建Matrix类,在主方法中编写代码实现输出一个3行4列且所有元素都为0的矩阵。实例代码如下:

356a706629874f658fc45ca7d6171b5d.png

 四、数组的基本操作

(1)遍历数组

遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for 循环来实现。遍历一维数组很简单,也很好理解。

遍历二维数组需使用双层for 循环,通过数组的 length 属性可获得数组的长度。 

呈梯形输出二维数组中的元素

在项目中创建 Trap 类,在主方法中编写代码, 定义二维数组,将二维数组中的元素呈梯形输出。 实例代码如下:

7e2a3d488b5a4707b768a8bdb2ddd475.png

 在遍历数组时,使用 foreach 语句可能会更简单。

使用 foreach 语句遍历二维数组

在项目中创建 Tautog 类,在主方法中定义二维数组,使用 foreach 语句通遍历二维数组。实例代码如下:

15b36a7d43a04362b5a0fb741f7a0cf7.png

(2) 填充替换数组元素

数组中的元素定义完成后,可通过Aarrays类的静态方法 fill()来对数组中的元素进行替换。该方法通过各种重载形式可完成对任意类型的数组的替换。fillo方法有两种参数类型。

1.fill(int[] a,int vaiue)

该方法可以将指定的int值分配给int型数组的每个元素。

a:要进行元素替换的数组。

vaiue:要存储数组中所有元素的值。

使用fill()方法填充数组元素

在项目中创建类,在主方法中创建一维数组,并实现通过fill()方法填充数组元素,最后将数组中的哥个元素输出。

8c90dfddcf3e40808e35d907f82954c8.png

2.fill(int[]a,int  fromlndex  ,int  toindex  ,int  vaiue)

该方法将指定的int值分配给 int 型数组指定范围中中的每个元素。填充的范围从索引 fromlndex(包括)一直到索引 toIndex(不包括)。如果 fromIndex= toIndex,则填充范围为空。

 a:要进行填充的数组。

1fromIndex:要使用指定值填充的第一个元素的索引(包括)。

toIndex:要使用指定值填充的最后一个元素的索引(不包括)。

value:要分配给数组指定范围中的每个元素的值。

在项目中创建类,创建一维数组,并通过 fill()方法替换数组元素,最后将数组中的各个元素输出。

b110083947cd408aa732195bd05239e8.png

 (3)对数组进行排序

通过 Arrays 类的静态方法 sort()可以实现对数组的排序。sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序。其中,object 是指进行排序的数组名称。

使用 sort()方法将数组排序后输出

在项目中创建 类,在主方法中创建一维数组组,将数组排序后输出。实例代码如下:

c66d6c9e2f2b49e989c0d6b6e11a0292.png

 (4)复制数组

Arrays 类的 copyOf()方法与copyOfRange()方法可以实现对数组的复制。copyOf()方法是复制数组至指定长度,copyOfRangeO方法则将指定数组的指定长度复制到一个新数组中。

1. copyOf()方法

该方法提供了多种重载形式,用于满足不同类型数组的复制。

arr:要进行复制的数组。

newlength:int型常量,指复制后的新数组的长度。如果新数组的长度大于数组 arr 的长度,则用0填充(根据复制数组的类型来决定填真充的值,整型数组用0填充,char 型数组则使用 null 来填充);如果复制后的数组长度小于数救组 arr 的长度,则会从数组arr 的第一个元素开始截取至满足新数组长度为止。

复制数组

在项目中创建类,在主方法中创建一维数组,实现将将此数组复制得到一个长度为5的新数组,并将新数组输出。实例代码如下:

b106486378db46ceb23df7e89b7ab6ed.png

 2.copyOfRange()方法

arr:要进行复制的数组对象。

formIndex:指定开始复制数组的索引位置。formIndex必须在0至整个数组的长度之间。新数组包括索引是formIndex的元素。

toIndex:要复制范围的最后索引位置。可大于数组 arr 的长度。新数组不包括索引是 tolndex的元素。

按照索引复制数组

在项目中创建类,在主方法中创建一维数组,并将数组中索引位置是 0~3的元素复制到新数组中,最后将新数组输出。实例代码如下:

fc15dc8955cd46fb8411551ca5f38df4.png

(5) 查询数组

Arrays 类的 binarySearchO)方法,可使用二分搜索法来搜索指定数组,以获得指定对象。该方法返回要搜素元素的索引值。binarySearchO方法提供了多种重载形式,用于满足各种类型数组的查找需要。 binerSearch))方法有两种参数类型。

1. binarySearch(Object|] a, Object key)

 a:要搜索的数组。

key:要搜索的值。

如果 key 包含在数组中,则返回搜索值的索引; 否则返回-1或“_”(插入点)。插入点是搜索键将 要插入数组的那一点,即第一个大于此键的元素索引。

查找元素在数组中的索引位置

在项目中创建类,在主方法中创建一维数组ia,实现查找元元素4在数组中的索引值置。实例代码如下:

5df56aae3ef14c6a960a39e4efdd68a9.png

 2. binarySearch(Object[ a, int fromlndex, int tolndex, Object key)

该方法在指定的范围内检索某一元素。

a:要进行检索的数组。

fromIndex:指定范围的开始处索引(包含)。

toIndex:指定范围的结束处索引(不包含)。

key:要搜索的元素。

在使用该方法前,同样要对数组进行排序,这样才能获得准确的索引值。如果要搜索的元素 key在指定的范围内,则返回搜索键的索引;否则返回-1或“_”(插入点)。如果范围中的所有元素都小于指定的键,则插入点为toIndex(注意,这保证了当且仅当此键被找到时,返回的值将大于等于0)。

在指定范围内查找元素在数组中的索增引位置

在项目中创建类,在主方法中创建 String数组,实现查找元素“cd”在指定范围的数组 str中的索引位置。实例代码如下:

1c6d9585755c43de9de27b7f4eef538a.png

 五、数组排序算法

数组有很多常用的算法,冒泡排序、直接选择排序和反转排序。

(1)冒泡排序

冒泡排序

在项目中创建BubbleSort类,这个类的代码将对一个int 型的一维数组中的元素进行冒泡排序。实 例代码如下:

35ff5722ce0145429e9f53957709e639.png

 (2)直接选择排序

直接选择排序

在项目中创建 SelectSort类,这个类的代码将对一个in t 型的一维数组中的元素进行直接选择排序。定制代码如下

0828e2066b6e40ce892d9a7ba5061156.png

 (3)反转排序

反转排序

在项目中创建 ReverseSort 类,这个类的代码将对一个 int 型的一维数组中的元素进行反转排序。实例代码如下:

a70ad4ef8e0f43819778eacad066dbfa.png

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值