Đ 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 doi tuong 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 doi tuong 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