Funcionalidade de Busca
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 80 de 87.
Desafio
FácilVamos aprimorar seu Sistema de Gerenciamento de Biblioteca com poderosos recursos de busca! Uma biblioteca não é muito útil se os usuários não conseguirem encontrar os livros que procuram. Você adicionará métodos para buscar por título e autor, tornando sua biblioteca verdadeiramente funcional.
Você continuará construindo sobre seu código existente em quatro arquivos:
Book.java: Mantenha sua classe Book com toda a funcionalidade existente—isbn, title, author, isAvailable, borrowedBy, getDetails() e os getters/setters apropriados. Certifique-se de ter métodos getter paratitleeauthorse ainda não os adicionou.User.java: Mantenha sua classe User inalterada com id, name, o ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() e toString().Library.java: Expanda sua classe Library com funcionalidade de busca. Mantenha todos os métodos existentes (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) e adicione estes novos métodos de busca:searchByTitle(String keyword)- retorna umArrayList<Book>contendo todos os livros cujo título contém a palavra-chave (insensível a maiúsculas e minúsculas). UsetoLowerCase()tanto no título quanto na palavra-chave para comparação.searchByAuthor(String keyword)- retorna umArrayList<Book>contendo todos os livros cujo nome do autor contém a palavra-chave (insensível a maiúsculas e minúsculas).getAvailableBooks()- retorna umArrayList<Book>contendo apenas os livros que estão atualmente disponíveis para empréstimo.Main.java: Demonstre seu sistema de busca! Você receberá entradas para três livros (ISBN, título, autor para cada um), depois um usuário (ID, nome), seguido por uma operação de empréstimo e duas consultas de busca.Crie uma Library, adicione todos os três livros e registre o usuário. Processe a operação de empréstimo (formatada como
userId:isbn). Em seguida, realize as duas buscas—a primeira entrada é uma palavra-chave de título, a segunda é uma palavra-chave de autor.Imprima os resultados nesta ordem:
- Após o empréstimo, imprima a confirmação do empréstimo
- Imprima
Title search '[keyword]':seguido pelos detalhes de cada livro correspondente em linhas separadas (usando getDetails()). Se não houver correspondências, imprimaNo books found - Imprima
Author search '[keyword]':seguido pelos detalhes de cada livro correspondente. Se não houver correspondências, imprimaNo books found - Imprima
Available books:seguido pelos detalhes de cada livro disponível
Você receberá as entradas nesta ordem: book1 ISBN, book1 title, book1 author, book2 ISBN, book2 title, book2 author, book3 ISBN, book3 title, book3 author, user ID, user name, operação de empréstimo, palavra-chave de busca por título, palavra-chave de busca por autor.
Por exemplo, com as entradas 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, sua saída seria:
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 FourObserve como os métodos de busca usam correspondência insensível a maiúsculas e minúsculas—buscar por "clean" encontra tanto "Clean Code" quanto "The Clean Coder". A lista de livros disponíveis exclui corretamente o livro emprestado. Esses recursos de busca transformam sua biblioteca de uma simples coleção em um sistema verdadeiramente utilizável!
Experimente você mesmo
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler informações do livro 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Ler informações do livro 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Ler informações do livro 3
String isbn3 = scanner.nextLine();
String title3 = scanner.nextLine();
String author3 = scanner.nextLine();
// Ler informações do usuário
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Ler operação de empréstimo
String borrowOp = scanner.nextLine();
// Ler palavras-chave de busca
String titleKeyword = scanner.nextLine();
String authorKeyword = scanner.nextLine();
// Criar objetos Book
Book book1 = new Book(isbn1, title1, author1);
Book book2 = new Book(isbn2, title2, author2);
Book book3 = new Book(isbn3, title3, author3);
// Criar objeto User
User user = new User(userId, userName);
// Criar Library e adicionar livros e usuário
Library library = new Library();
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.registerUser(user);
// Processar operação de empréstimo
String[] parts = borrowOp.split(":");
String opUserId = parts[0];
String opIsbn = parts[1];
library.borrowBook(opUserId, opIsbn);
// TODO: Busca por título
// Imprimir "Title search '[titleKeyword]':"
// Usar library.searchByTitle(titleKeyword)
// Imprimir o getDetails() de cada livro, ou "No books found" se estiver vazio
// TODO: Busca por autor
// Imprimir "Author search '[authorKeyword]':"
// Usar library.searchByAuthor(authorKeyword)
// Imprimir o getDetails() de cada livro, ou "No books found" se estiver vazio
// TODO: Livros disponíveis
// Imprimir "Available books:"
// Usar library.getAvailableBooks()
// Imprimir o getDetails() de cada livro
}
}Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada10Tratamento de Exceções em POO
Hierarquia de Classes de ExceçãoExceções PersonalizadasErros Checked vs UncheckedPadrão Try With ResourcesRecapitulação - Usuário Validado13Projeto: Gerenciamento de Biblioteca
Visão Geral do Projeto e Modelagem UMLClasses Livro e Usuário2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator