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ừ 00).
  • Ưu điểm
    • Dễ cài đặt, tốc độ truy xuất phần tử O(1)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)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ừ 0n10 \rightarrow 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≥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 (0height20000 \le height \le 2000), material:String (không rỗng).
  • Statue extends Item
    • weight:int (0weight10000 \le weight \le 1000), colour:String.
  • Painting extends Item
    • height:int (0height20000 \le height \le 2000), width:int (0width30000 \le width \le 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 100100).
  • 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-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:
    1. Thêm Vase
    2. Thêm Statue
    3. Thêm Painting
    4. Hiển thị tất cả
    5. Tìm theo creator
    6. Cập nhật theo index
    7. Xoá theo index
    8. Hiển thị danh sách Vase
    9. Sắp xếp tăng dần theo giá trị
    10. 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 nn 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, 00, >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()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.