Chức năng tìm kiếm
Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 80 trên 87.
Thử thách
DễHãy nâng cấp Hệ thống quản lý thư viện của bạn với các tính năng tìm kiếm mạnh mẽ! Một thư viện sẽ không hữu ích lắm nếu người dùng không thể tìm thấy những cuốn sách họ cần. Bạn sẽ thêm các phương thức tìm kiếm theo tiêu đề và tác giả, giúp thư viện của bạn thực sự hữu dụng.
Bạn sẽ tiếp tục xây dựng dựa trên code hiện có trong bốn tệp:
Book.java: Giữ nguyên lớp Book với tất cả chức năng hiện có: isbn, title, author, isAvailable, borrowedBy, getDetails() và các getter/setter phù hợp. Hãy thêm các phương thức getter chotitlevàauthornếu bạn chưa thêm.User.java: Giữ nguyên lớp User với id, name, borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() và toString().Library.java: Mở rộng lớp Library bằng chức năng tìm kiếm. Giữ nguyên tất cả phương thức hiện có (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) và thêm các phương thức tìm kiếm mới sau:searchByTitle(String keyword)- trả về mộtArrayList<Book>chứa tất cả sách có tiêu đề chứa từ khóa (không phân biệt chữ hoa chữ thường). DùngtoLowerCase()cho cả tiêu đề và từ khóa để so sánh.searchByAuthor(String keyword)- trả về mộtArrayList<Book>chứa tất cả sách có tên tác giả chứa từ khóa (không phân biệt chữ hoa chữ thường).getAvailableBooks()- trả về mộtArrayList<Book>chỉ chứa những sách hiện có thể cho mượn.Main.java: Trình bày hệ thống tìm kiếm của bạn! Bạn sẽ nhận đầu vào cho ba cuốn sách (ISBN, tiêu đề, tác giả của mỗi cuốn), sau đó là một người dùng (ID, tên), tiếp theo là một thao tác mượn sách và hai truy vấn tìm kiếm.Tạo một Library, thêm cả ba cuốn sách và đăng ký người dùng. Xử lý thao tác mượn sách (theo định dạng
userId:isbn). Sau đó thực hiện hai lượt tìm kiếm: đầu vào thứ nhất là từ khóa tiêu đề, đầu vào thứ hai là từ khóa tác giả.In kết quả theo thứ tự sau:
- Sau khi mượn sách, in thông báo xác nhận mượn
- In
Title search '[keyword]':, sau đó in chi tiết của từng sách phù hợp trên một dòng riêng (dùng getDetails()). Nếu không có kết quả phù hợp, inNo books found - In
Author search '[keyword]':, sau đó in chi tiết của từng sách phù hợp. Nếu không có kết quả phù hợp, inNo books found - In
Available books:, sau đó in chi tiết của từng sách hiện có
Bạn sẽ nhận đầu vào theo thứ tự sau: ISBN của book1, tiêu đề của book1, tác giả của book1, ISBN của book2, tiêu đề của book2, tác giả của book2, ISBN của book3, tiêu đề của book3, tác giả của book3, ID người dùng, tên người dùng, thao tác mượn sách, từ khóa tìm kiếm tiêu đề, từ khóa tìm kiếm tác giả.
Ví dụ, với các đầu vào ISBN-001, Clean Code, Robert Martin, ISBN-002, The Clean Coder, Robert Martin, ISBN-003, Design Patterns, Gang of Four, U001, Alice, U001:ISBN-001, clean, martin, đầu ra của bạn sẽ là:
Alice borrowed Clean Code
Title search 'clean':
[ISBN-001] Clean Code by Robert Martin
[ISBN-002] The Clean Coder by Robert Martin
Author search 'martin':
[ISBN-001] Clean Code by Robert Martin
[ISBN-002] The Clean Coder by Robert Martin
Available books:
[ISBN-002] The Clean Coder by Robert Martin
[ISBN-003] Design Patterns by Gang of FourLưu ý cách các phương thức tìm kiếm so khớp không phân biệt chữ hoa chữ thường: tìm kiếm "clean" sẽ tìm thấy cả "Clean Code" và "The Clean Coder". Danh sách sách hiện có loại trừ chính xác cuốn sách đã được mượn. Những tính năng tìm kiếm này biến thư viện của bạn từ một bộ sưu tập đơn giản thành một hệ thống thực sự hữu dụng!
Tự làm thử
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Đọc thông tin sách 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Đọc thông tin sách 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Đọc thông tin sách 3
String isbn3 = scanner.nextLine();
String title3 = scanner.nextLine();
String author3 = scanner.nextLine();
// Đọc thông tin người dùng
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Đọc thao tác mượn sách
String borrowOp = scanner.nextLine();
// Đọc các từ khóa tìm kiếm
String titleKeyword = scanner.nextLine();
String authorKeyword = scanner.nextLine();
// Tạo các đối tượng (object) Book
Book book1 = new Book(isbn1, title1, author1);
Book book2 = new Book(isbn2, title2, author2);
Book book3 = new Book(isbn3, title3, author3);
// Tạo đối tượng User
User user = new User(userId, userName);
// Tạo Library rồi thêm sách và người dùng
Library library = new Library();
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.registerUser(user);
// Xử lý thao tác mượn sách
String[] parts = borrowOp.split(":");
String opUserId = parts[0];
String opIsbn = parts[1];
library.borrowBook(opUserId, opIsbn);
// TODO: Tìm kiếm theo tên sách
// In ra "Title search '[titleKeyword]':"
// Dùng library.searchByTitle(titleKeyword)
// In ra getDetails() của từng cuốn sách, hoặc "No books found" nếu danh sách trống
// TODO: Tìm theo tác giả
// In ra "Author search '[authorKeyword]':"
// Dùng library.searchByAuthor(authorKeyword)
// In ra getDetails() của từng cuốn sách, hoặc "No books found" nếu danh sách trống
// TODO: Sách có sẵn
// In ra "Available books:"
// Dùng library.getAvailableBooks()
// In ra getDetails() của từng cuốn sách
}
}Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh10Xử lý ngoại lệ trong OOP
Phân cấp lớp ngoại lệNgoại lệ tùy chỉnhLỗi có kiểm tra và không kiểm traMẫu try-with-resourcesÔn tập: người dùng đã xác thực13Dự án: Quản lý thư viện
Tổng quan dự án và thiết kế UMLLớp sách và người dùngHệ thống mượn sáchChức năng tìm kiếmGiao diện quản trịTích hợp xử lý ngoại lệKiểm thử và tích hợp2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online