Menu
Coddy logo textTech

Функционал поиска

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 80 из 87.

challenge icon

Задание

Легко

Давайте улучшим вашу систему управления библиотекой с помощью мощных возможностей поиска! Библиотека не очень полезна, если пользователи не могут найти нужные им книги. Вы добавите методы для поиска по названию и автору, что сделает вашу библиотеку по-настоящему функциональной.

Вы продолжите работу над существующим кодом в четырех файлах:

  • Book.java: Сохраните класс Book со всей существующей функциональностью — isbn, title, author, isAvailable, borrowedBy, getDetails() и соответствующими геттерами/сеттерами. Убедитесь, что у вас есть методы-геттеры для title и author, если вы их еще не добавили.
  • User.java: Оставьте класс User без изменений с id, name, ArrayList borrowedBooks, 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: Продемонстрируйте вашу систему поиска! Вы получите входные данные для трех книг (ISBN, название, автор для каждой), затем пользователя (ID, имя), за которыми следует операция заимствования и два поисковых запроса.

    Создайте Library, добавьте все три книги и зарегистрируйте пользователя. Обработайте операцию заимствования (в формате userId:isbn). Затем выполните два поиска — первый ввод — это ключевое слово для названия, второй — ключевое слово для автора.

    Выведите результаты в следующем порядке:

    • После заимствования выведите подтверждение заимствования
    • Выведите Title search '[keyword]':, а затем детали каждой подходящей книги на отдельных строках (используя getDetails()). Если совпадений нет, выведите No books found
    • Выведите Author search '[keyword]':, а затем детали каждой подходящей книги. Если совпадений нет, выведите No books found
    • Выведите Available books:, а затем детали каждой доступной книги

Вы получите входные данные в следующем порядке: ISBN книги 1, название книги 1, автор книги 1, ISBN книги 2, название книги 2, автор книги 2, ISBN книги 3, название книги 3, автор книги 3, 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 = 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() для каждой книги
    }
}

Все уроки раздела Объектно-ориентированное программирование