oop 5
DESCRIPTION
slide java o lopTRANSCRIPT
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]
2009-2010 OOP - http://mim.hus.edu.vn/elearning 2
Tài liệu tham khảo BigJava – chương 8
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};
2009-2010 OOP - http://mim.hus.edu.vn/elearning 4
Mảng (2)
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
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));
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 (?)
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)
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)
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);
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); */
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();
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
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
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
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();
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);
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);
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;
2009-2010 OOP - http://mim.hus.edu.vn/elearning 20
Mở rộng mảng (2)
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;
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;
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++;