46
Ngày 20 tháng 10 năm 2010

Mangngon Ngu Lap Trinh Java

Embed Size (px)

DESCRIPTION

cung nhau chia se hoc java nha cac anh em

Citation preview

Page 1: Mangngon Ngu Lap Trinh Java

Ngày 20 tháng 10 năm 2010

Page 2: Mangngon Ngu Lap Trinh Java

I.GIỚI THIỆU MẢNG: 1.Sự cần thiết của mảng:

2.Định nghĩa mảng:

3.Phân loại mảng:II.TẠO VÀ SỬ DỤNG MẢNG:

1.Khởi tạo mảng:

2.Gán giá trị cho các thành phần của mảng:

3.Truy xuất thành phần của mảng:

4.Lấy kích thước mảng:

5.Hiển thị mảng:

6.Ví dụ minh hoạ:

NỘI DUNG BÀI HỌC

Phần 1: Mảng

Page 3: Mangngon Ngu Lap Trinh Java

NỘI DUNG BÀI HỌC(tiếp)

III.CÁC THAO TÁC TRÊN MẢNG:

1.Sao chép mảng:

2.Sao chép các phần tử của mảng:

3.Thêm, xoá phần tử của mảng:

4.Mở rộng mảng:

5.Các mảng của các đối tượng:

PHẦN 2.DANH SÁCH DẠNG MẢNG:

I.Sự cần thiết của ArrayList:

II.Lớp ArrayList:

III.Sử dụng danh sách mảng:

IV.Lớp Wrapper:

V. Đóng hộp tự động:

Page 4: Mangngon Ngu Lap Trinh Java

07CTT2

(Array)

Page 5: Mangngon Ngu Lap Trinh Java

07CTT2

I.GIỚI THIỆU MẢNG:

1.Sự cần thiết của mảng: Ví dụ: Bài toán tính tổng n số nguyên bất kỳ nhập vào từ bàn phím ?

Để giải quyết bài toán trên ta phải sử dụng 4 biến để lưu trữ các số nhập vào(giả sử x,y,z,t) tổng cần tính S = x + y + z + t; Với n = 100 hoặc lớn hơn nữa?

Cách trên vẫn giải quyết được. Nhưng có những hạn chế sau: - Tốn sức, tốn bộ nhớ cho việc định nghĩa và khởi tạo cho mỗi biến, các giá trị không được lưu liền kề nhau trong bộ nhớ.

- Giả sử với n = 4 (tức là ta tính tổng 4 số nguyên bất kỳ nhập từ bàn phím).

Page 6: Mangngon Ngu Lap Trinh Java

07CTT2

Chính vì thế mảng ra đời nhằm khăc khắc phục những hạn chế trên.

Mảng là phương tiện tốt nhất để giải quyết các bài toán với tập hợp các phần tử dữ liệu có cùng kiểu tại cùng thời điểm.

2. Khái niệm mảng: - Mảng là tập hợp nhiều phần tử có cùng tên, cùng kiểu dữ liệu và mỗi phần tử trong mảng được truy xuất thông qua chỉ số của nó trong mảng. • Chỉ số của mảng: Mỗi thành phần của mảng có thể thông qua một giá trị nguyên được gọi là chỉ số của mảng.

- Trong Java chỉ số của mảng bắt đầu từ 0.• Kích thước mảng: Số lượng các phần tử của mảng.(kích thước mảng cố định)

I.GIỚI THIỆU MẢNG(2)

Page 7: Mangngon Ngu Lap Trinh Java

07CTT2

3. Phân loại mảng:

- Mảng một chiều (học trong tiết này)

- Mảng đa chiều ( Mảng 2 chiều thường được dùng)

[0]

[1]

[2]

[3]

[0]

[0][1]

[1]

[2]

[2]

[3]

I.GIỚI THIỆU MẢNG(3)

Mảng trong Java có 2 kiểu:

Page 8: Mangngon Ngu Lap Trinh Java

07CTT2

II.TẠO VÀ SỬ DỤNG MẢNG

1.Khởi tạo mảng: Cách 1:

cú pháp: ArrayType [] ArrayName;

hoặc ArrayType ArrayName [];

Trong đó • ArrayType: Kiểu dữ liệu của các thành phần chứa trong mảng. Kiểu dữ liệu của các phần tử mảng có thể là bất kỳ kiểu dữ liệu hợp lệ nào của Java (Kiểu nguyên thuỷ, kiểu tham chiếu)• ArrayName : tên của mảng.• [] chỉ định biến là biến mảng.

- Khai báo 1 biến mảng tham chiếu đến mảng

Page 9: Mangngon Ngu Lap Trinh Java

07CTT2

-Tạo mảng:

Với khai báo trước thì mảng chưa thực sự tồn tại. Để máy tính cấp phát bộ nhớ cho các phần tử của mảng và gán mảng đến biến đã khai báo, ta dùng toán tử new ( Mảng trong Java là 1 đối tượng)

Ví dụ: khai báo mảng số nguyên:

int [] soNguyen; // Khai báo biến mảng.

soNguyen = new int [10]; // tạo mảng.

II.TẠO VÀ SỬ DỤNG MẢNG( 2)

Cú pháp: ArrayName = new ArrayType [ArraySize];

Trong đó ArraySize: Kích thước của mảng (Số phần tử của mảng)

Page 10: Mangngon Ngu Lap Trinh Java

07CTT2

II.TẠO VÀ SỬ DỤNG MẢNG(3)

Cách 2: Bạn có thể kết hợp sự khai báo biến mảng và tạo mảng như sau:

Ví dụ: int soNguyen [] = new int[10]; //Khai báo mảng

2.Gán giá trị cho các thành phần của mảng: Sau khi khởi tạo mảng xong.Thì các thành phần của mảng được gán một giá trị mặc định.Tức là mỗi phần tử của mảng sẽ nhận giá trị:

Cú pháp: ArrayType [] ArrayName = new ArrayType [ArraySize]; hoặc ArrayTye ArrayName [] = new ArrayType [ArraySize];

0 : Kiểu dữ liệu(KDL) là kiểu số ‘\0’: KDL là ký tự. false: KDL là kiểu boolean null: KDL là kiểu tham chiếu tới đối tuợng

Page 11: Mangngon Ngu Lap Trinh Java

07CTT2

Ta cần gán giá trị cụ thể cho các thành phần của mảng:

int [] soNguyen = new int[4]; // khai báo mảng

soNguyen[0] = 50;

soNguyen[1] = 24;

soNguyen[2] = 1;

soNguyen[3] = 10;

Ví dụ: gán giá trị cho mảng số nguyên

II.TẠO VÀ SỬ DỤNG MẢNG(4)

Lưu ý: Trong Java còn cho phép ta kết hợp cả khai báo và khởi gán các phần tử của mảng theo cách sau: ví dụ: int soNguyen [] = {50,24,1,10}; /* tạo ra một mảng gồm 5 phần tử của mảng, các phần tử lần lượt được gán giá trị là 50,24,1,10. */

Page 12: Mangngon Ngu Lap Trinh Java

07CTT2

Gán giá trị cho các thành phần của mảng được nhập từ bàn phím:

int soNguyen [] = new int[4]; for (int i=0; i<4;i++){ System.out.print("Nhap SoNguyen["+i+"]"+"="); soNguyen[i] = s.nextInt();}

3.Truy xuất thành phần của mảng:

Cú pháp ArrayName[Index];

Lưu ý: Phần tử thứ n của mảng có chỉ số là (n-1)

II.TẠO VÀ SỬ DỤNG MẢNG(5)

Page 13: Mangngon Ngu Lap Trinh Java

07CTT2

double data [] = new double [10];

data [2] = 29.95

4.Lấy kích thước mảng:

Cú pháp: ArrayName.length;

Ví dụ: soThuc.length ; // =10

II.TẠO VÀ SỬ DỤNG MẢNG(6)

ví dụ : Truy cập phần tử thứ 3 của mảng dưới.

Page 14: Mangngon Ngu Lap Trinh Java

07CTT2

5.Hiển thị mảng:

II.TẠO VÀ SỬ DỤNG MẢNG(7)

Ví dụ: hiển thị mảng soNguyen gồm các phần tử nhập từ bàn phím

for( int i=0; i<soNguyen.length;i++) {

System.out.print(“ cac phan tu cua mang la:” +

” “+soNguyen[i]);} Vòng lặp for-each ( lặp “với mỗi”):

Ví dụ: hiển thị mảng trên dùng for – each

for ( int i : soNguyen) { //Giá trị mảng tại chỉ số hiện hành được hiển thị

System.out.print(“cac phan tu cua mang la:”+ i + ” “); }

cú pháp: for ( Type variable : arr) { statement; }

Page 15: Mangngon Ngu Lap Trinh Java

07CTT2

II.TẠO VÀ SỬ DỤNG MẢNG(8)6.Ví dụ minh hoạ:

Ví dụ 1: Đếm xem trong mảng số nguyên có bao nhiêu phần tử là số chẵn?

Page 16: Mangngon Ngu Lap Trinh Java

07CTT2

II.TẠO VÀ SỬ DỤNG MẢNG(9)

Kết quả chạy chương trình :

•Bài tập: - Tìm phần tử trong mảng có giá trị bằng x.

-Tìm giá trị lớn nhất (nhỏ nhất trong mảng).

Page 17: Mangngon Ngu Lap Trinh Java

07CTT2

III.CÁC THAO TÁC TRÊN MẢNG:

1.Sao chép mảng:

• Java hỗ trợ 3 cách sao chép dữ liệu mảng

– Toán tử gán

– clone()

– System.arraycopy()

clone () : Sao chép mảng

double [] data = new double[10];

Mảng cần sao

chép

Page 18: Mangngon Ngu Lap Trinh Java

07CTT2

III.CÁC THAO TÁC TRÊN MẢNG(1):

double [] prices = data;

double [] prices = (double[]) data.clone();

Page 19: Mangngon Ngu Lap Trinh Java

07CTT2

III.CÁC THAO TÁC TRÊN MẢNG(2):

System.Arraycopy () : Dùng copy dữ liệu từ mảng này sang mảng khác.

System. arraycopy(from, fromStart, to, toStart, count);

Page 20: Mangngon Ngu Lap Trinh Java

07CTT2

III.CÁC THAO TÁC TRÊN MẢNG(3):

2.Thêm – Xoá phần tử: Thêm phần thử vào mảng:

System. arraycopy(data, i, data, i+1, data.length -i-1); data [i] = x;

x là phần tử

thêm vào

Page 21: Mangngon Ngu Lap Trinh Java

07CTT2

III.CÁC THAO TÁC TRÊN MẢNG(4):

Xoá phần tử khỏi mảng:

System. arraycopy(data, i+1, data, i, data.length-i-1);

Page 22: Mangngon Ngu Lap Trinh Java

07CTT2

III.CÁC THAO TÁC TRÊN MẢNG(5):

3.Mở rộng mảng:

• Tạo mảng mới có kích thước lớn hơn.

double [] newData = new double [2 * data.length];

•Sao các phần tử cũ sang mảng mới.System. arraycopy(data,0,newdata,0,data.length);

• Lưu tham chiếu tới mảng:

data = newdata;

Page 23: Mangngon Ngu Lap Trinh Java

07CTT2

III.CÁC THAO TÁC TRÊN MẢNG(6):

4. Đưa các mảng song song về mảng của các đối tượng:

• Mảng song song:

ví dụ: int [] accountNumbers;

double [] balances;

Page 24: Mangngon Ngu Lap Trinh Java

07CTT2

• Mảng các đối tượng:

III.CÁC THAO TÁC TRÊN MẢNG(7):

Bankaccount []= accounts;

Lưu ý: Tránh dùng mảng song song. Mà nên đưa về mảng các đối tượng.

Page 25: Mangngon Ngu Lap Trinh Java

07CTT2

III.CÁC THAO TÁC TRÊN MẢNG(8):

5. Mảng chưa điền kín dữ liệu:

• Khi dùng mảng kích thước khai báo thường lớn hơn kích thước thật.

Cần phải có biến để lưu vết kích thước hiện tại.

final int DATA_LENGTH = 100;double [] data = new double [DATA_LENGTH];int datasize = 0;data [] dataSize = x;dataSize + +;

Page 26: Mangngon Ngu Lap Trinh Java

07CTT2

(ArrayList)

Page 27: Mangngon Ngu Lap Trinh Java

07CTT2

????

Khi nào sử dụng ArrayList

Page 28: Mangngon Ngu Lap Trinh Java

07CTT2

I.SỰ CẦN THIẾT CỦA ARRAYLIST:

Một bất lợi của việc dùng mảng là phải xác định trước số lượng phần tử trong mảng:

- Nếu khai báo kích thước mảng quá nhỏ thì sẽ dẫn đến thiếu bộ nhớ. - Nếu khai báo quá lớn thì lại lãng phí bộ nhớ.

ArrayList đã khắc phục được nhược điểm này (ArrayList là một kiểu mảng động).

Các phần tử trong mảng phải có cùng kiểu dữ liệu.

Page 29: Mangngon Ngu Lap Trinh Java

07CTT2

Ví dụ1 : Chương trình quản lý nhân viên tại một phòng ban nào đó trong một công ty.

- Số lượng nhân viên trong phòng ban có thể thay đổi. kích thước không cố định.(không sử dụng mảng trong ví dụ này).Thay vào đó ta sẽ sử dụng ArrayList.

I.SỰ CẦN THIẾT CỦA ARRAYLIST(tiếp):

Ví dụ 2:Đoạn mã chương trình sau

ArrayList <Object> o = new Arraylist(Object); o. add(“hello”); o.add(7);

Các phần tử của ArrayList có kiểu chung là Object, nghĩa là có thể có các kiểu khác.

Page 30: Mangngon Ngu Lap Trinh Java

07CTT2

• Đặc điểm của lớp ArrayList:

- Quản lý một dãy các đối tượng.

- Có thể tăng, giảm kích thước theo nhu cầu.

- Cung cấp các phương thức cho các thao tác thông thường: chèn, xoá phần tử,...

- Từ java 5.0 trở đi ArrayList là class generic

ArrayList <T> ; // Tập các đối tượng có kiểu T

II. LỚP ARRAYLIST:

- Các phần tử trong ArrayList có thể có kiểu khác nhau.

Page 31: Mangngon Ngu Lap Trinh Java

07CTT2

Lớp ArrayList

Giao diện List

Giao diện collection

Lớp AbtractList

Gói Java.util

Chứa trong

Triển khai

Thi hànhTriển khai

II. LỚP ARRAYLIST(tiếp):

Page 32: Mangngon Ngu Lap Trinh Java

07CTT2

1.Khai báo ArrayList:

ArrayList<TypeObject> referenceVariableName

= new ArrayList<TypeObject> (<int initialCapacity>);

Ví dụ: ArrayList<SinhVien> dssv = new ArrayList <SinhVien>();

// khai báo 1 danh sách mảng các objects sinhvien;

Cú pháp:

ArrayList<TypeObject> : Định kiểu cho danh sách ngay khi khai báo biến danh sách.

Trong đó:

initialCapacity : sức chứa của ArrayList (nếu dự đoán được có bao nhiêu thành phần được lưu trữ trong ArrayList).

III.SỬ DỤNG DANH SÁCH MẢNG(1):

Page 33: Mangngon Ngu Lap Trinh Java

07CTT2

2.Các phương thức: Phương thức size();để lấy kích thước hiện thời của ArrayList

referenceVariableName. size();Cú pháp:

Phương thức get(); để lấy một phần tử trong ArrayList

Cú pháp:

referenceVariableName.get(int index);

Ví dụ: dssv.size();

Ví dụ: SinhVien s = dssv.get(1);

III.SỬ DỤNG DANH SÁCH MẢNG(2):

Page 34: Mangngon Ngu Lap Trinh Java

07CTT2

Phương thức set(); ghi đè lên giá trị đã có;

referenceVariableName.set(int index, element);

/*đặt giá trị vào trong ArrayList ở index chỉ định, ghi đè nội dung(element) nếu có */

Ví dụ: dssv.set(1,mai);

Phương thức add();

referenceVariableName.add( element);

//thêm phần tử vào ArrayList;

Ví dụ: dssv.add (“Nguyễn Thị Hương Mai”,1979,”Quang Ninh”);

III.SỬ DỤNG DANH SÁCH MẢNG(3):

Page 35: Mangngon Ngu Lap Trinh Java

07CTT2

Phương thức add(); chèn giá trị mới vào danh sách;

Phương thức remove(); xoá phần tử tại chỉ số nào đó;

referenceVariableName.add(int index , e); //chèn thêm một phần tử e vào vị trí index

referenceVariableName.remove(index);

lưu ý:index nằm giữa 0 và size()

III.SỬ DỤNG DANH SÁCH MẢNG(4):

Page 36: Mangngon Ngu Lap Trinh Java

07CTT2

4. Hiển thị danh sách mảng:

Vòng lặp for-each ( lặp “với mỗi”):

for (sinhvien e : dssv) { System.out.println("name=" + e.getName( ) + ",Diem=" + e.getDiem( ); }

III.SỬ DỤNG DANH SÁCH MẢNG(5):

3. Nhập dữ liệu cho danh sách mảng:

ArrayList<String> dssv = new ArrayList<String>(); dssv. add(“hello”); dssv.add(“how are you”); dssv.add(0,”thanks”);

Page 37: Mangngon Ngu Lap Trinh Java

07CTT2

III.SỬ DỤNG DANH SÁCH MẢNG(6):

6.Ví dụ:Chương trình quản lý điểm môn tin học của sinh viên

Page 38: Mangngon Ngu Lap Trinh Java

07CTT2

III.SỬ DỤNG DANH SÁCH MẢNG(7):

Page 39: Mangngon Ngu Lap Trinh Java

07CTT2

III.SỬ DỤNG DANH SÁCH MẢNG(8):

Page 40: Mangngon Ngu Lap Trinh Java

07CTT2

III.SỬ DỤNG DANH SÁCH MẢNG(9):

Kết quả chạy chương trình:

Page 41: Mangngon Ngu Lap Trinh Java

07CTT2

IV.LỚP WRAPPER(1):

• Một bất lợi của ArrayList là không thể không thể chèn kiểu dữ liệu nguyên thuỷ (các giá trị nguyên thuỷ không phải là đối tượng trong java).

Giải quyết

bọc kiểu nguyên thuỷ thành đối tượng (sử dụng lớp bao của chúng).

Ví dụ: không có ArrayList<int>...

• Tất cả các lớp Wrapper đều nằm trong gói java.lang(một gói chương trình tự động import)

• java.lang cung cấp các lớp bao cho từng kiểu dữ liệu nguyên thuỷ

Page 42: Mangngon Ngu Lap Trinh Java

07CTT2

• Giá trị của kiểu Wrapper không thay đổi được

ví dụ: Interger i = new Integer (10);

IV.LỚP WRAPPER(2):

Page 43: Mangngon Ngu Lap Trinh Java

07CTT2

• Ví dụ sử dụng lớp Wrapper

ArrayList <Integer> data = new ArrayList <Integer> (); data.add (29); int x = data.get (0);

IV.LỚP WRAPPER(3):

Page 44: Mangngon Ngu Lap Trinh Java

07CTT2

V. ĐÓNG HỘP TỰ ĐỘNG (auto-boxing)

• Trước java 5 khi làm việc với ArrayList ta thường phải chuyển đổi giữa kiểu giữ liệu nguyên thuỷ và lớp bao của chúng.

Để khắc phục điều này từ java 5 trở đi đã hỗ trợ thao tác đóng hộp và mở hộp tự động.

• Auto-boxing của java 5 trở đi giúp ta làm việc với các kiểu đối tượng dễ dàng như làm việc với kiểu dữ liệu nguyên thuỷ tương ứng

Quá trình auto-boxing là quá trình tự động chuyển đổi kiểu dữ liệu nguyên thuỷ sang lớp bao của chúng.

Page 45: Mangngon Ngu Lap Trinh Java

07CTT2

V. ĐÓNG HỘP TỰ ĐỘNG (2)

Quá trình mở hộp (unboxing) là quá trình ngược của auto-boxing.

ví dụ: double x = d ; /* tự động unboxing; giống như

double x = d.doubleValue ();*/

( trong đó typeValue( ) trả lại các giá trị nguyên thuỷ tương ứngvới các đối tượng nguyên thuỷ)

ví dụ: ArrayList <Integer> data = new ArrayList <Integer> (); data.add (29); // auto - boxing

Page 46: Mangngon Ngu Lap Trinh Java

The creator of Java