Menu
CoddyTech

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.

challenge icon

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 cho title và author nế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ột ArrayList<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ùng toLowerCase() cho cả tiêu đề và từ khóa để so sánh.

    searchByAuthor(String keyword) - trả về một ArrayList<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ột ArrayList<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, in No 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, in No 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 Four

Lư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

Tự luyện tập: Trình biên dịch Java online