Java基础知识-对象数组及二维数组.ppt

上传人:tia****nde 文档编号:11496754 上传时间:2020-04-25 格式:PPT 页数:72 大小:394KB
返回 下载 相关 举报
Java基础知识-对象数组及二维数组.ppt_第1页
第1页 / 共72页
Java基础知识-对象数组及二维数组.ppt_第2页
第2页 / 共72页
Java基础知识-对象数组及二维数组.ppt_第3页
第3页 / 共72页
点击查看更多>>
资源描述
第2章对象数组及二维数组,课程回顾:OO:属性+行为特性:封装+继承+多态,第2章对象数组及二维数组,Java基础知识变量、数据类型、判定语句、循环语句,第2章对象数组及二维数组,用数组存储对象对数组元素进行排序在已排序的数组中查找二维数组,数组元素可以是任何类型(只要所有元素具有相同的类型)数组元素可以是基本数据类型数组元素也可以是类对象,称这样的数组为对象数组。在这种情况下,数组的每一个元素都是一个对象的引用。,用数组存储对象,例如,BankAccountaccounts;或BankAccountaccounts;定义了一个存储BankAccount类对象的数组。与C、C+不同,Java在数组的定义中并不为数组元素分配内存,因此中不需指明数组中元素的个数,即数组长度,而且对于如上定义的数组是不能引用的,必须经过初始化才可以引用。,用数组存储对象,对象数组的初始化分为静态初始化和动态初始化静态初始化:在定义数组的同时对数组元素进行初始化,例如:BankAccountaccounts=newBankAccount(“Zhang,100.00),newBankAccount(“Li,2380.00),newBankAccount(“Wang,500.00),newBankAccount(“Liu,175.56),newBankAccount(“Ma,924.02);,用数组存储对象,动态初始化:使用运算符new为数组分配空间,对于基本类型的数组,其格式如下:typearrayName=newtypearraySize;typearrayName=newtypearraySize;对于对象数组,使用运算符new只是为数组本身分配空间,并没有对数组的元素进行初始化。即数组元素都为空,如图。,数组元素未初始化的对象数组,用数组存储对象,此时不能访问数组的任何元素,必须对数组元素进行初始化后,才能访问。因此,对于对象数组,需要经过两步空间分配。首先给数组分配空间:typearrayName=newtypearraySize;然后给每一个数组元素分配空间:arrayName0=newtype(paramList);arrayNamearraySize-1=newtype(paramList);,用数组存储对象,例如:/定义一个String类型的数组StringstringArrar;/给数组stringArray分配3个引用空间,每个引用值为null。stringArray=newString3;/下面给数组元素分配空间stringArray0=newString(“how”);stringArray1=newString(“are”);stringArray2=newString(“you”);,用数组存储对象,当给数组元素分配了内存空间后,就可以引用了。数组元素的引用方式为:arrayNameindexindex为数组下标,下标从0开始,一直到数组长度减1。下标可以是整型常数或表达式。Java对数组元素要进行越界检查以保证安全性。同时,对于每个数组都有一个属性length指明它的长度(这里即是数组元素的个数)。例如,stringArray.length指明数组stringArray的长度。,用数组存储对象,对象数组应用举例,使用数组对一个班的学生信息及考试成绩进行存储,学生信息包括学号、姓名、三门课(英语、数学、计算机)的成绩及总成绩。,用数组存储对象,首先定义学生类Student:属性包括:学号(id),姓名(name),英语成绩(eng),数学成绩(math),计算机成绩(comp),总成绩(sum)。方法包括:构造方法,get方法,set方法,toString方法,equals方法,compare方法(比较两个学生的总成绩,结果分大于,小于,等于),sum方法(计算总成绩)。为了能够将Student类对象直接存储,应使其加入串行化协议。代码如下:,用数组存储对象,/Student.javaimportjava.io.*;publicclassStudentimplementsSerializableprivateStringid;/学号privateStringname;/姓名privateinteng;/英语成绩privateintmath;/数学成绩privateintcomp;/计算机成绩privateintsum;/总成绩,用数组存储对象,/构造方法publicStudent(Stringid,Stringname,inteng,intmath,intcomp)this.id=id;this.name=name;this.eng=eng;this.math=math;p=comp;sum();/计算总成绩,用数组存储对象,/构造方法publicStudent(Students)this.id=s.id;this.name=newString(s.name);this.eng=s.eng;this.math=s.math;p=p;sum();/计算总成绩,用数组存储对象,/set方法publicvoidsetId(Stringid)this.id=id;publicvoidsetName(Stringname)this.name=name;publicvoidsetEng(inteng)this.eng=eng;sum();/计算总成绩,用数组存储对象,/set方法publicvoidsetMath(intmath)this.math=math;sum();/计算总成绩publicvoidsetComp(intcomp)p=comp;sum();/计算总成绩,用数组存储对象,/get方法publicStringgetId()returnid;publicStringgetName()returnname;publicintgetEng()returneng;publicintgetMath()returnmath;,publicintgetComp()returncomp;publicintgetSum()returnsum;,用数组存储对象,/计算总成绩voidsum()this.sum=eng+math+comp;/toString方法publicStringtoString()returngetId()+t+getName()+t+getEng()+t+getMath()+t+getComp()+t+getSum();,用数组存储对象,/比较两个Student对象的值是否相等publicbooleanequals(Objectx)if(this.getClass()!=x.getClass()returnfalse;Studentb=(Student)x;return(this.getId().equals(b.getId();,用数组存储对象,/比较成绩大小,当前对象成绩比参数对象成绩大时返回1,/相等时返回0,其它返回-1.publicintcompare(StudentA)if(this.getSum()A.getSum()return1;elseif(this.getSum()=A.getSum()return0;elsereturn-1;,用数组存储对象,下面定义班级类StudentClass:属性包括:班级名称(name),容量(capacity),学生(students),实际人数(size)。方法包括:构造方法,get方法,set方法,toString方法。,用数组存储对象,/StudentClass.java/定义学生班级类StudentClasspublicclassStudentClassprivateStringname;/班级名称staticintcapacity=40;/最大容量privateStudentstudents;/学生privateintsize;/实际人数,用数组存储对象,/构造方法publicStudentClass(Stringname,intsize)this.name=name;this.size=size;students=newStudentcapacity;,用数组存储对象,/get方法publicStringgetName()returnname;publicintgetCapacity()returncapacity;publicStudentgetStudents()returnstudents;publicintgetSize()returnsize;,用数组存储对象,/set方法publicvoidsetName(Stringname)this.name=name;publicvoidsetCapacity(intcapacity)this.capacity=capacity;publicvoidsetSize(intsize)this.size=size;publicvoidsetStudents(Studentstudents)for(inti=0;isize;i+)this.studentsi=newStudent(studentsi);,用数组存储对象,/toString方法publicStringtoString()Strings;s=班级:+name+t+容量:+capacity+t+实际人数:+size+nn;s=s+学号+t+姓名+t+英语+t+数学+t+计算机+t+总成绩n;for(inti=0;isize;i+)s=s+studentsi.getId()+t+studentsi.getName()+t+studentsi.getEng()+t+studentsi.getMath()+t+studentsi.getComp()+t+studentsi.getSum()+n;returns;,用数组存储对象,定义测试类Tester1:为测试简单,仅生成具有5名学生的班级,5名学生的信息从键盘输入,为了避免以后再重复输入,可将输入的学生信息保存到文件中。,用数组存储对象,importjava.io.*;publicclassTester1publicstaticvoidmain(Stringargs)Studentstudents;StudentClassaClass=newStudentClass(软件06,5);students=newStudent5;for(inti=0;i5;i+)studentsi=newStudent(getAStudent(i+1);aClass.setStudents(students);System.out.println(aClass);,用数组存储对象,/将学生信息保存到文件stu.ser中。tryFileOutputStreamfo=newFileOutputStream(stu.ser);ObjectOutputStreamso=newObjectOutputStream(fo);for(inti=0;i5;i+)so.writeObject(studentsi);so.close();catch(Exceptione)System.out.println(e);,用数组存储对象,/从键盘输入一个学生的信息publicstaticStudentgetAStudent(inti)Studentstudenti;System.out.println(输入第+i+个学生的信息:);System.out.print(学号:);Stringid=Keyboard.getString();System.out.print(姓名:);Stringname=Keyboard.getString();System.out.print(英语成绩:);inteng=Keyboard.getInteger();System.out.print(数学成绩:);intmath=Keyboard.getInteger();System.out.print(计算机成绩:);intcomp=Keyboard.getInteger();studenti=newStudent(id,name,eng,math,comp);returnstudenti;,用数组存储对象,运行结果如下:输入第1个学生的信息:学号:250201姓名:李红英语成绩:88数学成绩:76计算机成绩:60输入第2个学生的信息:班级:软件06容量:40实际人数:5学号姓名英语数学计算机总成绩250201李红887660224250202张林786780225250203董玉梅868075241250204张力706875213250205何为809078248Pressanykeytocontinue.,用数组存储对象,在班级类StudentClass中增加常用方法:如查找某个学生是否存在(find),增加一个学生(add),删除一个学生(del)等。,用数组存储对象,(1)查找已知学生的学号,查找此学生是否存在。如果存在,返回其在数组中的下标位置;如果不存在,返回-1。顺序查找方法的代码如下:/顺序查找publicintfind(Stringid)for(inti=0;i=0)returnfalse;/此学号已存在,不能增加/增加操作this.studentssize=newStudent(newString(aStudent.getId(),newString(aStudent.getName(),aStudent.getEng(),aStudent.getMath(),aStudent.getComp();size+;returntrue;,用数组存储对象,(3)删除已知一个Student对象,将此对象从数组中删除。/删除一个学生publicbooleandel(StudentaStudent)intpos=find(aStudent.getId();if(pos=-1)returnfalse;/此学号不存在,不能删除/将此学生从数组中删除./将数组元素studentspos+1.studentssize-1依次向前移动一个位置,且size的值减1.for(inti=pos+1;isize;i+)studentsi-1=studentsi;size-;returntrue;,用数组存储对象,/已知学号,删除一个学生publicbooleandel(Stringid)intpos=find(id);if(pos=-1)returnfalse;/此学号不存在,不能删除/将此学生从数组中删除./将数组元素studentspos+1.studentssize-1依次向前移动一个位置,且size的值减1.for(inti=pos+1;isize;i+)studentsi-1=studentsi;size-;returntrue;,用数组存储对象,编写测试类Tester2:对新增加的查找、增加及删除方法进行测试。,用数组存储对象,/Tester2.javaimportjava.io.*;publicclassTester2publicstaticvoidmain(Stringargs)Studentstudents=newStudent5;/从文件stu.ser中读出学生信息。tryFileInputStreamfi=newFileInputStream(stu.ser);ObjectInputStreamsi=newObjectInputStream(fi);for(inti=0;i5;i+)studentsi=(Student)si.readObject();si.close();,用数组存储对象,catch(Exceptione)System.out.println(e);StudentClassaClass=newStudentClass(软件04,5);aClass.setStudents(students);System.out.println(aClass);/查找,增加,删除测试for(inti=0;i2;i+)System.out.print(输入查找的学号);Stringid=Keyboard.getString();if(aClass.find(id)0)System.out.println(不存在!);elseSystem.out.println(存在!);,用数组存储对象,for(inti=0;i2;i+)StudentaStudent=getAStudent(6+i);if(aClass.add(aStudent)System.out.println(增加成功!);elseSystem.out.println(不能增加!);for(inti=0;iaj+1。第二步,将ai插入到aj之后。将aj+1、依次向后移一位(后移操作也可在第一步的查找过程中进行)。,对数组元素进行排序,例3直接插入排序举例。根据上面的算法,在StudentClass中增加直接插入排序方法insertSort,代码如下:/直接插入排序方法publicvoidinsertSort()Studenttemp;for(inti=1;i-1,对数组元素进行排序,顺序查找的算法简单,但在大数据量中进行查找时效率较低。在未排序的数组中进行查找,只能使用顺序查找方法。对于已排序的数组,也可以使用顺序查找方法,但可以对算法进行一定的改进,使其效率有所提高。,在已排序的数组中查找,例如,有一批Integer类型的数据已按升序排列好。a1a2an这批数据存储在数组a0、a1、an-1中,现在要对该数组进行查找,看给定的数据x是否在此数组中。由于数组中的元素已按升序排列,因此,在查找时,x不需要与数组中的每个元素都进行比较。假如按从左向右的顺序查找,当x小于ai时就应该停止查找。改进的顺序查找方法如下:,在已排序的数组中查找,publicintseqSearch(intx)for(inti=0;(i=ai.intValue();i+)if(ai.intValue()=x)returni;return-1;,在已排序的数组中查找,对于已排序的数组,还可以使用效率更高的查找方法,比较典型的方法有二分查找。同样是上面的问题,可以用下面的方法:在0到n-1中间选一个正整数k,用k把原来的有序数列分为三个有序子序列:I1:a0,a1,ak-1I2:akI3:ak+1,ak+2,an-1,在已排序的数组中查找,然后,用ak与x比较,若x等于ak,查找结束;若x小于ak,则用同样的方法把序列a0,a1,ak-1分成三个序列;若xak,也用同样的方法把序列ak+1,ak+2,an-1分成三个序列,这样每分一次,要查找的范围就缩小一半。这个过程进行下去,直到找到x,或查找的范围内已没有数据(这种情况说明x不存在)。这是一种应用分治策略的解题思想。当k=1/2时,称为二分查找法,或二分检索法。,在已排序的数组中查找,例二分查找举例。下面定义具有排序数组的类SortedIntArray。其中,search方法运用二分查找算法在给定的数组范围内查找某一元素,如果存在,返回元素所在的下标位置,如果不存在,则返回元素应该在的位置。将此功能与插入功能相结合,又可实现对数组元素进行排序。,在已排序的数组中查找,publicclassSortedIntArrayprivateintcapacity;privateIntegerrep;privateintsize;/size的缺省值为0/构造方法publicSortedIntArray(intn)capacity=n;rep=newIntegercapacity;/无参的构造方法publicSortedIntArray()this(100);,在已排序的数组中查找,/下面的方法运用二分查找算法在下标从lower到upper范围内的数组/元素中查找第一个不小于新元素的数组元素的下标。privateintsearch(inti,intlower,intupper)intindex=lower;if(upper=lower)intmiddle=(upper+lower)/2;intcurrent=repmiddle.intValue();if(current=i)index=middle;elseif(currentindex;-j)repj=repj-1;repindex=newInteger(i);+size;returnthis;,在已排序的数组中查找,/在数组中删除一个元素。只删除查到的第一个元素。publicSortedIntArrayremove(inti)intindex=search(i);if(repindex.intValue()=i)-size;for(intj=index;jsize;+j)repj=repj+1;returnthis;publicStringtoString()StringtoReturn=;for(inti=0;isize;+i)toReturn+=repi.toString()+,;returntoReturn;,在已排序的数组中查找,/主方法staticpublicvoidmain(Stringargs)SortedIntArrayanArray=newSortedIntArray();anArray.insert(4).insert(9).insert(7).insert(1).insert(3).insert(2).insert(8).insert(7);System.out.println(anArray);anArray.remove(1).remove(8).remove(7).remove(3);System.out.println(anArray);运行结果如下:,1,2,3,4,7,7,8,9,2,4,7,9,Pressanykeytocontinue.,在已排序的数组中查找,数组元素的类型除了可以是基本数据类型、类对象外,还可以是数组。前面介绍的数组也称为一维数组,如果一维数组的元素又是一维数组,则称此数组为二维数组。二维数组常用来表示二维表,即以行(rows)及列(columns)的方式组织数据。,二维数组,二维数组的定义方式如下:typearrayName;或typearrayName;与一维数组一样,这时还没有给数组分配空间;对于对象数组,还需要给数组元素分配空间。二维数组的初始化也分为静态和动态两种:,二维数组,静态初始化:在定义数组的同时为数组分配空间。如,intintArray=1,2,2,3,3,4;,二维数组,动态初始化:对二维数组来说,分配内存空间有下面两种方法:一种方法是直接为每一维分配空间,格式如下:typearrayName=newtypearraylength1arraylength2例如,inta=newint23;,二维数组,另一种方法是从最高维开始(而且必须从最高维开始),分别为每一维分配空间。例如,Strings=newString2;s0=newString2;s1=newString3;s00=newString(Good);s01=newString(Luck);s10=newString(to);s11=newString(you);s12=newString(!);,二维数组,例5编写程序建立并显示如图所示的二维表,并计算累加和最大的行号。设元素值都为正整数。,publicclassTableTesterpublicstaticvoidmain(Stringargs)intmyTable=23,45,65,34,21,67,78,46,14,18,46,98,63,88,98,81,64,90,21,14,23,54,43,55,76,22,43,33;,二维数组,/显示二维表for(introw=0;row4;row+)for(intcol=0;col7;col+)System.out.print(myTablerowcol+“”);System.out.println();,二维数组,/计算累加和最大的行号intsum,max,maxRow=0;max=0;for(introw=0;rowmax)max=sum;maxRow=row;System.out.println(Row+maxRow+hasthehighestsumof+max);,二维数组,运行结果如下:23456534216778461418469863889881649021142354435576224333Row2hasthehighestsumof391Pressanykeytocontinue.,二维数组,注意,多维数组的length属性只返回第一维的长度。如,intages47;则ages.length返回的结果是4,而不是28。也可以分别存取每一维的长度。如,intages=intages47;intfirstArray=ages0;则ages.length*firstArray.length的结果为28。,二维数组,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!