oop 5

23
Bài 5: Mảng - danh sách mảng Giảng viên: Nguyễn Thị Minh Huyền [email protected] Đỗ Thanh Hà [email protected]

Upload: thai-hoc-vu

Post on 29-Jun-2015

1.055 views

Category:

Technology


2 download

DESCRIPTION

slide java o lop

TRANSCRIPT

Page 1: Oop 5

Bài 5: Mảng - danh sách mảng

Giảng viên: Nguyễn Thị Minh Huyề[email protected]

Đỗ Thanh Hà[email protected]

Page 2: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 2

Tài liệu tham khảo BigJava – chương 8

Page 3: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 3

Mảng (1) Mảng: Dãy các giá trị cùng kiểu Tạo mảng: new typeName[length]

Lưu trữ trong biến kiểu mảng typeName[]: double[] data = new double[10]; double data[] = new double[10]; int size = 12; int data[] = new int[size];

Sau khi tạo giá trị ban đầu phụ thuộc vào kiểu các phần tử mảng

kiểu số: 0 ; kiểu lôgic: false ; tham chiếu tới đối tượng: null Tạo mảng và khởi tạo giá trị ban đầu:

int data[] = {12, 24, -23, 47};

Page 4: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 4

Mảng (2)

Page 5: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 5

Mảng (3) Truy cập đến các phần tử của mảng:

Cú pháp: arrayReference[index] Ví dụ: data[4]

System.out.println("The value of this data item is " + data[4])

Lấy kích thước mảng: data.length /* = 10 */ Chỉ số mảng (index) thuộc khoảng [0, length -1] Truy cập phần tử không tồn tại gây lỗi:

double[] data = new double[10]; data[10] = 29.95; // ERROR

Hạn chế của mảng: Kích thước cố định

Page 6: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 6

Danh sách dạng mảng Lớp ArrayList (java.util)

Quản lý 1 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, xóa phần tử,… Là lớp tổng quát (generic): ArrayList<T> - tập các

đối tượng có kiểu T Ví dụArrayList<BankAccount> accounts = new ArrayList<BankAccount>();accounts.add(new BankAccount(1001));accounts.add(new BankAccount(1015));accounts.add(new BankAccount(1022));

Page 7: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 7

Các thao tác (1) Lấy kích thước hiện thời của mảng:

phương thức size Lấy các phần tử

phương thức get Ví dụ

BankAccount anAccount = accounts.get(2); // Lấy phần tử thứ 03 trong danh sách mảng

int i = accounts.size();anAccount = accounts.get(i); //Error (?)

Page 8: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 8

Các thao tác (2) Thêm

set: Ghi đè lên giá trị đã có. VD: BankAccount anAccount = new BankAccount(1729);accounts.set(2, anAccount);

add: Chèn giá trị mới vào danh sách. VD chèn vào vị trí có chỉ số nào đó:

accounts.add(i, a) Xóa

remove: Xoá đi phần tử. VD xoá phần tử tại 1 chỉ số nào đó:

accounts.remove(i)

Page 9: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 9

Các thao tác (3)

VD: ArrayListTester.java, BankAccount.java

add(i, a) remove(i)

Page 10: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 10

Các lớp bao (wrapper) Không thể chèn kiểu nguyên thủy trong ArrayList Để xử lí các giá trị kiểu nguyên thủy như các đối tượng,

cần sử dụng lớp bao của chúngArrayList<Double> data = new ArrayList<Double>();data.add(29.95);double x = data.get(0);

Page 11: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 11

Đóng hộp tự động (auto-boxing)

Từ Java 5.0: chuyển đổi tự động giữa kiểu nguyên thuỷ và lớp bao Trong câu lệnh gán:Double d = 29.95; /* Double d = new Double(29.95);*/double x = d; /* double x = d.doubleValue(); */ Trong biểu thức: Double e = d + 1; /* e = new Double(d.doubleValue()+1); */

Page 12: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 12

Lặp “với mỗi” Cú pháp

for (Type variable : collection)statement Ví dụ:

Duyệt tất cả các phần tử trong mảng data[]: double sum = 0;for (double e : data)sum = sum + e;

Duyệt các phần tử trong ArrayList: double sum = 0;for (BankAccount a : accounts) sum = sum + a.getBalance();

Page 13: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 13

Ví dụ

Bank.java và BankTester.java Minh hoạ các thuật toán đơn giản trên

mảng: Đếm xem trong mảng có bao nhiêu phần tử

thoả mãn tính chất nào đó 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 14: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 14

Mảng hai chiều Cần xác định kích thước hàng và cột

final int ROWS = 3;final int COLUMNS = 3;String[][] board = new String[ROWS][COLUMNS]; Truy cập phần tử của mảng: dùng cặp chỉ số a[i][j]

board[i][j] = "x"; Duyệt mảng: dùng hai vòng lặp lồng nhau

for (int i = 0; i < ROWS; i++)for (int j = 0; j < COLUMNS; j++)board[i][j] = " ";

Ví dụ TicTacToe.java, TicTacToeTester.java

Page 15: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 15

Các thao tác trên mảng

Sao chép mảng Sao chép các phần tử của mảng Thêm, xóa phần tử Mở rộng mảng Các mảng của các đối tượng

Page 16: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 16

Sao chépdouble[] data = new double[10]; // fill array ... Sao chép tham chiếu tới mảng:

double[] prices = data; Tạo bản sao của mảng (cloning):

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

Page 17: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 17

Sao chép 1 dãy phần tử mảng Cú pháp

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

Page 18: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 18

Thêm – Xóa phần tử Thêm 1 phần tử vào mảng

System.arraycopy(data, i, data, i + 1, data.length - i - 1);data[i] = x; Xóa 1 phần tử khỏi mảng

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

Page 19: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 19

Mở rộng mảng (1)

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 mới data = newData;

Page 20: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 20

Mở rộng mảng (2)

Page 21: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 21

Đưa các mảng song song về mảng của các đối tượng (1)

Tránh dùng mảng song song Ví dụ

int[] accountNumbers;double[] balances;

Page 22: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 22

Đưa các mảng song song về mảng của các đối tượng (2)

Mảng các đối tượng BankAccount[] = accounts;

Page 23: Oop 5

2009-2010 OOP - http://mim.hus.edu.vn/elearning 23

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++;