第章對(duì)象群體的組織_第1頁(yè)
第章對(duì)象群體的組織_第2頁(yè)
第章對(duì)象群體的組織_第3頁(yè)
第章對(duì)象群體的組織_第4頁(yè)
第章對(duì)象群體的組織_第5頁(yè)
已閱讀5頁(yè),還剩89頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第七章對(duì)象群體的組織JAVA語(yǔ)言程序設(shè)計(jì)1目錄7.1對(duì)象數(shù)組7.3集合(Collection,Map)7.4本章小結(jié)27.1對(duì)象數(shù)組數(shù)組在Java提供的存儲(chǔ)及隨機(jī)訪問對(duì)象序列的各種方法中,數(shù)組是效率最高的一種類型檢查邊界檢查優(yōu)點(diǎn)數(shù)組知道其元素的類型編譯時(shí)的類型檢查大小已知代價(jià)數(shù)組對(duì)象的大小是固定的,在生存期內(nèi)大小不可變3對(duì)象數(shù)組數(shù)組元素是類的對(duì)象所有元素具有相同的類型每個(gè)元素都是一個(gè)對(duì)象的引用對(duì)象數(shù)組7.1對(duì)象數(shù)組(續(xù))4靜態(tài)初始化:在聲明和定義數(shù)組的同時(shí)對(duì)數(shù)組元素進(jìn)行初始化,例如:BankAccount[]accounts={newBankAccount(“Zhang",100.00),newBankAccount(“Li",2380.00),newBankAccount(“Wang",500.00),newBankAccount(“Liu",175.56),newBankAccount(“Ma",924.02)};動(dòng)態(tài)初始化:使用運(yùn)算符new,需要經(jīng)過兩步:首先給數(shù)組分配空間typearrayName[]=newtype[arraySize];然后給每一個(gè)數(shù)組元素分配空間arrayName[0]=newtype(paramList);…arrayName[arraySize-1]=newtype(paramList);7.1.1用數(shù)組存儲(chǔ)對(duì)象(續(xù))

——對(duì)象數(shù)組的初始化對(duì)象數(shù)組5使用數(shù)組存儲(chǔ)一個(gè)班的學(xué)生信息及考試成績(jī)。學(xué)生信息包括學(xué)號(hào)、姓名、三門課(英語(yǔ)、數(shù)學(xué)、計(jì)算機(jī))的成績(jī)及總成績(jī)。首先聲明學(xué)生類Student屬性包括學(xué)號(hào)(id),姓名(name),英語(yǔ)成績(jī)(eng),數(shù)學(xué)成績(jī)(math),計(jì)算機(jī)成績(jī)(comp),總成績(jī)(sum)方法包括構(gòu)造方法,get方法,set方法,toString方法,equals方法,compare方法(比較兩個(gè)學(xué)生的總成績(jī),結(jié)果分大于,小于,等于),sum方法(計(jì)算總成績(jī))實(shí)現(xiàn)Serializable接口,以便對(duì)象持久化,7.1.1用數(shù)組存儲(chǔ)對(duì)象(續(xù))

——例7_1對(duì)象數(shù)組6importjava.io.*;publicclassStudentimplementsSerializable{ privateStringid; //學(xué)號(hào)

privateStringname; //姓名

privateinteng; //英語(yǔ)成績(jī)

privateintmath; //數(shù)學(xué)成績(jī)

privateintcomp;//計(jì)算機(jī)成績(jī)

privateintsum; //總成績(jī)

publicStudent(Stringid,Stringname,inteng,intmath,intcomp){ this.id=id; =name; this.eng=eng; this.math=math; p=comp; sum();//計(jì)算總成績(jī) }

7.1.1用數(shù)組存儲(chǔ)對(duì)象(續(xù))

——例7_1對(duì)象數(shù)組7 publicStudent(Students){ this.id=s.id; =newString(); this.eng=s.eng; this.math=s.math; p=p; sum();//計(jì)算總成績(jī) }

publicvoidsetId(Stringid){ this.id=id; } publicvoidsetName(Stringname){ =name; }

7.1.1用數(shù)組存儲(chǔ)對(duì)象(續(xù))

——例7_1對(duì)象數(shù)組8 publicvoidsetEng(inteng){ this.eng=eng; sum();//計(jì)算總成績(jī) }

publicvoidsetMath(intmath){ this.math=math; sum();//計(jì)算總成績(jī) }

publicvoidsetComp(intcomp){ p=comp; sum();//計(jì)算總成績(jī) }

publicStringgetId(){ returnid; }

7.1.1用數(shù)組存儲(chǔ)對(duì)象(續(xù))

——例7_1對(duì)象數(shù)組9 publicStringgetName(){ returnname; } publicintgetEng(){ returneng; } publicintgetMath(){ returnmath; } publicintgetComp(){ returncomp; } publicintgetSum(){ returnsum; }

voidsum(){ this.sum=eng+math+comp; }

7.1.1用數(shù)組存儲(chǔ)對(duì)象(續(xù))

——例7_1對(duì)象數(shù)組10publicStringtoString(){returngetId()+"\t"+getName()+"\t"+getEng()+"\t"+getMath()+"\t"+getComp()+"\t"+getSum();}publicbooleanequals(Objectx){if(this.getClass()!=x.getClass())returnfalse;Studentb=(Student)x;return(this.getId().equals(b.getId()));}//比較成績(jī)大小小,當(dāng)前對(duì)象象成績(jī)比參數(shù)數(shù)對(duì)象成績(jī)大大時(shí)返回1,相等時(shí)返回回0,其它返返回-1.publicintcompare(StudentA){if(this.getSum()>A.getSum())return1;elseif(this.getSum()==A.getSum())return0;elsereturn-1;}}用用數(shù)組存儲(chǔ)儲(chǔ)對(duì)象(續(xù))——例7_1對(duì)象數(shù)組11下面聲明班級(jí)級(jí)類StudentClass:屬性包括班級(jí)名稱(name),,容量(capacity),學(xué)生(students),實(shí)際人數(shù)(size)。。方法包括構(gòu)造方法,get方法,set方法,toString方法。publicclassStudentClass{privateStringname;//班級(jí)名稱staticintcapacity=40;//最大容量privateStudentstudents[];//學(xué)生privateintsize;//實(shí)際人數(shù)用用數(shù)組存儲(chǔ)儲(chǔ)對(duì)象(續(xù))——例7_1對(duì)象數(shù)組12publicStudentClass(Stringname,intsize){=name;this.size=size;students=newStudent[capacity];}publicStringgetName(){returnname;}publicintgetCapacity(){returncapacity;}publicStudent[]getStudents(){returnstudents;}用用數(shù)組存儲(chǔ)儲(chǔ)對(duì)象(續(xù))——例7_1對(duì)象數(shù)組13publicintgetSize(){returnsize;}publicvoidsetName(Stringname){=name;}publicvoidsetCapacity(intcapacity){this.capacity=capacity;}publicvoidsetSize(intsize){this.size=size;}publicvoidsetStudents(Student[]students){for(inti=0;i<size;i++)this.students[i]=newStudent(students[i]);}用用數(shù)組存儲(chǔ)儲(chǔ)對(duì)象(續(xù))——例7_1對(duì)象數(shù)組14publicStringtoString(){Strings;s="班級(jí):"+name+"\t"+"容量:"+capacity+"\t"+"實(shí)際人數(shù):"+size+"\n\n";s=s+“學(xué)號(hào)”+“\t”+““姓名”+“\t”+““英語(yǔ)”+“\t”+““數(shù)學(xué)”+“\t”+“計(jì)算機(jī)”+"\t"+"總成績(jī)\n";for(inti=0;i<size;i++)s=s+students[i].getId()+"\t"+students[i].getName()+"\t"+students[i].getEng()+"\t"+students[i].getMath()+"\t"+students[i].getComp()+"\t"+students[i].getSum()+"\n";returns;}}用用數(shù)組存儲(chǔ)儲(chǔ)對(duì)象(續(xù))——例7_1對(duì)象數(shù)組15下面聲明測(cè)試試類Tester1(其中Keyboard類的聲明見第第3章例3-12),為為測(cè)試簡(jiǎn)單,,僅生成具有有5名學(xué)生的的班級(jí),5名名學(xué)生的信息息從鍵盤輸入入,為了避免免以后再重復(fù)復(fù)輸入,可將將輸入的學(xué)生生信息保存到到文件中importjava.io.*;publicclassTester1{publicstaticvoidmain(Stringargs[]){Studentstudents[];StudentClassaClass=newStudentClass("軟件0201",5);students=newStudent[5];for(inti=0;i<5;i++)students[i]=newStudent(getAStudent(i+1));aClass.setStudents(students);System.out.println(aClass);用用數(shù)組存儲(chǔ)儲(chǔ)對(duì)象(續(xù))——例7_1對(duì)象數(shù)組16//將學(xué)生信息保保存到文件stu.ser中。try{FileOutputStreamfo=newFileOutputStream("stu.ser");ObjectOutputStreamso=newObjectOutputStream(fo);for(inti=0;i<5;i++)so.writeObject(students[i]);so.close();}catch(Exceptione){System.out.println(e);}}用用數(shù)組存儲(chǔ)儲(chǔ)對(duì)象(續(xù))——例7_1對(duì)象數(shù)組17publicstaticStudentgetAStudent(inti){Studentstudenti;System.out.println("輸入第"+i+"個(gè)學(xué)生的信息息:");System.out.print("學(xué)號(hào):");Stringid=Keyboard.getString();System.out.print("姓名:");Stringname=Keyboard.getString();System.out.print("英語(yǔ)成績(jī):");inteng=Keyboard.getInteger();System.out.print("數(shù)學(xué)成績(jī):");intmath=Keyboard.getInteger();System.out.print("計(jì)算機(jī)成績(jī):");intcomp=Keyboard.getInteger();studenti=newStudent(id,name,eng,math,comp);returnstudenti;}}用用數(shù)組存儲(chǔ)儲(chǔ)對(duì)象(續(xù))——例7_1對(duì)象數(shù)組18運(yùn)行結(jié)果如下下(其中學(xué)生生信息的輸入入只顯示一部部分):輸入第1個(gè)學(xué)學(xué)生的信息:學(xué)號(hào):250201姓名:李紅英語(yǔ)成績(jī):88數(shù)學(xué)成績(jī):76計(jì)算機(jī)成績(jī):60輸入第2個(gè)學(xué)學(xué)生的信息:……班級(jí):軟件0201容容量:40實(shí)際際人數(shù):5學(xué)號(hào)姓姓名英英語(yǔ)數(shù)數(shù)學(xué)計(jì)計(jì)算算機(jī)總成成績(jī)250201李紅887660224250202張林786780225250203董玉梅梅868075241250204張張力706875213250205何何為809078248用用數(shù)組組存儲(chǔ)儲(chǔ)對(duì)象象(續(xù)續(xù))——例例7_1運(yùn)運(yùn)行結(jié)結(jié)果對(duì)象數(shù)數(shù)組19查找也稱為為檢索索,就就是從從一組組數(shù)據(jù)據(jù)中找找出所所需的的具有有某種種特征征的數(shù)數(shù)據(jù)項(xiàng)項(xiàng)順序查查找對(duì)所存存儲(chǔ)的的數(shù)據(jù)據(jù)從第第一項(xiàng)項(xiàng)開始始(也也可以以從最最后一一項(xiàng)開開始)),依依次與與所要要查找找的數(shù)數(shù)據(jù)進(jìn)進(jìn)行比比較,,直到到找到到該數(shù)數(shù)據(jù)或或?qū)⑷吭囟级颊彝晖赀€沒沒有找找到該該數(shù)據(jù)據(jù)為止止用用數(shù)組組存儲(chǔ)儲(chǔ)對(duì)象象(續(xù)續(xù))——為為班級(jí)級(jí)類添添加查找方法對(duì)象數(shù)數(shù)組20已知學(xué)學(xué)生的的學(xué)號(hào)號(hào),查查找此此學(xué)生生是否否存在在。如如果存存在,,返回回其在在數(shù)組組中的的下標(biāo)標(biāo)位置置;如如果不不存在在,返返回-1。順序序查找找方法法的代代碼如如下publicintfind(Stringid){for(inti=0;i<size;i++)if(students[i].getId().equals(id))returni;return-1;}用用數(shù)組組存儲(chǔ)儲(chǔ)對(duì)象象(續(xù)續(xù))——為為班級(jí)級(jí)類添添加查找方法對(duì)象數(shù)數(shù)組21在數(shù)組組的末末尾增增加一一個(gè)學(xué)學(xué)生對(duì)對(duì)象增加之之前需需先判判斷數(shù)數(shù)組中中是否否還有有空間間,并并且在在數(shù)組組中查查找將將要增增加的的學(xué)號(hào)號(hào)是否否已經(jīng)經(jīng)存在在增加成成功,,返回回true;否則則,返返回falsepublicbooleanadd(StudentaStudent){if(size==capacity)returnfalse;if(find(aStudent.getId())>=0)returnfalse;this.students[size]=newStudent(newString(aStudent.getId()),newString(aStudent.getName()),aStudent.getEng(),aStudent.getMath(),aStudent.getComp());size++;returntrue;}用用數(shù)數(shù)組組存存儲(chǔ)儲(chǔ)對(duì)對(duì)象象(續(xù)續(xù))———為為班班級(jí)級(jí)類類添添加加增加加方法法對(duì)象象數(shù)數(shù)組組22已知知一一個(gè)個(gè)Student對(duì)象象,,將將此此對(duì)對(duì)象象從從數(shù)數(shù)組組中中刪刪除除publicbooleandel(StudentaStudent){intpos=find(aStudent.getId());if(pos==-1)returnfalse;for(inti=pos+1;i<size;i++)students[i-1]=students[i];size--;returntrue;}用用數(shù)數(shù)組組存存儲(chǔ)儲(chǔ)對(duì)對(duì)象象(續(xù)續(xù))———為為班班級(jí)級(jí)類類編編寫寫刪除除方法法對(duì)象象數(shù)數(shù)組組23已知知學(xué)學(xué)號(hào)號(hào),刪除除一一個(gè)個(gè)學(xué)學(xué)生生publicbooleandel(Stringid){intpos=find(id);if(pos==-1)returnfalse;for(inti=pos+1;i<size;i++)students[i-1]=students[i];size--;returntrue;}用用數(shù)數(shù)組組存存儲(chǔ)儲(chǔ)對(duì)對(duì)象象(續(xù)續(xù))———為為班班級(jí)級(jí)類類添添加加刪除除方法法對(duì)象象數(shù)數(shù)組組24對(duì)對(duì)數(shù)數(shù)組組元元素素進(jìn)進(jìn)行行排排序序排序序按照照預(yù)預(yù)先先規(guī)規(guī)定定的的準(zhǔn)準(zhǔn)則則((如如升升序序或或降降序序等等)),,把把數(shù)數(shù)據(jù)據(jù)有有次次序序地地排排列列起起來(lái)來(lái)已經(jīng)設(shè)計(jì)計(jì)出許多多排序算算法,常常用的排排序算法法有選擇排序序插入排序序交換排序序以降序?yàn)闉槔M(jìn)行行介紹對(duì)象數(shù)組組25選擇排序序的基本本思想先在未排排序序列列中選一一個(gè)最小小元素,,作為已已排序子子序列然后再重重復(fù)地從從未排序序子序列列中選取取一個(gè)最最小元素素,把它它加到已已經(jīng)排序序的序列列中,作作為已排排序子序序列的最最后一個(gè)個(gè)元素直到把未未排序子子序列中中的元素素處理完完為止對(duì)對(duì)數(shù)組元元素進(jìn)行行排序(續(xù))——選擇擇排序?qū)ο髷?shù)組組26用選擇排排序方法法將例7-1中中生成的的文件stu.ser中的班級(jí)級(jí)學(xué)生按按總成績(jī)績(jī)從高到到低排序序在例7-1中的的StudentClass類中增加加選擇排排序方法法selectionSort,代碼如下下publicvoidselectionSort(){Studenttemp;for(inti=0;i<size-1;i++)for(intj=i+1;j<size;j++)if(students[j].compare(students[i])>0){temp=students[i];students[i]=students[j];students[j]=temp;}}對(duì)對(duì)數(shù)組元元素進(jìn)行行排序(續(xù))——例7_2對(duì)象數(shù)組組27測(cè)試類代代碼如下下importjava.io.*;publicclassSortTester{publicstaticvoidmain(Stringargs[]){Studentstudents[]=newStudent[5];//從文件stu.ser中讀出學(xué)學(xué)生信息息try{FileInputStreamfi=newFileInputStream("stu.ser");ObjectInputStreamsi=newObjectInputStream(fi);for(inti=0;i<5;i++)students[i]=(Student)si.readObject();si.close();}catch(Exceptione){System.out.println(e);}對(duì)對(duì)數(shù)組元元素進(jìn)行行排序(續(xù))——例7_2對(duì)象數(shù)組組28StudentClassaClass=newStudentClass("軟件0201",5);aClass.setStudents(students);System.out.println(aClass);//選擇排序序aClass.selectionSort();System.out.println("選擇排序序后的結(jié)結(jié)果:\n");System.out.println(aClass);}}對(duì)對(duì)數(shù)組元元素進(jìn)行行排序(續(xù))——例7_2對(duì)象數(shù)組組29運(yùn)行結(jié)果果班級(jí):軟軟件0201容容量:40實(shí)實(shí)際人數(shù)數(shù):5學(xué)號(hào)姓姓名英英語(yǔ)數(shù)數(shù)學(xué)計(jì)計(jì)算機(jī)總總成成績(jī)250201李李紅紅887660224250202張張林林786780225250203董董玉玉梅868075241250204張張力力706875213250205何何為為809078248選擇排序序后的結(jié)結(jié)果:班級(jí):軟軟件0201容容量:40實(shí)實(shí)際人數(shù)數(shù):5學(xué)號(hào)姓姓名英英語(yǔ)數(shù)數(shù)學(xué)計(jì)計(jì)算機(jī)總總成成績(jī)250205何何為為809078248250203董玉梅梅868075241250202張林786780225250201李紅887660224250204張力706875213對(duì)對(duì)數(shù)組元素素進(jìn)行排序(續(xù))——例7_2運(yùn)行結(jié)果對(duì)象數(shù)組30插入排序?qū)⒋判虻臄?shù)數(shù)據(jù)按一定的的規(guī)則逐一插插入到已排序序序列中的合合適位置處,,直到將全部部數(shù)據(jù)都插入入為止插入的規(guī)則不不同,便形成成了不同的插插入排序方法法。其中,算算法最簡(jiǎn)單的的為直接插入入排序方法直接插入排序序方法先以未未排序序列的的第一個(gè)元素素作為已排序序子序列,然然后從原來(lái)的的第二個(gè)元素素起,將各元元素逐一插入入到已排序子子序列中合適適的位置,直直到把全部元元素都插入為為止。對(duì)對(duì)數(shù)組元素素進(jìn)行排序(續(xù))——插入排序序?qū)ο髷?shù)組31直接插入排序序的步驟假設(shè)數(shù)組a中有n個(gè)元素a[0]、a[1]、………、a[n-1]首先要把a(bǔ)[0]作為已排序子子序列。然后后逐一將a[1]、a[2]、………、a[n-1]插入到已排序序子序列中。。每插入一個(gè)個(gè)元素a[i]都要執(zhí)行如下下兩步操作::第一步,在已已排序子序列列中找一個(gè)合合適位置j,使a[j]>a[i]>a[j+1]。第二步,將a[i]插入到a[j]之后。在插入入之前,需要要先保存a[i]的值,之后將將a[j+1]、……、a[n-1]依次向后移一一位(后移操操作也可在第第一步的查找找過程中進(jìn)行行)對(duì)對(duì)數(shù)組元素素進(jìn)行排序(續(xù))——直接插入入排序?qū)ο髷?shù)組32在StudentClass中增加直接插插入排序方法法insertSort,,代碼如下publicvoidinsertSort(){Studenttemp;for(inti=1;i<size;i++){temp=students[i];intj=i-1;while(j>-1&&pare(students[j])>0){students[j+1]=students[j];j--;}students[j+1]=temp;}}對(duì)對(duì)數(shù)組元素素進(jìn)行排序(續(xù))——例7_3對(duì)象數(shù)組33在在已排序的的數(shù)組中查找找一批Integer類型的數(shù)據(jù)已已按升序排列列好,a1<a2<…<an,存儲(chǔ)在數(shù)組組a[0]、a[1]、……、a[n-1]中,現(xiàn)在要對(duì)對(duì)該數(shù)組進(jìn)行行查找,看給給定的數(shù)據(jù)x是否在此數(shù)組組中順序查找方法法按從左向右的的順序查找,,當(dāng)x小于a[i]時(shí)就應(yīng)該停止止查找publicintseqSearch(intx){for(inti=0;(i<n)&&(x>=a[i].intValue());i++)if(a[i].intValue()==x)returni;return-1;}二分查找。在在0到n-1中間選一個(gè)正正整數(shù)k,用k把原來(lái)的有序序序列分為三三個(gè)有序子序序列:a[0],a[1],…,a[k-1]a[k]a[k+1],a[k+2],…,a[n-1]對(duì)象數(shù)組34具有排序數(shù)組組的類SortedIntArraysearch方法運(yùn)用二分分查找算法::在給定的數(shù)數(shù)組范圍內(nèi)查查找某一元素素,如果存在在,返回元素素所在的下標(biāo)標(biāo)位置,如果果不存在,則則返回元素應(yīng)應(yīng)該在的位置置(如果要將將此元素插入入到數(shù)組中,,且保持?jǐn)?shù)組組仍然有序的的位置)將此功能與插插入功能相結(jié)結(jié)合,可實(shí)現(xiàn)現(xiàn)對(duì)數(shù)組元素素進(jìn)行排序publicclassSortedIntArray{privateintcapacity;privateInteger[]rep;privateintsize;publicSortedIntArray(intn){capacity=n;rep=newInteger[capacity];}7.1.3在已排序的數(shù)數(shù)組中查找(續(xù))——例7_4對(duì)象數(shù)組35publicSortedIntArray(){this(100);}privateintsearch(inti,intlower,intupper){intindex=lower;if(upper>=lower){intmiddle=(upper+lower)/2;intcurrent=rep[middle].intValue();if(current==i){index=middle;}elseif(current<i){index=search(i,middle+1,upper);}else{index=search(i,lower,middle-1);}}returnindex;}7.1.3在已排序的數(shù)數(shù)組中查找(續(xù))——例7_4對(duì)象數(shù)組36publicintsearch(inti){returnsearch(i,0,size-1);}publicSortedIntArrayinsert(inti){Intindex=search(i);for(intj=size;j>index;--j){rep[j]=rep[j-1];}rep[index]=newInteger(i);++size;returnthis;}publicSortedIntArrayremove(inti){intindex=search(i);if(rep[index].intValue()==i){--size;for(intj=index;j<size;++j){rep[j]=rep[j+1];}}returnthis;}7.1.3在已排序的數(shù)數(shù)組中查找(續(xù))——例7_4對(duì)象數(shù)組37publicStringtoString(){StringtoReturn="";for(inti=0;i<size;++i){toReturn+=rep[i].toString()+",";}returntoReturn;}staticpublicvoidmain(String[]args){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);}}7.1.3在已排序的數(shù)數(shù)組中查找(續(xù))——例7_4對(duì)象數(shù)組38運(yùn)行結(jié)果1,2,3,4,7,7,8,9,2,4,7,9,7.1.3在已排序的數(shù)數(shù)組中查找(續(xù))——例7_4運(yùn)行結(jié)果對(duì)象數(shù)組397.3集合數(shù)組的優(yōu)點(diǎn)是Java提供的隨機(jī)訪訪問對(duì)象序列列的最有效方方法是一個(gè)簡(jiǎn)單的的線性序列,,訪問元素的的速度較快數(shù)組的缺點(diǎn)大小自創(chuàng)建以以后就固定了了,在其整個(gè)個(gè)生存期內(nèi)其其大小不可改改變數(shù)組元素只能能是同一類型型集合可動(dòng)態(tài)改變其其大小可在序列中存存儲(chǔ)不同類型型的數(shù)據(jù)40集合把具有相同性性質(zhì)的一類東東西,匯聚成成一個(gè)整體在Java2中有很多與集集合有關(guān)的接接口及類它們被組織在在以Collection及Map接口為根的層層次結(jié)構(gòu)中,,稱為集合框架在Java2之前,在Java1.0/1.1中,沒有完整的的集合框架。。只有一些簡(jiǎn)簡(jiǎn)單的可以自自擴(kuò)展的容器器類VectorHashtable7.3集合(續(xù))集合合41集合框架集合框架(JavaCollectionsFramework)為表示和操作作集合而規(guī)定定的一種統(tǒng)一一的標(biāo)準(zhǔn)的體體系結(jié)構(gòu)提供了一些現(xiàn)現(xiàn)成的數(shù)據(jù)結(jié)結(jié)構(gòu)可供使用用,程序員可可以利用集合合框架快速編編寫代碼,并并獲得優(yōu)良性性能包含三大塊內(nèi)內(nèi)容對(duì)外的接口::表示集合的的抽象數(shù)據(jù)類類型,使集合合的操作與表表示分開接口的實(shí)現(xiàn)::指實(shí)現(xiàn)集合合接口的Java類,是可重用用的數(shù)據(jù)結(jié)構(gòu)構(gòu)對(duì)集合運(yùn)算的的算法:是指指執(zhí)行運(yùn)算的的方法,例如如在集合上進(jìn)進(jìn)行查找和排排序集合合42集合框架接口口聲明了對(duì)各種種集合類型執(zhí)執(zhí)行的一般操操作包括Collection、Set、List、SortedSet、Map、SortedMap基本結(jié)構(gòu)如圖圖7.3.1Java集合框架(續(xù))——對(duì)外的接接口集合合43類層次如圖,,包括4個(gè)接口、4個(gè)抽象類及6個(gè)具體類7.3.1Java集合框架(續(xù))——Collection接口CollectionAbstractCollectionVectorArrayListStackListSetSortedSetAbstractSetAbstractListAbstractSequentialListHashSetTreeSetLinkedList集合合44Collection接口聲明了一組組操作成批批對(duì)象的抽抽象方法::查詢方法法、修改方方法查詢方法intsize()–返回集合對(duì)對(duì)象中包含含的元素個(gè)個(gè)數(shù)booleanisEmpty()–判斷集合對(duì)對(duì)象中是否否還包含元元素,如果果沒有任何何元素,則則返回truebooleancontains(Objectobj)––判斷斷對(duì)對(duì)象象是是否否在在集集合合中中booleancontainsAll(Collectionc)––判斷斷方方法法的的接接收收者者對(duì)對(duì)象象是是否否包包含含集集合合中中的的所所有有元元素素7.3.1Java集合合框框架架(續(xù))———Collection接口口集合合45修改改方方法法包包括括booleanadd(Objectobj)––向集集合合中中增增加加對(duì)對(duì)象象booleanaddAll(Collectionc)––將參參數(shù)數(shù)集集合合中中的的所所有有元元素素增增加加到到接接收收者者集集合合中中booleanremove(Objectobj)––從集集合合中中刪刪除除對(duì)對(duì)象象booleanremoveAll(Collectionc)-將參參數(shù)數(shù)集集合合中中的的所所有有元元素素從從接接收收者者集集合合中中刪刪除除booleanretainAll(Collectionc)––在接接收收者者集集合合中中保保留留參參數(shù)數(shù)集集合合中中的的所所有有元元素素,,其其它它元元素素都都刪刪除除voidclear()––刪除除集集合合中中的的所所有有元元素素7.3.1Java集合合框框架架(續(xù))———Collection接口口集合合46Set接口口擴(kuò)展展了了Collection禁止重復(fù)復(fù)的元素素,是數(shù)學(xué)學(xué)中“集集合”的的抽象對(duì)equals和hashCode操作有了了更強(qiáng)的的約定,,如果兩兩個(gè)Set對(duì)象包含含同樣的的元素,,二者便便是相等等的實(shí)現(xiàn)它的的兩個(gè)主主要類是是哈希集集合(HashSet)及樹集合合(TreeSet)SortedSet接口一種特殊殊的Set其中的元元素是升升序排列列的,還還增加了了與次序序相關(guān)的的操作通常用于于存放詞詞匯表這這樣的內(nèi)內(nèi)容7.3.1Java集合框架架(續(xù))——Set、SortedSet接口集合合47List接口擴(kuò)展了Collection可包含重重復(fù)元素素元素是有有順序的的,每個(gè)個(gè)元素都都有一個(gè)個(gè)index值(從0開始)標(biāo)標(biāo)明元素素在列表表中的位位置實(shí)現(xiàn)它的的四個(gè)主主要類是是VectorArrayList:一種類類似數(shù)組組的形式式進(jìn)行存存儲(chǔ),因因此它的的隨機(jī)訪訪問速度度極快LinkedList:內(nèi)部實(shí)實(shí)現(xiàn)是鏈鏈表,適適合于在在鏈表中中間需要要頻繁進(jìn)進(jìn)行插入入和刪除除操作棧Stack7.3.1Java集合框架架(續(xù))——List接口集合合48Map接口不是Collection接口的繼繼承用于維護(hù)護(hù)鍵/值對(duì)(key/valuepairs)描述了從從不重復(fù)復(fù)的鍵到到值的映映射,是是一個(gè)從從關(guān)鍵字字到值的的映射對(duì)對(duì)象其中不能能有重復(fù)復(fù)的關(guān)鍵鍵字,每每個(gè)關(guān)鍵鍵字最多多能夠映映射到一一個(gè)值SortedMap接口一種特殊殊的Map,其中的的關(guān)鍵字字是升序序排列的的與SortedSet對(duì)等的Map,通常用用于詞典典和電話話目錄等等7.3.1Java集合框架架(續(xù))——Map、SortedMap接口集合合49接口的實(shí)實(shí)現(xiàn)Collection沒有直接接的實(shí)現(xiàn)現(xiàn),只是是作為其其他集合合接口的的最小公公分母除Collection以外,其其余五個(gè)個(gè)接口都都有實(shí)現(xiàn)現(xiàn)主要的實(shí)實(shí)現(xiàn)有SetHashSetSortedSetTreeSetListVector/ArrayList/LinkedListMapHashMapSortedMapTreeMap7.3.1Java集合框架架(續(xù))——接口口的實(shí)現(xiàn)現(xiàn)集合合50對(duì)集合運(yùn)運(yùn)算的算算法大多數(shù)算法法都是用于于操作List對(duì)象有兩個(gè)(min和max)可用于任意意集合對(duì)象象排序算法sort對(duì)List重新排序,,使其中的的元素按照照某種次序序關(guān)系升序序排列有兩種形式式簡(jiǎn)單形式只只是將元素素按照自然然次序排列列第二種形式式需要一個(gè)個(gè)附加的Comparator對(duì)象作為參參數(shù),用于于規(guī)定比較較規(guī)則,可可用于實(shí)現(xiàn)現(xiàn)反序或特特殊次序排排序7.3.1Java集合框架(續(xù))——對(duì)集合合運(yùn)算的算算法集合合51洗牌算法shuffle其作用與排排序算法恰恰好相反,,它打亂List中的任何次次序。也就就是說以隨隨機(jī)方式重重排元素,,任何次序序出現(xiàn)的幾幾率都是相相等的在實(shí)現(xiàn)偶然然性游戲的的時(shí)候,這這個(gè)算法很很有用,例例如洗牌常規(guī)數(shù)據(jù)處處理算法reverse::將一個(gè)List中的元素反反向排列fill:用指定的的值覆寫List中的每一個(gè)個(gè)元素,這這個(gè)操作在在重新初始始化List時(shí)有用copy::接受兩個(gè)個(gè)參數(shù),目目標(biāo)List和源List,將源中的的元素復(fù)制制到目標(biāo),,覆寫其中中的內(nèi)容。。目標(biāo)List必須至少與與源一樣長(zhǎng)長(zhǎng),如果更更長(zhǎng),則多多余的部分分內(nèi)容不受受影響7.3.1Java集合框架(續(xù))——對(duì)集合運(yùn)算算的算法集合合52查找算法binarySearch使用二分法法在一個(gè)有有序的List中查找指定定元素有兩種形式式第一種形式式假定List是按照自然然順序升序序排列的第二種形式式需要增加加一個(gè)Comparator對(duì)象,表示示比較規(guī)則則,并假定定List是按照這種種規(guī)則排序序的。尋找最值——用于任何集集合對(duì)象min和max算法返回指指定集合中中的最小值值和最大值值這兩個(gè)算法法分別都有有兩種形式式簡(jiǎn)單形式按按照元素的的自然順序序返回最值值另一種形式式需要附加加一個(gè)Comparator對(duì)象作為參參數(shù),并按按照Comparator對(duì)象指定的的比較規(guī)則則返回最值值7.3.1Java集合框架(續(xù))——對(duì)集合運(yùn)算算的算法集合合53Arrays類Java集合框架提提供了一套套專門用于于操作數(shù)組組的實(shí)用方方法,它們們作為靜態(tài)態(tài)方法存在在該類中還包括可以以將數(shù)組視視為列表((List)的靜態(tài)工工廠常用方法fill(type[]a,typeval):給數(shù)組填充充,就是簡(jiǎn)簡(jiǎn)單地把一一個(gè)數(shù)組全全部或者某某段數(shù)據(jù)填填成一個(gè)特特殊的值equals(type[]a,type[]b):實(shí)現(xiàn)兩個(gè)個(gè)數(shù)組的比比較,相等等時(shí)返回truesort(type[]a):對(duì)數(shù)組排序序binarySearch(

):對(duì)數(shù)組元素素進(jìn)行二分分法查找Arrays.asList(Object[]a):實(shí)現(xiàn)數(shù)組到到ArrayList的轉(zhuǎn)換7.3.1Java集合框架(續(xù))——數(shù)組實(shí)用方方法集合合54數(shù)組的填充充和復(fù)制importjava.util.*;publicclassCopyingArrays{publicstaticvoidmain(String[]args){int[]i=newint[25];int[]j=newint[25];Arrays.fill(i,47);Arrays.fill(j,99);System.arraycopy(i,0,j,0,i.length);int[]k=newint[10];Arrays.fill(k,103);System.arraycopy(i,0,k,0,k.length);Arrays.fill(k,103);System.arraycopy(k,0,i,0,k.length);Integer[]u=newInteger[10];Integer[]v=newInteger[5];Arrays.fill(u,newInteger(47));Arrays.fill(v,newInteger(99));System.arraycopy(v,0,u,u.length/2,v.length);}}JDK1.5,可使用Arrays.toString函數(shù)方便的的顯示出數(shù)數(shù)組的內(nèi)容容7.3.1Java集合框架(續(xù))——數(shù)組實(shí)用方方法集合合55數(shù)組的比較較importjava.util.*;publicclassComparingArrays{publicstaticvoidmain(String[]args){int[]a1=newint[10];int[]a2=newint[10];Arrays.fill(a1,47);Arrays.fill(a2,47);System.out.println(Arrays.equals(a1,a2));//truea2[3]=11;System.out.println(Arrays.equals(a1,a2));//falseString[]s1=newString[5];Arrays.fill(s1,"Hi");String[]s2={"Hi","Hi","Hi","Hi","Hi"};System.out.println(Arrays.equals(s1,s2));//true}}7.3.1Java集合框架(續(xù))——數(shù)組實(shí)實(shí)用方法集合合56向量(Vector,ArrayList)Vector/ArrayList實(shí)現(xiàn)了Collection接口的具體體類能夠存儲(chǔ)任任意對(duì)象,,但通常情情況下,這這些不同類類型的對(duì)象象都具有相相同的父類類或接口不能存儲(chǔ)基基本類型((primitive)的數(shù)據(jù),,除非將這這些數(shù)據(jù)包包裹在包裹裹類中其容量能夠夠根據(jù)空間間需要自動(dòng)動(dòng)擴(kuò)充增加元素方方法的效率率較高,除除非空間已已滿,在這這種情況下下,在增加加之前需要要先擴(kuò)充容容量Vector方法是同步步的,線程程安全ArrayList方法是非同同步的,效效率較高集合合57Vector類的構(gòu)造方方法VectormyVector=newVector();//初始容量為為10VectormyVector=newVector(intcap);VectormyVector=newVector(Collectioncol);以參數(shù)col中的元素進(jìn)進(jìn)行初始化化也可用數(shù)組組元素生成成,但需先先將數(shù)組轉(zhuǎn)轉(zhuǎn)換成List對(duì)象,如String[]num={"one","two","three","four","five"};VectoraVector=newVector(java.util.Arrays.asList(num));ArrayList的構(gòu)造方法法與Vector類似ArrayListmyList=newArrayList();ArrayListmyList=newArrayList(intcap);ArrayListmyList=newArrayList(Collectioncol);向量(Vector,ArrayList)(續(xù))——構(gòu)造方方法集合合58本節(jié)所有常常用方法如如無(wú)特殊說說明,為Vector,ArrayList類共有之方方法voidadd(Objectobj)——添加一個(gè)對(duì)對(duì)象,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");booleanaddAll(Collectioncol)——添加整個(gè)集集合,如果果接收者對(duì)對(duì)象的結(jié)果果有變化,,則返回true,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");VectoryourList=newVector();yourList.addAll(teamList);向量(Vector,ArrayList)(續(xù))——常用方方法1集合合59intsize()——返回元素的的個(gè)數(shù)。booleanisEmpty()——如果不含元元素,則返返回trueObjectget(intpos)——返回指定位位置的元素素,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.get(1);//返回"LiHong"teamList.get(3);//產(chǎn)生例例外ArrayIndexOutOfBoundsException集合合向量(Vector,ArrayList)(續(xù))——常常用方方法260voidset(intpos,Objectobj)——用參數(shù)數(shù)對(duì)象象替換換指定定位置置的對(duì)對(duì)象,,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.set(2,"LiuNa");System.out.println(teamList);//顯示[ZhangWei,LiHong,LiuNa]teamList.set(3,"MaLi");//產(chǎn)生例例外ArrayIndexOutOfBoundsException集合合向量(Vector,ArrayList)(續(xù))——常常用方方法361booleanremove(Objectobj)——去除給給定對(duì)對(duì)象的的第一一次出出現(xiàn),,如果果找到到了對(duì)對(duì)象,,則返返回true。去除除一個(gè)個(gè)對(duì)象象后,,其后后面的的所有有對(duì)象象都依依次向向前移移動(dòng)。。如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove("LiHong");teamList.remove("WangHong");//不做任任何事事,也也不出出現(xiàn)錯(cuò)錯(cuò)誤System.out.println(teamList);//顯示[ZhangWei,YuHongshu]集合合向量(Vector,ArrayList)(續(xù))——常常用方方法462Objectremove(intpos)——去除給給定位位置的的元素素,并并返回回被去去除的的對(duì)象象。如如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove(0);//去除ZhangWeiteamList.remove(0);//去除LiHongSystem.out.println(teamList);//顯示[YuHongshu]teamList.remove(1);//產(chǎn)生例例外ArrayIndexOutOfBoundsException集合合向量(Vector,ArrayList)(續(xù))——常常用方方法563booleanremoveAll(Collectioncol)——從接收收者對(duì)對(duì)象中中去除除所有有在參參數(shù)對(duì)對(duì)象中中出現(xiàn)現(xiàn)的元元素,,如果果接收收者對(duì)對(duì)象的的結(jié)果果有變變化,,則返返回true。如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");VectoryourList=newVector();yourList.add("YuHongshu");yourList.add("HeLi");yourList.add("ZhangWei");teamList.removeAll(yourList);System.out.println(teamList);//顯示[LiHong]集合合向量(Vector,ArrayList)(續(xù))——常常用方方法664voidclear()——去除所所有的的元素素booleancontains(Objectobj)——返回是是否包包含指指定的的對(duì)象象,如如果包包含則則返回回true;否則則,返返回falsebooleancontainsAll(Collectioncol)——返回是是否包包含參參數(shù)col中的所所有對(duì)對(duì)象intindexOf(Objectobj)——返回給給定對(duì)對(duì)象在在Vector/ArrayList中第一一次出出現(xiàn)的的位置置,如如不存存在,,則返返回-1。如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.indexOf("LiHong");//返回1。teamList.indexOf("ZhangLi");//返回-1。集合合向量(Vector,ArrayList)(續(xù))——常常用方方法765Enumerationelements()——返回包包含Vector中所所有有元元素素的的Enumeration類對(duì)對(duì)象象。。該方方法法只只能能應(yīng)應(yīng)用用于于Vector對(duì)象象,,不不能能應(yīng)應(yīng)用用于于ArrayList對(duì)象象。。如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.elements();//返回回Enumeration類對(duì)對(duì)象象。。Iteratoriterator()———返回回包包含含Vector/ArrayList中所所有有元元素素的的Iterator類對(duì)對(duì)象象集合合向量量(Vector,ArrayList)(續(xù))———常常用用方方法法866當(dāng)使使用用get()方法法取取出出Vector中的的元元素素時(shí)時(shí),,返返回回的的類類型型都都是是Object類型型。。Vector的使使用用者者需需要要記記住住存存入入對(duì)對(duì)象象的的具具體體類類型型,,當(dāng)當(dāng)使使用用get()方法法取取出出后后,,再再塑塑型型成成其其本本來(lái)來(lái)的的類類型型。。例例如如,,創(chuàng)創(chuàng)建建Customer類對(duì)對(duì)象象的的Vector如下下::String[]names={"Zhang","Li","Wang","Zhao"};Vectorv=newVector();for(inti=0;i<names.length;i++){Customerc=newCustomer();c.setName(names[i]);v.add(c);}使用用get()方法法將將Customer對(duì)象象從從Vector中取取出出后后,,需需要要再再塑塑型型成成Customer類。。代代碼碼如如下下::for(inti=0;i<v.size();i++){Customerc=(Customer)v.get(i);System.out.println(c.getName());}向量量(Vector,ArrayList)(續(xù))———使使用用Vector存取對(duì)象集合合67與所有的集集合類一樣樣,Vector不能存儲(chǔ)原原始類型((primitive)的數(shù)據(jù),,如果要存存儲(chǔ),則需需要使用包包裹類。例例如,VectorrateVector=newVector();double[]rates={36.25,25.4,18.34,35.7,23.78};for(inti=0;i<rates.length;i++)rateVector.add(newDouble(rates[i]));當(dāng)從Vector中取出時(shí),,需要塑型型成相應(yīng)的的包裹類型型,之后再再還原為原原始類型。。代碼如下下:doublesum=0.0;for(inti=0;i<rateVector.size();i++)sum+=((Double)rateVector.get(i)).doubleValue();returnsum;向量(Vector,ArrayList)(續(xù))——使用Vector存取數(shù)據(jù)集合合68Enumeration及Iterator接口集合類對(duì)象象中每個(gè)元元素的遍歷歷方法for(inti=0;i<v.size();i++){Customerc=(Customer)v.get(i);System.out.println(c.getName());}Enumeration/Iterator能夠從集合合類對(duì)象中中提取每一一個(gè)元素,,并提供了了用于遍歷歷元素的方方法Java中的許多方方法(如elements())都返回Enumeration類型的對(duì)象象,而不是是返回集合合類對(duì)象Enumeration接口不能用用于ArrayList對(duì)象,而Iterator接口既可以以用于ArrayList對(duì)象,也可可以用于Vector對(duì)象集合合69Enumeration接口(1.0版)提供了兩個(gè)個(gè)實(shí)例方法法hasMoreElements()——判斷是否還還有剩下的的元素;nextElement()——取得下一個(gè)個(gè)元素。遍歷集合類類對(duì)象v中的每個(gè)元元素可使用用下面代碼碼完成:Enumeratione=v.elements();while(e.hasMoreElements()){Customerc=(Customer)v.nextElement();System.out.println(c.getName());}Enumeration及Iterator接口(續(xù))——Enumeration接口集合合70Enumeration類使用舉例例importjava.util.Vector;importjava.util.Enumeration;publicclassEnumerationTester{publicstaticvoidmain(Stringargs[]){Enumerationdays;VectordayNames=newVector();dayNames.add("Sunday");dayNames.add("Monday");dayNames.add("Tuesday");dayNames.add("Wednesday");dayNames.add("Thursday");dayNames.add("Friday");dayNames.add("Saturday");days=dayNames.elements();while(days.hasMoreElements())System.out.println(days.nextElement());}}7.3.3Enumeration及Iterator接口(續(xù))——例7_6集合合71運(yùn)行結(jié)果SundayMondayTuesdayWednesdayThursdayFridaySaturday常見編程錯(cuò)錯(cuò)誤在一次循環(huán)環(huán)中調(diào)用兩兩次nextElement()方法在遍歷的過過程中從集集合對(duì)象中中去除元素素,具體見見例7-77.3.3Enumeration及Iterator接口(續(xù))——例7_6運(yùn)行結(jié)果集合合72Enumeration類的問題舉舉例importjava.util.Vector;importjava.util.Enumeration;publicclassEnumerationTester2{publicstaticvoidmain(Stringargs[]){String[]num={"one","two","three","four","five","six","seven","eight","nine","ten"};VectoraVector=newVector(java.util.Arrays.asList(num));System.out.println("BeforeVector:"+aVector);Enumerationnums=aVector.elements();while(nums.hasMoreElements()){StringaString=(String)nums.nextElement();System.out.println(aString);if(aString.length()>4)aVector.remove(aString);}System.out.println("AfterVector:"+aVector);}}7.3.3Enumeration及Iterator接口(續(xù))——例7_7集合合73運(yùn)行結(jié)果BeforeVector:[one,two,three,four,five,six,seven,eight,nine,ten]onetwothreefivesixsevenninetenAfterVector:[one,two,four,five,six,eight,nine,ten]可見,長(zhǎng)度度大于4的字符串并并沒有如預(yù)預(yù)期的那樣樣都從向量量中去除。。這是Enumeration類存在的問問題。因此此,如果需需要在遍歷歷的過程中中去除對(duì)象象,就不要要使用Enumeration類7.3.3Enumeration及Iterator接口(續(xù))——例7_7運(yùn)行結(jié)果集合合74Iterator接口(1.2版,替代Enumeration)也是一個(gè)遍遍歷集合元元素的工具具,是對(duì)Enumeration接口的改進(jìn)進(jìn),因此在在遍歷集合合元素時(shí)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論