Ghi chú: Array of Objects, Case Study Antique Shop & Comparable/Comparator
Khái niệm Mảng Đối Tượng – Array of Objects
- Là một cấu trúc dữ liệu lưu trữ nhiều đối tượng (instance của class) trong cùng một vùng bộ nhớ liên tiếp.
- Mỗi phần tử truy cập thông qua chỉ số (index, bắt đầu từ 0).
- Ưu điểm
- Dễ cài đặt, tốc độ truy xuất phần tử O(1).
- Dễ lặp qua toàn bộ phần tử bằng vòng lặp for.
- Hạn chế
- Kích thước cố định sau khi khởi tạo.
- Các thao tác thêm/xoá đòi hỏi dịch chuyển phần tử, độ phức tạp O(n).
Các thao tác cơ bản với mảng
- In (print) tất cả các phần tử
- Duyệt từ 0→n−1 và in toString() của từng phần tử.
- Thêm (add) một phần tử tại vị trí chỉ định
- Kiểm tra tràn mảng, dịch phải từ cuối đến index, gán phần tử mới.
- Xoá (delete)
- Dịch trái các phần tử phía sau index, giảm biến đếm.
- Tìm kiếm (search)
- Theo index: trả về list[index] nếu index hợp lệ.
- Theo giá trị: duyệt tuyến tính, so sánh equals()/thuộc tính khoá.
- Cập nhật (update)
- Kiểm tra index hợp lệ, gọi input() của phần tử đó.
Case Study: Quản lý Cửa Hàng Đồ Cổ
- Bài toán: Chủ tiệm cần quản lý lọ (Vase), tượng (Statue), tranh (Painting).
- Yêu cầu: Thêm, tìm, cập nhật, xoá, hiển thị, lọc theo loại, sắp xếp theo giá trị.
Sơ đồ kế thừa
- Item (lớp cha)
- Thuộc tính:
value:int (giá ≥0), creator:String (không rỗng). - Phương thức: constructor mặc định & đầy đủ, getters/setters,
input(), toString().
- Vase extends Item
height:int (0≤height≤2000), material:String (không rỗng).
- Statue extends Item
weight:int (0≤weight≤1000), colour:String.
- Painting extends Item
height:int (0≤height≤2000), width:int (0≤width≤3000),isWatercolour:boolean, isFramed:boolean.
Lớp ItemList
- Trường dữ liệu
Item[] list = new Item[MAX]numOfItem:int – số phần tử thực.MAX:int (mặc định 100).
- Phương thức
addItem(Item):boolean – thêm cuối mảng.displayAll() – in toàn bộ.findItem(String creator):Item – trả lại đối tượng đầu tiên có creator khớp.findItemIndex(String creator):int – trả lại index, −1 nếu không tìm thấy.updateItem(int index):boolean – gọi input() thực hiện nhập lại giá trị.removeItem(int index):boolean – dịch trái, giảm numOfItem.displayItemsByType(String type) – dùng instanceof lọc.sortItems() – bubble-sort tăng dần theo value.
Lớp antiqueShop (Main)
- Hiển thị menu 10 lựa chọn:
- Thêm Vase
- Thêm Statue
- Thêm Painting
- Hiển thị tất cả
- Tìm theo creator
- Cập nhật theo index
- Xoá theo index
- Hiển thị danh sách Vase
- Sắp xếp tăng dần theo giá trị
- Thoát
- Vòng lặp
do–while(choice<=9) đảm bảo chỉ thoát khi chọn 10. - Mỗi case tạo đối tượng tương ứng, gọi
input(), sau đó addItem().
Ý nghĩa & Liên hệ Thực tiễn
- Minh hoạ OOP + Array: kế thừa, đa hình (
instanceof, override toString()). - Cách xử lý ngoại lệ (
try–catch) khi nhập dữ liệu. - Khả năng mở rộng: chuyển từ array sang ArrayList không đổi giao diện người dùng.
Câu hỏi kiểm tra (CQs) cho Slot 13
- Trình bày thao tác sắp xếp mảng đối tượng.
- Trình bày thao tác chèn (insert) một phần tử vào mảng đối tượng.
- Trình bày thao tác xoá (delete) một phần tử khỏi mảng.
- Trình bày thao tác tìm kiếm (search) phần tử trong mảng.
Bài tập mở rộng
Exercise 1 – Quản lý SinhVien
- Lớp
SinhVien: maSinhVien, ten, diemTrungBinh. - Main: tạo mảng 5 sinh viên, nhập dữ liệu bằng Scanner.
- Gợi ý: có thể tái sử dụng các thao tác từ ItemList.
Exercise 2 – Quản lý NhanVien (Array)
- Lớp
NhanVien: maNhanVien, hoTen, tuoi, luong. - Nhập n nhân viên.
- Sắp xếp lương tăng dần, nếu bằng sắp xếp tuổi giảm dần (bubble/selection/insertion).
Slot 12 – Bài tập ArrayList Product
- Thay thế mảng tĩnh bằng ArrayList:
- Linh hoạt kích thước.
- Có sẵn phương thức
add, remove, sort, indexOf.
- Lớp ProductList quản lý ArrayList, menu tương tự antiqueShop.
Interface Comparable
java.lang.Comparable<T> – định nghĩa thứ tự tự nhiên (natural ordering) cho lớp.- Phải cài
compareTo(T other) trả về <0, 0, >0. - Khi triển khai: có thể gọi
Collections.sort(list) hoặc Arrays.sort(array) không cần Comparator. - Ví dụ Student:
- Sắp xếp GPA giảm dần, nếu bằng thì tuổi tăng dần.
- Logic tuần tự trong
compareTo() (xem slide mã nguồn).
Kết nối với Case Study
- Nếu Item implements Comparable
- (so sánh theo
value) thì thay sortItems() tự viết bằng Arrays.sort(list,0,numOfItem).
Interface Comparator
java.util.Comparator<T> – tách logic so sánh khỏi class.- Cho phép nhiều tiêu chí sắp xếp khác nhau cho cùng 1 lớp, không sửa mã nguồn lớp gốc.
- Từ Java 8:
Comparator.comparing() và thenComparing() giúp xâu chuỗi tiêu chí.
Ví dụ StudentComparator
- So sánh name tăng dần; nếu trùng age giảm dần.
- Gọi:
Collections.sort(list, comparator) hoặc list.sort(comparator). - Lambda chaining:
Comparator<Student> comp = Comparator
.comparing(Student::getName)
.thenComparing(Student::getAge, Comparator.reverseOrder());
students.sort(comp);
Exercise Comparable vs Comparator
- Exercise 1 (Comparable): sắp xếp
NhanVien lương ↑, tuổi ↓ bằng compareTo(). - Exercise 2 (Comparator): tương tự nhưng dùng đối tượng
EmployeeSalaryAgeComparator hoặc lambda.
Tổng kết Ý nghĩa Kỹ thuật
- Hiểu rõ cách triển khai cấu trúc mảng cho đối tượng & giới hạn của nó.
- Biết bubble sort đơn giản hoá sắp xếp theo giá trị; có thể thay thế bằng Arrays.sort + Comparable để tối ưu.
- Áp dụng OOP (kế thừa, đa hình), exception handling, và interface (
Comparable, Comparator) để xây dựng chương trình linh hoạt, tái sử dụng cao. - Kết nối thực tế: quản lý cửa hàng, sinh viên, nhân viên – tất cả đều là bài toán danh sách cần CRUD + sort + search.