Đ tài 5. L u tr và x lý đ i t ngề ư ữ ử ố ượ Trong ph n này chúng ta s đ c p t i các l p ti n ích c a Java trong gói java.util dùngầ ẽ ề ậ ớ ớ ệ ủ cho vi c l u tr và x lý các đ i t ng.ệ ư ữ ử ố ượ I. L p Vector và giao di n Enumerationớ ệ I.1 L p Vectorớ L p trình viên dùng l p Vector đ l u tr các đ i t ng có ki u gi ng nhau nh ng cóậ ớ ể ư ữ ố ượ ể ố ư th thay đ i đ ng v kích th c tùy theo nhu c u. Chúng ta s xem xét vi c s d ng interfaceể ổ ộ ề ướ ầ ẽ ệ ử ụ Enumeration đ cho phép duy t l p trên các c u trúc nh Vector.ể ệ ặ ấ ư Kích th c c a Vector đ c tăng theo m t l ng đ t tr c ho c đ c t đ ng tăngướ ủ ượ ộ ượ ặ ướ ặ ượ ự ộ g p đôi khi ta c n tăng dung l ng c a nó. Vì v y thao tác chèn m t ph n t m i vào m tấ ầ ượ ủ ậ ộ ầ ử ớ ộ Vector s nhanh h n khi kích th c c a nó còn đ dùng.ẽ ơ ướ ủ ủ Vector l u tr tham chi u c a các đ i t ng nên ch ng trình có th dùng Vector đư ữ ế ủ ố ượ ươ ể ể l u tham chi u đ n b t kỳ đ i t ng nào. Đ l u các giá tr d li u nguyên th y, ta ph i sư ế ế ấ ố ượ ể ư ị ữ ệ ủ ả ử d ng các l p trong java.lang nh Integer, Long hay Float thay vì dùng chính ki u đó.ụ ớ ư ể Sau đây là m t ví d nh p vào 10 s nguyên, l u vào m t Vector r i in ra đ ki m tra:ộ ụ ậ ố ư ộ ồ ể ể // Nhâp 10 doituong so nguyen 1. java.util.Vector v = new java.util.Vector(5,2); 2. for (int i=0;i<10;i++) 3. { 4. System.out.print("Nhap so nguyen thu " + String.valueOf(i) + ":"); 5. java.lang.Integer p = new java.lang.Integer(nhap.nextInt()); 6. v.addElement(p); 7. } 8. // In ra de kiem tra 9. for (int i=0;i<10;i++) 10. { 11. System.out.print("So nguyen thu " + String.valueOf(i) + " la:"); 12. System.out.println(v.get(i)); 13. } 14. System.out.println(v.size()); 15. System.out.println(v.capacity()); Dòng 1: Khai báo m t đ i t ng v thu c l p Vector. đây ta đã dùng m t constructorộ ố ượ ộ ớ Ở ộ v i 2 tham s là s ph n t ban đ u và s s tăng khi Vector có nhu c u tăng (m c đ nh sớ ố ố ầ ử ầ ố ẽ ầ ặ ị ẽ g p đôi s hi n có). L p Vector có 3 constructor:ấ ố ệ ớ • N u dùng constructor không tham s thì Java t đ ng c p cho ta s ph n t banế ố ự ộ ấ ố ầ ử đ u là 10 và nhân đôi m i khi có nhu c u m r ng.ầ ỗ ầ ở ộ • N u là 1 tham s thì đâu là s ph n t ban đ u, khi c n cũng t đ ng nhân đôi.ế ố ố ầ ử ầ ầ ự ộ • N u là 2 tham s thì tham s th nh t ch s ph n t ban đ u, tham s th 2 chế ố ố ứ ấ ỉ ố ầ ử ầ ố ứ ỉ s ph n t đ c thêm vào m i khi dung l ng c a Vector b h t. ố ầ ử ượ ỗ ươ ủ ị ế Dòng 2-7: Vòng l p đ nh p và l u k t qu nh p vào Vector. ặ ể ậ ư ế ả ậ đây ta ph i khai báoỞ ả m t bi n đ i t ng ki u Integer ch không ph i là m t ki u nguyên th y int. Sau đó dùngộ ế ố ượ ể ứ ả ộ ể ủ ph ng th c addElement() đ thêm đ i t ng này vào v trí cu i c a Vector.ươ ứ ể ố ượ ị ố ủ 69 Ngoài ra ta cũng có th s d ng insertElementAt() đ chèn phể ử ụ ể n t vào m t v trí xácầ ử ộ ị đ nh ho c s d ng setElementAt() đ đ t giá tr cho m t ph n t t i m t v trí.ị ặ ử ụ ể ặ ị ộ ầ ử ạ ộ ị S d ng removeElement(Object) đ xóa m t ph n t xu t hi n đ u tiên trong Vectorử ụ ể ộ ầ ử ấ ệ ầ có giá tr b ng v i Object.ị ằ ớ Dòng 12: Dùng ph ng th c get(ch s ) đ in ra giá tr c a ph n t có ch s t ngươ ứ ỉ ố ể ị ủ ầ ử ỉ ố ươ ng. Th c ra thì ph ng th c get(ch s ) cho ta m t tham chi u đ n đ i t ng có ch sứ ự ươ ứ ỉ ố ộ ế ế ố ượ ỉ ố t ng ng đ c l u trong Vector nh ng đây đ i t ng s nguyên đã t đ ng in ra giá tr .ươ ứ ượ ư ư ở ố ượ ố ự ộ ị Dòng 14: Ph ng th c tr v kích th c th c t c a Vector, t c là s ph n t th c sươ ứ ả ề ướ ự ế ủ ứ ố ầ ử ự ự Vector l u tr (=10) .ư ữ Dòng 15: Kích s l ng các ph n t t i đa hi n có c a Vector (=11).ố ượ ầ ử ố ệ ủ M t s ph ng th c c a Vector:ộ ố ươ ứ ủ removeElementAt: Xóa m t ph n t m t v trí xác đ nh.ộ ầ ử ở ộ ị ị removeAllElements(): Xóa t t c các ph n t .ấ ả ầ ử firstElement(): Tr v tham chi u t i ph n t đ u tiên.ả ề ế ớ ầ ử ầ lastElement(): Tr v tham chi u t i ph n t cu i cùng trong Vector.ả ề ế ớ ầ ử ố isEmpty(): Xác đ nh li u Vector là tr ng.ị ệ ố contains(key): đ ki m tra xem trong vector có ph n t so kh p v i key hay không. Đ iể ể ầ ử ớ ớ ố t ng key và các ph n t c a Vector đ ck so sánh v i nhau b i ph ng th c equals(). Cácượ ầ ử ủ ươ ớ ở ươ ứ l p th ng khai báo ch ng ph ng th c equals() đ dùng trong vi c so sánh các đ i t ngớ ườ ồ ươ ứ ể ệ ố ượ c a mình.ủ indexOf(Object): Tr v ch s c a đ i t ng đ u tiên so kh p v i Object.ả ề ỉ ố ủ ố ượ ầ ớ ớ trimToSize(): Gi m s l ng ph n t c a Vector.ả ố ượ ầ ử ủ I.2 Giao di n Enumerationệ S d ng ph ng th c elements() c a m t đ i t ng Vector s tr v m t đ i t ngử ụ ươ ứ ủ ộ ố ượ ẽ ả ề ộ ố ượ Enumeration cho phép ch ng trình duy t l p trên danh sách ph n t c a Vector.ươ ệ ặ ầ ử ủ Đ i t ng Enumeration có các ph ng th c quan tr ng sau:ố ượ ươ ứ ọ hasMoreElement(): Tr v true n u v n còn ph n t trong Vector.ả ề ế ẫ ầ ử nextElement(): Tr v tham chi u t i ph n t ti p theo trong Vector.ả ề ế ớ ầ ử ế Đo n ch ng trình sau duy t và in ra danh sách các sinh viên:ạ ươ ệ abstract class People { protected int NamSinh;//Nam Sinh protected String HoVaTen; //Ho Va Ten //constructor public People(int ns,String ht) { NamSinh=ns; HoVaTen=ht; } // Phuong thuc tinh tuoi protected abstract int TinhTuoi(); public abstract String toString(); } // Ke thua lop People public class SinhVien extends People 70 { private String Lop;// Ten lop private double DiemTongKet; // Diem tong ket public final String mauda ="vang";//Hang so private int ID;// Ma so SinhVien protected static int MaSo;// ma so chung de cap phat cho moi sinh vien // constructor public SinhVien(int ns,String ht,String l,double dtk) { super(ns,ht);//goi constructor cua lop cha la People Lop = l; DiemTongKet=dtk; // Id cua SinhVien duoc gan bang gia tri MaSo hien thoi cua lop ID=MaSo; // Tang ma so len 1 den gan cho SinhVien sau MaSo+=1; } // Phuong thuc tinh tuoi protected int TinhTuoi() { java.util.Date homnay = new java.util.Date(); return (homnay.getYear() - NamSinh +1); } // Khai bao chong phuong thuc toString() public String toString() { return "Ma so:" + String.valueOf(ID)+ "\n" +"Tuoi:"+ String.valueOf(this.TinhTuoi()) + "\n" +"Diem Tong Ket:"+ String.valueOf(DiemTongKet)+"\n" +"Ho va ten:"+ HoVaTen; } // Ham main public static void main(String[] argv) { // Dat gia tr? bien static, sinh vien dau tien co ma so 1 SinhVien.MaSo=1; // bien doituong Vector java.util.Vector sv = new java.util.Vector(5); SinhVien k1 = new SinhVien(80,"Nguyen Thi Mai 1","Letio3",5); sv.addElement(k1); // Them sinh vien vao Vector SinhVien k2 = new SinhVien(81,"Tran Thi Mai 2","Letio3",6); sv.addElement(k2); SinhVien k3 = new SinhVien(82,"Pham Thi Mai 3","Letio3",7); sv.addElement(k3); SinhVien k4= new SinhVien(83,"Phan Thi Mai 4","Letio3",8); sv.addElement(k4); SinhVien k5= new SinhVien(84,"Hoang Thi Mai 5","Letio3",9); 71 sv.addElement(k5); // Dung interface Enumeration de duyet cac phan tu cua Vector java.util.Enumeration enu = sv.elements(); while (enu.hasMoreElements()) { // Ep kieu, kieu Object la kieu cha cua moi kieu nen luon ep duoc SinhVien g = (SinhVien)enu.nextElement(); System.out.println(g.toString()); } //People p = new People(20,"Pham Anh Hoa"); bao loi vi People là l p tr uớ ừ t ngượ } } K t qu th c hi n nh sau:ế ả ự ệ ư II. M ng trong Java và l p ArrayListả ớ II.1 M ng trong Javaả Trong ph n “Ngôn ng Java căn b n” ta đã xem xét m t bi n m ng đ c khai báo vàầ ữ ả ộ ế ả ượ s d ng nh th nào. Trong ph n này ta s đi sâu khai thác các đ c tính c a m ng và m t sử ụ ư ế ầ ẽ ặ ủ ả ộ ố thu t toán thông d ng thông qua các ví d .ậ ụ ụ Ví d : Đ m t n su t c a các ph n t c a m t m ng:ụ ế ầ ấ ủ ầ ử ủ ộ ả import javax.swing.*; public class StudentPoll { // Hàm main 72 public static void main( String args[] ) { // Khai báo m t m ng các câu tr l iộ ả ả ờ int TraLoi[] = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10 }; // M ng đ m t n su tả ế ầ ấ int TanSuat[] = new int[ 11 ]; // V i m i ph n t c a mang TraLoi, s d ng giá tr đó nh là ch s c a m ngớ ỗ ầ ử ủ ử ụ ị ư ỉ ố ủ ả TanSuat sau đó đ m s xu t hi n c a nó trong TraLoi, l u giá tr vào m ng TanSuat t i v tríế ự ấ ệ ủ ư ị ả ạ ị t ng ng.ươ ứ for ( int answer = 0; answer < TraLoi.length; answer++ ) ++frequency[ TraLoi[ answer ] ]; // Đ a k t qu vào m t chu iư ế ả ộ ỗ for ( int rating = 1; rating < TanSuat.length; rating++ ) output += rating + "\t" + TanSuat[ rating ] + "\n"; // In ra System.out.print(out); } } Trong ví d này, các câu tr l i n m trong kho ng t 1 đ n 10 nên khai báo m t m ngụ ả ờ ằ ả ừ ế ộ ả 11 ph n t đ có th s d ng chính giá tr 10 làm ch s c a m ng. Ch c n duy t m ngầ ử ể ể ử ụ ị ỉ ố ủ ả ỉ ầ ệ ả TraLoi 1 l n ta đã có ngay k t qu .ầ ế ả II.2. Các thu t toán c b n trên m ngậ ơ ả ả Ví d : S p x p tuy n tínhụ ắ ế ế Đây là m t ví d s p x p các ph n t c a m ng tăng d n theo thu t toán “n i b t” -ộ ụ ắ ế ầ ử ủ ả ầ ậ ổ ọ t c là sau m i vòng l p duy t, ph n t nào l n nh t s b đ y xu ng cu i cùng. ứ ỗ ặ ệ ầ ử ớ ấ ẽ ị ẩ ố ố // S p x p các ph n t c a m ngắ ế ầ ử ủ ả public void bubbleSort( int array2[] ) { // Duy t qua m i ph n t c a m ngệ ỗ ầ ử ủ ả for ( int pass = 1; pass < array2.length; pass++ ) { // Vòng l p so sánh và đ i chặ ổ ỗ for ( int element = 0; element < array2.length - pass; element++ ) { // So sánh 2 ph n t li n k và đ i ch n u c nầ ử ề ề ổ ỗ ế ầ if ( array2[ element ] > array2[ element + 1 ] ) swap( array2, element, element + 1 ); } } } // Hàm đ i ch 2 ph n t c a m t m ngổ ỗ ầ ử ủ ộ ả public void swap( int array3[], int first, int second ) { int hold; // Bi n trung gian đ hoán đ iế ể ổ hold = array3[ first ]; array3[ first ] = array3[ second ]; array3[ second ] = hold; 73 } Ví d : Tìm ki m nh phân trên m ng đã đ c s p x p:ụ ế ị ả ượ ắ ế Thông th ng vi c tìm ki m di n ra b ng phép duy t l n l t các ph n t c a m ng.ườ ệ ế ễ ằ ệ ầ ượ ầ ử ủ ả Ta g i ph ng pháp này là tìm ki m tuy n tính.ọ ươ ế ế Đ i v i các m ng đã đ c s p x p, ta có m t ph ng pháp tìm ki m hi u qu h n,ố ớ ả ượ ắ ế ộ ươ ế ệ ả ơ g i là tìm ki m nh phân.ọ ế ị Gi s ta có m t m ng: intả ử ộ ả [] b={1,5,7,8,34,56,67,89,100}; Đã đ c s p x p tăng d n.ượ ắ ế ầ Gi s ta c n tìm v trí c a m t ph n t có giá tr 7. Tr c tiên, ta so sánh 7 v i v tríả ử ầ ị ủ ộ ầ ử ị ướ ớ ị đ ng gi a c a m ng là 34 thì 7 < 34 nên ta ch c ch n n u có thì 7 s n m n a tr c c aứ ữ ủ ả ắ ắ ế ẽ ằ ở ử ướ ủ m ng. Ti p t c làm vi c này v i n a tr c c a m ng, so sánh 7 v i 5 thì 7>5 nên ph n tả ế ụ ệ ớ ử ướ ủ ả ớ ầ ử c n tìm n u có s n m ph n sau c a n a này g m 2 ph n t 7,8. L n phân đôi cu i cùngầ ế ẽ ằ ở ầ ủ ử ồ ầ ử ầ ố này cho ta k t qu .ế ả Th t c này đ c cài đ t nh sau:ủ ụ ượ ặ ư public int binarySearch( int array2[], int key ) { int low = 0; // Ch s d iỉ ố ướ int high = array.length - 1; // Ch s trênỉ ố int middle; // ch s c a ph n t trung gianỉ ố ủ ầ ử // L p cho đ n khi ch s d i l n h n ho c b ng ch s trênặ ế ỉ ố ướ ớ ơ ặ ằ ỉ ố while ( low <= high ) { // Xác đ nh ch s ph n t gi aị ỉ ố ầ ử ữ middle = ( low + high ) / 2; // N u khóa c n tìm trùng v i ph n t gi a thì tr v k t qu ngayế ầ ớ ầ ử ữ ả ề ế ả if ( key == array[ middle ] ) return middle; // N u khóa nh h n ph n t gi a, đ t l i ch s trênế ở ơ ầ ử ữ ặ ạ ỉ ố else if ( key < array[ middle ] ) high = middle - 1; // Khóa l n h n ph n t gi a, đ t l i ch s d iớ ơ ầ ử ữ ặ ạ ỉ ố ướ else low = middle + 1; } return -1; // Không tìm th yấ } II.3 Class Arrays Java h tr m t l p m ng trong th vi n java.util.Arrays đ l p trình viên thao tác trênỗ ợ ộ ớ ả ư ệ ể ậ m ng. Ch y u các ph ng th c c a l p này là static. Thay vì ph i l p trình, Arrays h trả ủ ế ươ ứ ủ ớ ả ậ ỗ ợ các ph ng th c:ươ ứ 74 • fill: đ n p giá tr cho m ng.ể ạ ị ả • sort: đ s p x p m ngể ắ ế ả • binarySearch: Tìm ki m nh phân trên m ng đã đ c s p.ế ị ả ượ ắ • equals: So sánh m ngả Sau đây là ví d v s d ng l p Arrays:ụ ề ử ụ ớ import java.util.*; public class UsingArrays { private int intValues[] = { 1, 2, 3, 4, 5, 6 }; private double doubleValues[] = { 8.4, 9.3, 0.2, 7.9, 3.4 }; private int filledInt[], intValuesCopy[]; // Kh i t o các m ngở ạ ả public UsingArrays() { filledInt = new int[ 10 ]; intValuesCopy = new int[ intValues.length ]; Arrays.fill( filledInt, 7 ); // N p giá tr cho m ng filledInt v i giá tr 7ạ ị ả ớ ị Arrays.sort( doubleValues ); // S p x p m ng doubleValuesắ ế ả System.arraycopy( intValues, 0, intValuesCopy, 0, intValues.length ); // Sao chép m ngả } // In giá tr c a các m ngị ủ ả public void printArrays() { System.out.print( "doubleValues: " ); for ( int count = 0; count < doubleValues.length; count++ ) System.out.print( doubleValues[ count ] + " " ); System.out.print( "\nintValues: " ); for ( int count = 0; count < intValues.length; count++ ) System.out.print( intValues[ count ] + " " ); System.out.print( "\nfilledInt: " ); for ( int count = 0; count < filledInt.length; count++ ) System.out.print( filledInt[ count ] + " " ); System.out.print( "\nintValuesCopy: " ); for ( int count = 0; count < intValuesCopy.length; count++ ) System.out.print( intValuesCopy[ count ] + " " ); System.out.println(); } 75 // Tìm m t giá tr trong m ng intValuesộ ị ả public int searchForInt( int value ) { return Arrays.binarySearch( intValues, value ); } // So sánh n i dung m ngộ ả public void printEquality() { boolean b = Arrays.equals( intValues, intValuesCopy ); System.out.println( "intValues " + ( b ? "==" : "!=" ) + " intValuesCopy" ); b = Arrays.equals( intValues, filledInt ); System.out.println( "intValues " + ( b ? "==" : "!=" ) + " filledInt" ); } // Hàm main public static void main( String args[] ) { UsingArrays usingArrays = new UsingArrays(); usingArrays.printArrays(); usingArrays.printEquality(); int location = usingArrays.searchForInt( 5 ); System.out.println( ( location >= 0 ? "Tìm th y 5 t i v trí " + location : "Không th y" )ấ ạ ị ấ + " trong m ng intValues" );ả location = usingArrays.searchForInt( 8763 ); System.out.println( ( location >= 0 ? "Tìm th y 8763 t i " + location : "Không th yấ ạ ấ 8763" ) + " trong m ng intValues" );ả } } III Danh sách trong java và giao di n Lists ệ Lists là m t chu i có th t các ph n t cho phép các ph n t có th gi ng nhau. Listsộ ỗ ứ ự ầ ử ầ ử ể ố là m t giao di n k th a giao di n Collections nên nó cho phép l p trình viên truy c p cácộ ệ ế ừ ệ ậ ậ ph n t qua ch s . Các l p t p h p cài đ t Lists là ArrayList, LinkedList và Vector.ầ ử ỉ ố ớ ậ ợ ặ ArrayList là m t l p t p h p có th thay đ i kích th c. V c b n thì ArrayList gi ngộ ớ ậ ợ ể ổ ướ ề ơ ả ố v i Vector chúng ta đã xem xét trên.ớ ở Sau đây là ch ng trình ví d s d ng ArrayList. đây ta đ t các đ i t ng String vàươ ụ ử ụ Ở ặ ố ượ Color vào cùng m t ArrayList sau đó xóa đi các ph n t String s d ng m t đ i t ng Iterator.ộ ầ ử ử ụ ộ ố ượ import java.awt.Color; import java.util.*; public class CollectionTest { private String colors[] = { "red", "white", "blue" }; // T o m t ArrayList, thêm các ph n t cho nóạ ộ ầ ử public CollectionTest() { ArrayList list = new ArrayList(); 76 // Thêm đ i t ng cho nóố ượ list.add( Color.magenta ); // Thêm m t đ i t ng Colorộ ố ượ // Thêm các đ i t ng String ố ượ for ( int count = 0; count < colors.length; count++ ) list.add( colors[ count ] ); list.add( Color.cyan ); // Thêm m t đ i t ng Colorộ ố ượ // In ra n i dungộ System.out.println( "\nArrayList: " ); for ( int count = 0; count < list.size(); count++ ) System.out.print( list.get( count ) + " " ); // Xóa t t c các đ i t ng Stringấ ả ố ượ removeStrings( list ); // output list contents System.out.println( "\n\nArrayList sau khi g i removeStrings: " );ọ for ( int count = 0; count < list.size(); count++ ) System.out.print( list.get( count ) + " " ); } public void removeStrings( Collection collection ) { // Khai báo đ i t ng iteratorố ượ iterator iterator = collection.iterator(); // L p trong khi t p h p v n còn ph n tặ ậ ợ ẫ ầ ử while ( iterator.hasNext() ) if ( iterator.next() instanceof String ) iterator.remove(); // Xóa ph n tầ ử } // Hàm main public static void main( String args[] ) { new CollectionTest(); } } Bài t pậ 1. Vi t ch ng trình qu n lý danh sách m t l p h c v i các ch c năngế ươ ả ộ ớ ọ ớ ứ - Tìm ki m sinh viênế - Thêm sinh viên. - Xóa sinh viên - S p x p danh sách theo tênắ ế 2. Vi t ch ng trình nh p vào n s nguyên và s th c, n nh p t bàn phím. Sau đó:ế ươ ậ ố ố ự ậ ừ - Tính t ng c a n s này.ổ ủ ố - S p x p n s theo th t tăng d nắ ế ố ứ ự ầ - Nh p vào t bàn phím 1 s khác và tìm xem s đó có trong s n s v a nh p không.ậ ừ ố ố ố ố ừ ậ 77 . tr và x lý đ i t ngề ư ữ ử ố ượ Trong ph n này chúng ta s đ c p t i các l p ti n ích c a Java trong gói java.util dùngầ ẽ ề ậ ớ ớ ệ ủ cho vi c l u tr và. ố ứ ỉ s ph n t đ c thêm vào m i khi dung l ng c a Vector b h t. ố ầ ử ượ ỗ ươ ủ ị ế Dòng 2-7: Vòng l p đ nh p và l u k t qu nh p vào Vector. ặ ể ậ ư ế ả