Функционал поиска
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 80 из 87.
Задание
ЛегкоДавайте улучшим вашу систему управления библиотекой с помощью мощных возможностей поиска! Библиотека не очень полезна, если пользователи не могут найти нужные им книги. Вы добавите методы для поиска по названию и автору, что сделает вашу библиотеку по-настоящему функциональной.
Вы продолжите работу над существующим кодом в четырех файлах:
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() для каждой книги
}
}Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка10Обработка исключений в ООП
Иерархия классов исключенийПользовательские исключенияПроверяемые и непроверяемые ошибкиПаттерн Try With ResourcesПовторение — Validated User13Проект: Управление библиотекой
Обзор проекта и UML-проектированиеКлассы Book и User2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»