對象群體的組織_第1頁
對象群體的組織_第2頁
對象群體的組織_第3頁
對象群體的組織_第4頁
對象群體的組織_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

——對象數組的初始化對象數組第5頁,共108頁,2024年2月25日,星期天6使用數組存儲一個班的學生信息及考試成績。學生信息包括學號、姓名、三門課(英語、數學、計算機)的成績及總成績。首先聲明學生類Student屬性包括學號(id),姓名(name),英語成績(eng),數學成績(math),計算機成績(comp),總成績(sum)方法包括構造方法,get方法,set方法,toString方法,equals方法,compare方法(比較兩個學生的總成績,結果分大于,小于,等于),sum方法(計算總成績)實現Serializable接口,以便對象持久化,7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第6頁,共108頁,2024年2月25日,星期天7importjava.io.*;publicclassStudentimplementsSerializable{ privateStringid; //學號

privateStringname; //姓名

privateinteng; //英語成績

privateintmath; //數學成績

privateintcomp;//計算機成績

privateintsum; //總成績

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

7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第7頁,共108頁,2024年2月25日,星期天8 publicStudent(Students){ this.id=s.id; =newString(); this.eng=s.eng; this.math=s.math; p=p; sum();//計算總成績 }

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

7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第8頁,共108頁,2024年2月25日,星期天9 publicvoidsetEng(inteng){ this.eng=eng; sum();//計算總成績 }

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

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

publicStringgetId(){ returnid; }

7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第9頁,共108頁,2024年2月25日,星期天10 publicStringgetName(){ returnname; } publicintgetEng(){ returneng; } publicintgetMath(){ returnmath; } publicintgetComp(){ returncomp; } publicintgetSum(){ returnsum; }

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

7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第10頁,共108頁,2024年2月25日,星期天11 publicStringtoString(){ 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())); } //比較成績大小,當前對象成績比參數對象成績大時返回1,相等時返回0,其它返回-1.

publicintcompare(StudentA){ if(this.getSum()>A.getSum())return1; elseif(this.getSum()==A.getSum())return0; elsereturn-1; } }7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第11頁,共108頁,2024年2月25日,星期天12下面聲明班級類StudentClass:屬性包括班級名稱(name),容量(capacity),學生(students),實際人數(size)。方法包括構造方法,get方法,set方法,toString方法。publicclassStudentClass{ privateStringname;//班級名稱

staticintcapacity=40;//最大容量

privateStudentstudents[];//學生

privateintsize;//實際人數

7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第12頁,共108頁,2024年2月25日,星期天13

publicStudentClass(Stringname,intsize){ =name; this.size=size; students=newStudent[capacity]; } publicStringgetName(){ returnname; }publicintgetCapacity(){ returncapacity; } publicStudent[]getStudents(){ returnstudents; } 7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第13頁,共108頁,2024年2月25日,星期天14 publicintgetSize(){ 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]); }

7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第14頁,共108頁,2024年2月25日,星期天15 publicStringtoString(){ Strings; s="班級:"+name+"\t"+"容量:"+capacity+"\t"+ "實際人數:"+size+"\n\n"; s=s+“學號”+“\t”+“姓名”+“\t”+“英語”+“\t”+“數學”+“\t” +“計算機”+"\t"+"總成績\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; }}7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第15頁,共108頁,2024年2月25日,星期天16下面聲明測試類Tester1(其中Keyboard類的聲明見第3章例3-12),為測試簡單,僅生成具有5名學生的班級,5名學生的信息從鍵盤輸入,為了避免以后再重復輸入,可將輸入的學生信息保存到文件中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);

7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第16頁,共108頁,2024年2月25日,星期天17 //將學生信息保存到文件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);} }

7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第17頁,共108頁,2024年2月25日,星期天18 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; }}7.1.1用數組存儲對象(續(xù))

——例7_1對象數組第18頁,共108頁,2024年2月25日,星期天19運行結果如下(其中學生信息的輸入只顯示一部分):輸入第1個學生的信息:學號:250201姓名:李紅英語成績:88數學成績:76計算機成績:60輸入第2個學生的信息:……班級:軟件0201容量:40實際人數:5學號姓名英語數學計算機總成績250201李紅887660224250202張林786780225250203董玉梅868075241250204張力706875213250205何為8090782487.1.1用數組存儲對象(續(xù))

——例7_1運行結果對象數組第19頁,共108頁,2024年2月25日,星期天20查找也稱為檢索,就是從一組數據中找出所需的具有某種特征的數據項順序查找對所存儲的數據從第一項開始(也可以從最后一項開始),依次與所要查找的數據進行比較,直到找到該數據或將全部元素都找完還沒有找到該數據為止7.1.1用數組存儲對象(續(xù))

——為班級類添加查找方法對象數組第20頁,共108頁,2024年2月25日,星期天21已知學生的學號,查找此學生是否存在。如果存在,返回其在數組中的下標位置;如果不存在,返回-1。順序查找方法的代碼如下publicintfind(Stringid){ for(inti=0;i<size;i++) if(students[i].getId().equals(id))returni; return-1;}7.1.1用數組存儲對象(續(xù))

——為班級類添加查找方法對象數組第21頁,共108頁,2024年2月25日,星期天22在數組的末尾增加一個學生對象增加之前需先判斷數組中是否還有空間,并且在數組中查找將要增加的學號是否已經存在增加成功,返回true;否則,返回false

publicbooleanadd(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; }7.1.1用數組存儲對象(續(xù))

——為班級類添加增加方法對象數組第22頁,共108頁,2024年2月25日,星期天23已知一個Student對象,將此對象從數組中刪除

publicbooleandel(StudentaStudent){ intpos=find(aStudent.getId()); if(pos==-1)returnfalse; for(inti=pos+1;i<size;i++) students[i-1]=students[i]; size--; returntrue; } 7.1.1用數組存儲對象(續(xù))

——為班級類編寫刪除方法對象數組第23頁,共108頁,2024年2月25日,星期天24已知學號,刪除一個學生

publicbooleandel(Stringid){ intpos=find(id); if(pos==-1)returnfalse; for(inti=pos+1;i<size;i++) students[i-1]=students[i]; size--; returntrue; } 7.1.1用數組存儲對象(續(xù))

——為班級類添加刪除方法對象數組第24頁,共108頁,2024年2月25日,星期天257.1.2對數組元素進行排序排序按照預先規(guī)定的準則(如升序或降序等),把數據有次序地排列起來已經設計出許多排序算法,常用的排序算法有選擇排序插入排序交換排序以降序為例進行介紹對象數組第25頁,共108頁,2024年2月25日,星期天26選擇排序的基本思想先在未排序序列中選一個最小元素,作為已排序子序列然后再重復地從未排序子序列中選取一個最小元素,把它加到已經排序的序列中,作為已排序子序列的最后一個元素直到把未排序子序列中的元素處理完為止7.1.2對數組元素進行排序(續(xù))

——選擇排序對象數組第26頁,共108頁,2024年2月25日,星期天27用選擇排序方法將例7-1中生成的文件stu.ser中的班級學生按總成績從高到低排序在例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; }}7.1.2對數組元素進行排序(續(xù))

——例7_2對象數組第27頁,共108頁,2024年2月25日,星期天28測試類代碼如下importjava.io.*;publicclassSortTester{ publicstaticvoidmain(Stringargs[]){ Studentstudents[]=newStudent[5]; //從文件stu.ser中讀出學生信息

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); }

7.1.2對數組元素進行排序(續(xù))

——例7_2對象數組第28頁,共108頁,2024年2月25日,星期天29 StudentClassaClass=newStudentClass("軟件0201",5);

aClass.setStudents(students); System.out.println(aClass); //選擇排序

aClass.selectionSort(); System.out.println("選擇排序后的結果:\n"); System.out.println(aClass); }}7.1.2對數組元素進行排序(續(xù))

——例7_2對象數組第29頁,共108頁,2024年2月25日,星期天30運行結果班級:軟件0201容量:40實際人數:5學號姓名英語數學計算機總成績250201李紅887660224250202張林786780225250203董玉梅868075241250204張力706875213250205何為809078248選擇排序后的結果:班級:軟件0201容量:40實際人數:5學號姓名英語數學計算機總成績250205何為809078248250203董玉梅868075241250202張林786780225250201李紅887660224250204張力7068752137.1.2對數組元素進行排序(續(xù))

——例7_2運行結果對象數組第30頁,共108頁,2024年2月25日,星期天31插入排序將待排序的數據按一定的規(guī)則逐一插入到已排序序列中的合適位置處,直到將全部數據都插入為止插入的規(guī)則不同,便形成了不同的插入排序方法。其中,算法最簡單的為直接插入排序方法直接插入排序方法先以未排序序列的第一個元素作為已排序子序列,然后從原來的第二個元素起,將各元素逐一插入到已排序子序列中合適的位置,直到把全部元素都插入為止。7.1.2對數組元素進行排序(續(xù))

——插入排序對象數組第31頁,共108頁,2024年2月25日,星期天32直接插入排序的步驟假設數組a中有n個元素a[0]、a[1]、……、a[n-1]首先要把a[0]作為已排序子序列。然后逐一將a[1]、a[2]、……、a[n-1]插入到已排序子序列中。每插入一個元素a[i]都要執(zhí)行如下兩步操作:第一步,在已排序子序列中找一個合適位置j,使a[j]>a[i]>a[j+1]。第二步,將a[i]插入到a[j]之后。在插入之前,需要先保存a[i]的值,之后將a[j+1]、……、a[n-1]依次向后移一位(后移操作也可在第一步的查找過程中進行)7.1.2對數組元素進行排序(續(xù))

——直接插入排序對象數組第32頁,共108頁,2024年2月25日,星期天33在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; } }7.1.2對數組元素進行排序(續(xù))

——例7_3對象數組第33頁,共108頁,2024年2月25日,星期天347.1.3在已排序的數組中查找一批Integer類型的數據已按升序排列好,a1<a2<…<an,存儲在數組a[0]、a[1]、……、a[n-1]中,現在要對該數組進行查找,看給定的數據x是否在此數組中順序查找方法按從左向右的順序查找,當x小于a[i]時就應該停止查找publicintseqSearch(intx){for(inti=0;(i<n)&&(x>=a[i].intValue());i++)if(a[i].intValue()==x)returni;return-1;}二分查找。在0到n-1中間選一個正整數k,用k把原來的有序序列分為三個有序子序列:a[0],a[1],…,a[k-1]a[k]a[k+1],a[k+2],…,a[n-1]對象數組第34頁,共108頁,2024年2月25日,星期天35具有排序數組的類SortedIntArraysearch方法運用二分查找算法:在給定的數組范圍內查找某一元素,如果存在,返回元素所在的下標位置,如果不存在,則返回元素應該在的位置(如果要將此元素插入到數組中,且保持數組仍然有序的位置)將此功能與插入功能相結合,可實現對數組元素進行排序publicclassSortedIntArray{ privateintcapacity; privateInteger[]rep; privateintsize;

publicSortedIntArray(intn){ capacity=n; rep=newInteger[capacity]; }

7.1.3在已排序的數組中查找(續(xù))

——例7_4對象數組第35頁,共108頁,2024年2月25日,星期天36publicSortedIntArray(){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在已排序的數組中查找(續(xù))

——例7_4對象數組第36頁,共108頁,2024年2月25日,星期天37publicintsearch(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在已排序的數組中查找(續(xù))

——例7_4對象數組第37頁,共108頁,2024年2月25日,星期天38 publicStringtoString(){ 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在已排序的數組中查找(續(xù))

——例7_4對象數組第38頁,共108頁,2024年2月25日,星期天39運行結果1,2,3,4,7,7,8,9,2,4,7,9,7.1.3在已排序的數組中查找(續(xù))

——例7_4運行結果對象數組第39頁,共108頁,2024年2月25日,星期天407.3集合數組的優(yōu)點是Java提供的隨機訪問對象序列的最有效方法是一個簡單的線性序列,訪問元素的速度較快數組的缺點大小自創(chuàng)建以后就固定了,在其整個生存期內其大小不可改變數組元素只能是同一類型集合可動態(tài)改變其大小可在序列中存儲不同類型的數據第40頁,共108頁,2024年2月25日,星期天41集合把具有相同性質的一類東西,匯聚成一個整體在Java2中有很多與集合有關的接口及類它們被組織在以Collection及Map接口為根的層次結構中,稱為集合框架在Java2之前,在Java1.0/1.1中,沒有完整的集合框架。只有一些簡單的可以自擴展的容器類VectorHashtable7.3集合(續(xù))集合第41頁,共108頁,2024年2月25日,星期天427.3.1Java集合框架集合框架(JavaCollectionsFramework)為表示和操作集合而規(guī)定的一種統(tǒng)一的標準的體系結構提供了一些現成的數據結構可供使用,程序員可以利用集合框架快速編寫代碼,并獲得優(yōu)良性能包含三大塊內容對外的接口:表示集合的抽象數據類型,使集合的操作與表示分開接口的實現:指實現集合接口的Java類,是可重用的數據結構對集合運算的算法:是指執(zhí)行運算的方法,例如在集合上進行查找和排序集合第42頁,共108頁,2024年2月25日,星期天43集合框架接口聲明了對各種集合類型執(zhí)行的一般操作包括Collection、Set、List、SortedSet、Map、SortedMap基本結構如圖7.3.1Java集合框架(續(xù))

——對外的接口集合第43頁,共108頁,2024年2月25日,星期天44類層次如圖,包括4個接口、4個抽象類及6個具體類7.3.1Java集合框架(續(xù))

——Collection接口CollectionAbstractCollectionVectorArrayListStackListSetSortedSetAbstractSetAbstractListAbstractSequentialListHashSetTreeSetLinkedList集合第44頁,共108頁,2024年2月25日,星期天45Collection接口聲明了一組操作成批對象的抽象方法:查詢方法、修改方法查詢方法intsize()–返回集合對象中包含的元素個數booleanisEmpty()–判斷集合對象中是否還包含元素,如果沒有任何元素,則返回truebooleancontains(Objectobj)–判斷對象是否在集合中booleancontainsAll(Collectionc)–判斷方法的接收者對象是否包含集合中的所有元素7.3.1Java集合框架(續(xù))

——Collection接口集合第45頁,共108頁,2024年2月25日,星期天46修改方法包括booleanadd(Objectobj)–向集合中增加對象booleanaddAll(Collectionc)–將參數集合中的所有元素增加到接收者集合中booleanremove(Objectobj)–從集合中刪除對象booleanremoveAll(Collectionc)-將參數集合中的所有元素從接收者集合中刪除booleanretainAll(Collectionc)–在接收者集合中保留參數集合中的所有元素,其它元素都刪除voidclear()–刪除集合中的所有元素7.3.1Java集合框架(續(xù))

——Collection接口集合第46頁,共108頁,2024年2月25日,星期天47Set接口擴展了Collection禁止重復的元素,是數學中“集合”的抽象對equals和hashCode操作有了更強的約定,如果兩個Set對象包含同樣的元素,二者便是相等的實現它的兩個主要類是哈希集合(HashSet)及樹集合(TreeSet)SortedSet接口一種特殊的Set其中的元素是升序排列的,還增加了與次序相關的操作通常用于存放詞匯表這樣的內容7.3.1Java集合框架(續(xù))

——Set、SortedSet接口集合第47頁,共108頁,2024年2月25日,星期天48List接口擴展了Collection可包含重復元素元素是有順序的,每個元素都有一個index值(從0開始)標明元素在列表中的位置實現它的四個主要類是VectorArrayList:一種類似數組的形式進行存儲,因此它的隨機訪問速度極快LinkedList:內部實現是鏈表,適合于在鏈表中間需要頻繁進行插入和刪除操作棧Stack7.3.1Java集合框架(續(xù))

——List接口集合第48頁,共108頁,2024年2月25日,星期天49Map接口不是Collection接口的繼承用于維護鍵/值對(key/valuepairs)描述了從不重復的鍵到值的映射,是一個從關鍵字到值的映射對象其中不能有重復的關鍵字,每個關鍵字最多能夠映射到一個值SortedMap接口一種特殊的Map,其中的關鍵字是升序排列的與SortedSet對等的Map,通常用于詞典和電話目錄等

7.3.1Java集合框架(續(xù))

——Map、SortedMap接口集合第49頁,共108頁,2024年2月25日,星期天50接口的實現Collection沒有直接的實現,只是作為其他集合接口的最小公分母除Collection以外,其余五個接口都有實現主要的實現有Set

HashSetSortedSet

TreeSetListVector/ArrayList/LinkedListMap

HashMapSortedMap

TreeMap7.3.1Java集合框架(續(xù))

——接口的實現集合第50頁,共108頁,2024年2月25日,星期天51對集合運算的算法大多數算法都是用于操作List對象有兩個(min和max)可用于任意集合對象排序算法sort對List重新排序,使其中的元素按照某種次序關系升序排列有兩種形式簡單形式只是將元素按照自然次序排列第二種形式需要一個附加的Comparator對象作為參數,用于規(guī)定比較規(guī)則,可用于實現反序或特殊次序排序7.3.1Java集合框架(續(xù))

——對集合運算的算法集合第51頁,共108頁,2024年2月25日,星期天52洗牌算法shuffle其作用與排序算法恰好相反,它打亂List中的任何次序。也就是說以隨機方式重排元素,任何次序出現的幾率都是相等的在實現偶然性游戲的時候,這個算法很有用,例如洗牌常規(guī)數據處理算法reverse::將一個List中的元素反向排列fill:用指定的值覆寫List中的每一個元素,這個操作在重新初始化List時有用copy::接受兩個參數,目標List和源List,將源中的元素復制到目標,覆寫其中的內容。目標List必須至少與源一樣長,如果更長,則多余的部分內容不受影響7.3.1Java集合框架(續(xù))

——對集合運算的算法集合第52頁,共108頁,2024年2月25日,星期天53查找算法binarySearch使用二分法在一個有序的List中查找指定元素有兩種形式第一種形式假定List是按照自然順序升序排列的第二種形式需要增加一個Comparator對象,表示比較規(guī)則,并假定List是按照這種規(guī)則排序的。尋找最值——用于任何集合對象min和max算法返回指定集合中的最小值和最大值這兩個算法分別都有兩種形式簡單形式按照元素的自然順序返回最值另一種形式需要附加一個Comparator對象作為參數,并按照Comparator對象指定的比較規(guī)則返回最值7.3.1Java集合框架(續(xù))

——對集合運算的算法集合第53頁,共108頁,2024年2月25日,星期天54Arrays類Java集合框架提供了一套專門用于操作數組的實用方法,它們作為靜態(tài)方法存在該類中還包括可以將數組視為列表(List)的靜態(tài)工廠常用方法fill(type[]a,typeval):給數組填充,就是簡單地把一個數組全部或者某段數據填成一個特殊的值equals(type[]a,type[]b):實現兩個數組的比較,相等時返回truesort(type[]a):對數組排序binarySearch(

):對數組元素進行二分法查找Arrays.asList(Object[]a):實現數組到ArrayList的轉換7.3.1Java集合框架(續(xù))

——數組實用方法集合第54頁,共108頁,2024年2月25日,星期天55數組的填充和復制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函數方便的顯示出數組的內容7.3.1Java集合框架(續(xù))

——數組實用方法集合第55頁,共108頁,2024年2月25日,星期天56數組的比較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));//true a2[3]=11; System.out.println(Arrays.equals(a1,a2));//false String[]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ù))

——數組實用方法集合第56頁,共108頁,2024年2月25日,星期天577.3.2向量(Vector,ArrayList)Vector/ArrayList實現了Collection接口的具體類能夠存儲任意對象,但通常情況下,這些不同類型的對象都具有相同的父類或接口不能存儲基本類型(primitive)的數據,除非將這些數據包裹在包裹類中其容量能夠根據空間需要自動擴充增加元素方法的效率較高,除非空間已滿,在這種情況下,在增加之前需要先擴充容量Vector方法是同步的,線程安全ArrayList方法是非同步的,效率較高集合第57頁,共108頁,2024年2月25日,星期天58Vector類的構造方法VectormyVector=newVector();//初始容量為10VectormyVector=newVector(intcap);VectormyVector=newVector(Collectioncol);以參數col中的元素進行初始化也可用數組元素生成,但需先將數組轉換成List對象,如String[]num={"one","two","three","four","five"};VectoraVector=newVector(java.util.Arrays.asList(num));ArrayList的構造方法與Vector類似ArrayListmyList=newArrayList();ArrayListmyList=newArrayList(intcap);ArrayListmyList=newArrayList(Collectioncol);7.3.2向量(Vector,ArrayList)(續(xù))

——構造方法集合第58頁,共108頁,2024年2月25日,星期天59本節(jié)所有常用方法如無特殊說明,為Vector,ArrayList類共有之方法voidadd(Objectobj)——添加一個對象,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");booleanaddAll(Collectioncol)——添加整個集合,如果接收者對象的結果有變化,則返回true,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");VectoryourList=newVector();yourList.addAll(teamList);

7.3.2向量(Vector,ArrayList)(續(xù))

——常用方法1集合第59頁,共108頁,2024年2月25日,星期天60intsize()——返回元素的個數。booleanisEmpty()——如果不含元素,則返回trueObjectget(intpos)——返回指定位置的元素,如VectorteamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.get(1);//返回"LiHong"teamList.get(3);//產生例外ArrayIndexOutOfBoundsException集合7.3.2向量(Vector,ArrayList)(續(xù))

——常用方法2第60頁,共108頁,2024年2月25日,星期天61voidset(intpos,Objectobj)——用參數對象替換指定位置的對象,如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");//產生例外ArrayIndexOutOfBoundsException集合7.3.2向量(Vector,ArrayList)(續(xù))

——常用方法3第61頁,共108頁,2024年2月25日,星期天62booleanremove(Objectobj)——去除給定對象的第一次出現,如果找到了對象,則返回true。去除一個對象后,其后面的所有對象都依次向前移動。如VectorteamList=newVector();

teamList.add("ZhangWei");

teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove("LiHong");teamList.remove("WangHong");//不做任何事,也不出現錯誤System.out.println(teamList);//顯示[ZhangWei,YuHongshu]集合7.3.2向量(Vector,ArrayList)(續(xù))

——常用方法4第62頁,共108頁,2024年2月25日,星期天63Objectremove(intpos)——去除給定位置的元素,并返回被去除的對象。如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);//產生例外ArrayIndexOutOfBoundsException集合7.3.2向量(Vector,ArrayList)(續(xù))

——常用方法5第63頁,共108頁,2024年2月25日,星期天64booleanremoveAll(Collectioncol)——從接收者對象中去除所有在參數對象中出現的元素,如果接收者對象的結果有變化,則返回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]集合7.3.2向量(Vector,ArrayList)(續(xù))

——常用方法6第64頁,共108頁,2024年2月25日,星期天65voidclear()——去除所有的元素booleancontains(Objectobj)——返回是否包含指定的對象,如果包含則返回true;否則,返回falsebooleancontainsAll(Collectioncol)——返回是否包含參數col中的所有對象intindexOf(Objectobj)——返回給定對象在Vector/ArrayList中第一次出現的位置,如不存在,則返回-1。如VectorteamList=newVector();

teamList.add("ZhangWei");

teamList.add("LiHong");teamList.indexOf("LiHong");//返回1。teamList.indexOf("ZhangLi");//返回-1。集合7.3.2向量(Vector,ArrayList)(續(xù))

——常用方法7第65頁,共108頁,2024年2月25日,星期天66Enumerationelements()——返回包含Vector中所有元素的Enumeration類對象。該方法只能應用于Vector對象,不能應用于ArrayList對象。如VectorteamList=newVector();

teamList.add("ZhangWei");

teamList.add("LiHong");teamList.add("YuHongshu");teamList.elements();//返回Enumeration類對象。Iteratoriterator()——返回包含Vector/ArrayList中所有元素的Iterator類對象集合7.3.2向量(Vector,ArrayList)(續(xù))

——常用方法8第66頁,共108頁,2024年2月25日,星期天67當使用get()方法取出Vector中的元素時,返回的類型都是Object類型。Vector的使用者需要記住存入對象的具體類型,當使用get()方法取出后,再塑型成其本來的類型。例如,創(chuàng)建Customer類對象的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對象從Vector中取出后,需要再塑型成Customer類。代碼如下:for(inti=0;i<v.size();i++){

Customerc=(Customer)v.get(i);

System.out.println(c.getName());}7.3.2向量(Vector,ArrayList)(續(xù))

——使用Vector存取對象集合第67頁,共108頁,2024年2月25日,星期天68與所有的集合類一樣,Vector不能存儲原始類型(primitive)的數據,如果要存儲,則需要使用包裹類。例如,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]));當從Vector中取出時,需要塑型成相應的包裹類型,之后再還原為原始類型。代碼如下:doublesum=0.0;for(inti=0;i<rateVector.size();i++)

sum+=((Double)rateVector.get(i)).doubleValue();returnsum;7.3.2向量(Vector,ArrayList)(續(xù))

——使用Vector存取數據集合第68頁,共108頁,2024年2月25日,星期天697.3.3Enumeration及Iterator接口集合類對象中每個元素的遍歷方法for(inti=0;i<v.size();i++){

Customerc=(Customer)v.get(i);

System.out.println(c.getName());}Enumeration/Iterator能夠從集合類對象中提取每一個元素,并提供了用于遍歷元素的方法Java中的許多方法(如elements())都返回Enumeration類型的對象,而不是返回集合類對象Enumeration接口不能用于ArrayList對

溫馨提示

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

評論

0/150

提交評論