Menu
CoddyTech

搜索功能

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 80 课,共 87 课。

challenge icon

挑战

简单

让我们为你的图书管理系统添加强大的搜索功能!如果用户找不到想借的书,图书馆就没什么用。你将添加按书名和作者搜索的方法,让你的图书馆真正实用起来。

你将继续在现有的 4 个文件中编写代码:

  • Book.java:保留现有的 Book 类及其所有功能:isbn、title、author、isAvailable、borrowedBy、getDetails(),以及相应的 getter 和 setter。如果你还没有添加 title 和 author 的 getter 方法,请确保将它们添加上。
  • User.java:保留 User 类,不做改动,其中包括 id、name、borrowedBooks ArrayList、borrowBook()、returnBook()、getBorrowedCount() 和 toString()。
  • Library.java:为 Library 类添加搜索功能。保留所有现有方法(addBook、registerUser、findBookByIsbn、findUserById、borrowBook、returnBook),并添加以下新搜索方法:

    searchByTitle(String keyword):返回一个 ArrayList<Book>,其中包含所有书名中含有关键词的书(不区分大小写)。比较时,对书名和关键词都使用 toLowerCase()。

    searchByAuthor(String keyword):返回一个 ArrayList<Book>,其中包含所有作者姓名中含有关键词的书(不区分大小写)。

    getAvailableBooks():返回一个 ArrayList<Book>,其中只包含当前可以借阅的书。

  • Main.java:展示你的搜索系统!你将收到 3 本书的输入(每本书的 ISBN、书名和作者),然后是一个用户(ID、姓名),接着是一次借阅操作和两个搜索查询。

    创建一个 Library,添加全部 3 本书,并注册该用户。处理借阅操作(格式为 userId:isbn)。然后执行两次搜索:第一个输入是书名关键词,第二个输入是作者关键词。

    按以下顺序输出结果:

    • 借阅后,输出借阅确认信息
    • 输出 Title search '[keyword]':,然后逐行输出每本匹配书籍的详情(使用 getDetails())。如果没有匹配项,输出 No books found
    • 输出 Author search '[keyword]':,然后输出每本匹配书籍的详情。如果没有匹配项,输出 No books found
    • 输出 Available books:,然后输出每本可借阅书籍的详情

你将按以下顺序收到输入:book1 ISBN、book1 书名、book1 作者、book2 ISBN、book2 书名、book2 作者、book3 ISBN、book3 书名、book3 作者、用户 ID、用户名、借阅操作、书名搜索关键词、作者搜索关键词。

例如,输入为 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 时,你的输出将是:

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

注意,搜索方法使用不区分大小写的匹配方式:搜索 "clean" 可以找到 "Clean Code" 和 "The Clean Coder"。可借阅书籍列表会正确排除已借出的书。这些搜索功能让你的图书馆从简单的藏书集合变成了真正实用的系统!

亲手试试

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取第 1 本书的信息
        String isbn1 = scanner.nextLine();
        String title1 = scanner.nextLine();
        String author1 = scanner.nextLine();
        
        // 读取第 2 本书的信息
        String isbn2 = scanner.nextLine();
        String title2 = scanner.nextLine();
        String author2 = scanner.nextLine();
        
        // 读取第 3 本书的信息
        String isbn3 = scanner.nextLine();
        String title3 = scanner.nextLine();
        String author3 = scanner.nextLine();
        
        // 读取用户信息
        String userId = scanner.nextLine();
        String userName = scanner.nextLine();
        
        // 读取借书操作
        String borrowOp = scanner.nextLine();
        
        // 读取搜索关键字
        String titleKeyword = scanner.nextLine();
        String authorKeyword = scanner.nextLine();
        
        // 创建 Book 对象
        Book book1 = new Book(isbn1, title1, author1);
        Book book2 = new Book(isbn2, title2, author2);
        Book book3 = new Book(isbn3, title3, author3);
        
        // 创建 User 对象
        User user = new User(userId, userName);
        
        // 创建 Library,并添加书籍和用户
        Library library = new Library();
        library.addBook(book1);
        library.addBook(book2);
        library.addBook(book3);
        library.registerUser(user);
        
        // 处理借书操作
        String[] parts = borrowOp.split(":");
        String opUserId = parts[0];
        String opIsbn = parts[1];
        library.borrowBook(opUserId, opIsbn);
        
        // TODO:按标题搜索
        // 打印 "Title search '[titleKeyword]':"
        // 使用 library.searchByTitle(titleKeyword)
        // 打印每本书的 getDetails(),如果结果为空,则打印 "No books found"
        
        // TODO: 按作者搜索
        // 打印 "Author search '[authorKeyword]':"
        // 使用 library.searchByAuthor(authorKeyword)
        // 打印每本书的 getDetails(),如果结果为空,则打印 "No books found"
        
        // TODO: 可借阅的图书
        // 打印 "Available books:"
        // 使用 library.getAvailableBooks()
        // 打印每本书的 getDetails()
    }
}

面向对象编程中的所有课

自己练习: Java 在线编译器