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 book1, название book1, автор book1, ISBN book2, название book2, автор book2, ISBN book3, название 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: Поиск по названию
        // Print "Title search '[titleKeyword]':"
        // Использовать library.searchByTitle(titleKeyword)
        // Print each book's getDetails(), or "No books found" if empty
        
        // TODO: Author search
        // Print "Author search '[authorKeyword]':"
        // Используйте library.searchByAuthor(authorKeyword)
        // Print each book's getDetails(), or "No books found" if empty
        
        // TODO: Available books
        // Print "Available books:"
        // Use library.getAvailableBooks()
        // Выведите getDetails() каждой книги
    }
}

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

Потренируйтесь самостоятельно: Онлайн-компилятор Java