07数组.docx
- 文档编号:11038541
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:18
- 大小:28.49KB
07数组.docx
《07数组.docx》由会员分享,可在线阅读,更多相关《07数组.docx(18页珍藏版)》请在冰豆网上搜索。
07数组
第7章数组
数组用来储存一组同类型数据。
java系统把数组封装成一个对象。
7.1声明变量
在访问数组前,首先应声明一个引用数组(对象)的变量,然后,通过变量来访问数组元素。
注意:
当一个变量引用了数组后,这个变量名被看作数组名。
1.声明引用一维数组的变量
typebianvar[];//[]表示变量bianvar用来引用数组。
或者
type[]bianvar;//[]表示变量bianvar用来引用数组。
其中,type指定变量的数据类型,bianvar是声明的变量名,[]表示变量用来引用数组。
上面语句的作用是声明一个数据类型为type的变量(bianvar),该变量用来保存数组的地址。
数组元素的数据类型必须与变量的数据类型相同。
例如:
floatzhang[];//声明一个变量zhang,该变量引用的数组元素的数据类型是float
char[]cat;//声明一个变量cat,该变量引用的数组元素的数据类型是char
2.声明引用二维数组的变量
typebianvar[][];//声明一个变量bianvar,该变量引用一个二维数组,数组元素的数据类型是type。
或者
type[][]bianvar;
例如:
floata[][];//声明一个变量a,a引用的数组元素类型是float
char[][]d;//声明一个变量d,d引用的数组元素类型是char
数组元素的数据类型可以是Java的任何一种数据类型。
假如已经定义了一个People类,那么可以声明一个引用数组的变量zhang。
如下面的语句:
Peoplezhang[];
其中,变量zhang用来保存数组的地址。
该数组元素的数据类型是People。
7.2创建数组
创建数组就是为数组中的每一个元素分配内存空间。
1.创建数组的语句格式
(1)创建一维数组的语句格式
newtype[n]
其中,type指定数组元素的数据类型,n指定数组的个数。
例如:
floatzhang[]=newfloat[7];//声明变量zhang,并创建一个数组,将数组地址保存在zhang中
其中,表达式newfloat[7]的作用是创建一个数组(该数组包含7个元素,元素的数据类型是float),并返回数组的地址。
注意:
一定要分清创建数组与创建对象的格式之间的区别。
创建对象时,new后面是构造方法;创建数组时,new后面是数据类型加”[元素个数]”。
为了理解的方面,我们把引用数组的变量看做数组的名字。
(2)创建二维数组的语句格式
newtype[n][m];
执行上面的语句后,即可创建一个二维数组(包含n*m个元素,元素的数据类型是type)。
例如:
intmytwo[][]=newint[3][5];
该语句执行newint[3][5]后创建一个二维数组(包含15(3*5)个元素,元素的数据类型是int),数组的地址赋给变量mytwo。
2.变量与数组的内存模型
下面语句的作用是声明变量wang,创建一个数组(元素的数据类型是float,元素个数是3),将数组的地址赋给变量wang。
当变量保存了数组的地址时,称变量引用了数组,这个变量就是数组的名称。
floatwang[]=newfloat[3];
假设newfloat[3]创建数组后返回数组的地址是0x25B4,变量和数组的内存模型如图7-1所示。
图7-1内存模型
注意:
与C语言不同的是,Java在创建数组时允许使用int型变量指定数组的大小。
例如:
intsize=50;
doublenumber[]=newdouble[size];
图7-1中,数组的名称是wang。
7.3初始化数组
初始化数组,就是给数组元素赋初值。
创建数组后,如果没有给数组元素赋值,系统将为每个数组元素赋一个默认的值。
1.系统默认赋值
依据数组元素的数据类型不同,系统会给数组元素赋不同的默认值。
赋值规则如下:
(1)数组元素的类型是基本数据类型
●数组元素的数据类型是整型,则默认值是0。
●数组元素的数据类型是float,则默认值是0.0。
●数组元素的数据类型是boolean,则默认值是false。
●数组元素的数据类型是char,则默认值是’\u0000’。
(2)数组元素的类型是类
●数组元素的数据类型是类,则默认值是null。
例如,下面的语句执行后,系统给数组元素赋默认值false。
booleanzhang=newboolean[3];
2.显式赋值
下面的语句执行后,显式给每个元素赋值。
floatzhang[]={78.3f,55.77f,56.0f,89.2f};
上面的语句等价于下面的语句系列:
floatzhang[]=newfloat[4];
然后显式给每个元素赋值:
zhang[0]=78.3f;
zhang[1]=55.77f;
zhang[2]=56.0f;
zhang[3]=89.2f;
3.数组长度
数组是一个对象,对象包含一个成员变量length,该变量的值保存了数组的长度。
例如,下面的数组:
double[]myList={5.0,7.0,4.7,2.9,3.4};//该数组包含5个元素
在本例中,数组myList的长度是myList.length,即,长度是5.
7.4数组元素的表示
当用一个变量引用了数组后(变量保存了数组的地址码),就可以用变量名和数组元素下标来表示一个数组元素。
数组元素的下标编号是从0开始的。
例如,变量zhang引用了4个元素的数组。
intzhang=newint[4];
引用数组的变量是zhang,元素下标分别是0、1、2、3。
四个元素分别表示为:
zhang[0]、zhang[1]、zhang[2]、zhang[3]。
上面的数组中元素的最大编号是3,若访问不存在的元素,则语句将发生异常。
例如:
zhang[4]=88;//zhang[4]元素不存在
二维数组元素的表示类似于一维数组元素。
例如,声明变量a,通过a来引用二维数组。
其格式如下:
inta[][]=newint[2][3];//该数组可用矩阵表示为2行3列
该数组包含两个下标,第一个下标的变化范围从0到1;第二个下标的变化范围从0到2。
该数组包含6个元素,分别表示为a[0][0]、a[0][1]、a[0][2]、a[1][0]、a[1][1]、a[1][2]。
如果使用了下面的语句,将发生异常。
a[2][1]=38;a[0][3]=90;//元素a[2][1]、a[0][3]不存在
7.5数组排序
本节采用选择排序算法。
假设按照升序对一个列表排序。
选择排序算法是,在列表中找到最大的数,并将它放在列表的最后。
这样,剩下的数构成一个列表,在这个列表中选择最大的数,并将它放在列表最后。
这样,剩下的数构成一个列表,一直这样做下去,直到列表中只剩一个数为止。
假设数组inta[]有7个元素需要排序:
3947826
第一次,在数组元素a[0]~a[6]中找到最大的数9,并与最后位置的数6交换位置,得到下面的列表:
3647829
第二次,在数组元素a[0]~a[5]中找到最大的数8,并与最后位置的数2交换位置,得到下面的列表:
3647289
第三次,在数组元素a[0]~a[4]中找到最大的数7,并与最后位置的数2交换位置,得到下面的列表:
3642789
第四次,在数组元素a[0]~a[3]中找到最大的数6,并与最后位置的数2交换位置,得到下面的列表:
3246789
重复以上步骤,直到数组列表中只剩下一个元素为止。
例子7.1采用选择排序算法对数组进行排序。
程序清单7-1SelectionSort.java
publicclassSelectionSort
{
publicstaticvoidmain(String[]args)
{//数组初始化
double[]myList={5.0,4.4,1.9,2.9,3.4,3.5};
System.out.println("在排序前,数组是:
");printList(myList);//打印排序前的数组
selectionSort(myList);//对数组排序
System.out.println();
System.out.println("排序后的数组是:
");printList(myList);//打印排序后的数组
}
staticvoidprintList(double[]list)//打印数组的方法
{
for(inti=0;i System.out.println(); } staticvoidselectionSort(double[]list)//对数组排序的方法 {doublecurrentMax; intcurrentMaxIndex; for(inti=list.length-1;i>=1;i--)//外层循环,确定列表范围 { //在列表list[0]~List[i]找到一个最大的数, currentMax=list[i];//保存最大的数 currentMaxIndex=i;//保存最大数的下标号 for(intj=i-1;j>=0;j--)//内层循环,在列表范围查找最大的数及其下标号 { if(currentMax } //将最大数与最后位置的那个数list[i]进行交换 if(currentMaxIndex! =i){list[currentMaxIndex]=list[i];list[i]=currentMax;} } } } 7.6数组查找 查找就是在数组中查找特定元素的过程。 查找的算法有很多,在本节中讨论两种查找算法: 线性查找法和二分查找法。 7.6.1线性查找 线性查找法就是将要查找的关键字key与数组list[]中的元素逐个进行比较,直到在列表中找到与关键字匹配的元素,或者查完了列表后也没有找到要找的元素。 如果查找成功,返回与关键字匹配元素的下标号,如果没有找到,就返回-1. 例子7.2线性查找。 该程序创建一个包含10个int型的随机的数组,并显示它。 程序提示用户输入要查找的关键字,并进行线性查找。 程序清单7-2LinearSearch.java publicclassLinearSearch { publicstaticvoidmain(String[]args) { int[]list=newint[10]; //用随机数创建一个列表,并显示该列表 System.out.print("列表是"); for(inti=0;i {list[i]=(int)(Math.random()*100);System.out.print(list[i]+"");} System.out.println(); //提示用户输入关键字 System.out.print("请输入关键字"); intkey=MyInput.readInt(); intindex=linearSearch(key,list); if(index! =-1) System.out.println("关键字的下标号是: "+index); else System.out.println("在列表中没有这个关键字"); } //在列表中查找关键字的方法 publicstaticintlinearSearch(intkey,int[]list) { for(inti=0;i if(key==list[i])returni; return-1; } } 方法Math.random()生成大于或等于0.0,小于1.0的随机double型数。 匹配时,算法返回数组中第一个与关键字匹配的元素的下标号,不匹配时,返回-1。 7.6.2二分查找 使用二分查找法的前提是数组必须是已经排序好了。 假设数组按照升序排列。 该方法将关键字先与数组的中间元素比较,有以下三种情况出现: (1)关键字比中间元素小,则,只需在前半组元素中查找。 (2)关键字和中间元素相等,则匹配成功,查找结束。 (3)关键字比中间元素大,则,只需在后半组元素中查找。 用row和up分别标记当前查找数组的第一个和最后一个的下标。 初始条件下,row值是0,up值是list.length-1。 在下标为low~up列表中查找关键字的方法定义为 例子7.3二分查找。 该程序创建一个包含10个int型的数组,并显示它。 程序提示用户输入要查找的关键字,并进行二分查找。 程序清单7-3BinarySearch.java publicclassBinarySearch { publicstaticvoidmain(String[]args) { int[]list=newint[10]; //创建一个已经排序好的数组 System.out.print("数组是"); for(inti=0;i System.out.println(); //提示用户输入关键字 System.out.print("请输入一个关键字"); intkey=MyInput.readInt(); intindex=binarySearch(key,list);//查找与关键字匹配的元素的下标 if(index! =-1) System.out.println("与关键字匹配的元素下标是"+index); else System.out.println("在列表中没有与关键字匹配的元素"); } //使用二分查找法在列表中查找与关键字匹配的元素 publicstaticintbinarySearch(intkey,int[]list) { intlow=0; intup=list.length-1; returnbinarySearch(key,list,low,up); } //将列表list分成两组: list[low]、list[up],用二分法查找 publicstaticintbinarySearch(intkey,int[]list,intlow,intup) { if(low>up)//列表已找完,没有找到与关键字匹配的元素 return-1; intmid=(low+up)/2; if(key returnbinarySearch(key,list,low,mid-1); elseif(key==list[mid]) returnmid; elseif(key>list[mid]) returnbinarySearch(key,list,mid+1,up); return-1; } } 7.7数组应用 在实际应用中,常常存在对象数组计算和数组复制问题。 本节主要讲解这两个方面的应用。 7.7.1对象数组 前面的数组元素都是基本类型数据组成。 数组元素也可以是对象。 考虑下面的语句: CirclecirArray[]=newCircle[10];//由10个圆构成一个数组。 下面通过循环语句对数组cirArray初始化。 for(inti=0;i 例子7.4累加圆的面积。 该程序创建一个包含10个圆构成的数组cirArray,并显示它。 程序提示用户输入要查找的关键字,并进行线性查找。 程序清单7-4TotalArea.java publicclassTotalArea {publicstaticvoidmain(String[]args) {Circle[]circleArray;//声明变量circleArray circleArray=createCircleArray();//创建数组circleArray printCircleArray(circleArray);//打印数组,并累加圆的面积 } publicstaticCircle[]createCircleArray()//创建由圆构成的数组 { Circle[]circleArray=newCircle[10]; for(inti=0;i returncircleArray; } publicstaticvoidprintCircleArray(Circle[]circleArray) { System.out.println("圆的半径是"); for(inti=0;i System.out.println("\t\t\t\t-------------------"); System.out.println("Thetotalareasofcirclesis\t"+sum(circleArray));//计算和显示结果 } publicstaticdoublesum(Circle[]circleArray)//累加圆的面积 {doublesum=0; for(inti=0;i returnsum; } } 7.7.2复制数组 在java语言中,对于基本类型的数据可以通过复制语句完成复制,但是,对于对象型数据,不能通过赋值语句完成复制。 假设源数组是sourceArray,目标数组是targetArray。 下面是复制数组的三种方法: (1)通过循环语句复制数组中的每一个元素 for(inti=0;i (2)使用Object类中的clone方法。 inttargetArray=(int[])sourceArray.clone(); (3)使用System类中的类方法arraycopy。 arraycopy(sourceArray,src_pos,targetArray,tar_pos,length); 参数src_pos、tar_pos分别指sourceArray和targetArray的起始位置。 由length指定从源数组sourceArray复制到目标数组targetArray的个数。 例子7.5数组复制。 程序清单7-5TestCopyArray.java publicclassTestCopyArray { publicstaticvoidmain(String[]args) { int[]list1={0,1,2,3,4,5}; int[]list2=newint[list1.length]; System.arraycopy(list1,0,list2,0,list1.lengh);//将数组list1复制给数组list2 System.out.println("显示list1andlist2"); printList("list1is",list1); printList("list2is",list2); } publicstaticvoidprintList(Strings,int[]list)//显示列表的方法 {System.out.print(s+""); for(inti=0;i System.out.print('\n'); } } 7.8本章小结 Java语言中的数组和字符串的数据类型,都是类类型。 系统把数组或字符串都封装成了对象,要访问字符串或数组,必须通过访问引用数组或字符串的变量来实现。 数组就是把相同类型的数据元素按顺序组织在一起,通常将其看作一个整体(对象)。 要使用数组,必须首先声明一个引用数组的变量,通过变量访问数组对象。 当需要把一个字符串分解成可被独立使用的单词时,可以使用java.util包中的StringTokenizer类。 当处理字符串时,Character类中的一些方法可以用来进行字符分类,比如判断一个字符是否是数字字符或改变一个字符的大小写等。 7.9习题 1.编写程序,提示用户输入两个字符串,并检验第一个字符串是否为第二个字符串的子串。 2.编写一个程序,读入20个整数并按相反的顺序显示出来。 3.使用递归重写例7.1的选择排序法。 例7.1 publicclassSelectionSort { publicstaticvoidmain(String[]args) { double[]myList={5.0,4.4,1.9,2.9,3.4,3.5}; System.out.println("Mylistbeforesortis: "); printList(myList); selectionSort(myList); System.out.println(); System.out.println("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 07 数组