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 recursos avançados de pesquisa! Uma biblioteca não é muito útil se os usuários não conseguem encontrar os livros que procuram. Você adicionará métodos para pesquisar por título e autor, tornando sua biblioteca realmente funcional.
Você continuará desenvolvendo seu código existente em quatro arquivos:
Book.java: Mantenha sua classe Book com todas as funcionalidades existentes: isbn, title, author, isAvailable, borrowedBy, getDetails() e os getters/setters apropriados. Certifique-se de ter métodos getter paratitleeauthor, caso ainda não os tenha adicionado.User.java: Mantenha sua classe User inalterada, com id, name, o ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() e toString().Library.java: Amplie sua classe Library com a funcionalidade de pesquisa. Mantenha todos os métodos existentes (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) e adicione estes novos métodos de pesquisa:searchByTitle(String keyword)- retorna umArrayList<Book>contendo todos os livros cujo título contém a palavra-chave (sem distinção entre maiúsculas e minúsculas). UsetoLowerCase()no título e na palavra-chave para a comparação.searchByAuthor(String keyword)- retorna umArrayList<Book>contendo todos os livros cujo nome do autor contém a palavra-chave (sem distinção entre maiúsculas e minúsculas).getAvailableBooks()- retorna umArrayList<Book>contendo apenas os livros que estão disponíveis para empréstimo no momento.Main.java: Demonstre seu sistema de pesquisa! Você receberá entradas para três livros (ISBN, título e autor de cada um), depois um usuário (ID e nome), seguidas por uma operação de empréstimo e duas consultas de pesquisa.Crie uma Library, adicione 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 pesquisas: a primeira entrada é uma palavra-chave de título, e 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: ISBN de book1, título de book1, autor de book1, ISBN de book2, título de book2, autor de book2, ISBN de book3, título de book3, autor de book3, ID do usuário, nome do usuário, operação de empréstimo, palavra-chave de pesquisa de título, palavra-chave de pesquisa de 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 pesquisa usam correspondência sem distinção entre maiúsculas e minúsculas: pesquisar por "clean" encontra tanto "Clean Code" quanto "The Clean Coder". A lista de livros disponíveis exclui corretamente o livro emprestado. Esses recursos de pesquisa transformam sua biblioteca de uma simples coleção em um sistema realmente útil!
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
// Print "Title search '[titleKeyword]':"
// Usar library.searchByTitle(titleKeyword)
// Print each book's getDetails(), or "No books found" if empty
// TODO: Author search
// Print "Author search '[authorKeyword]':"
// Usar library.searchByAuthor(authorKeyword)
// Print each book's getDetails(), or "No books found" if empty
// TODO: Available books
// Print "Available books:"
// Use library.getAvailableBooks()
// Imprimir 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árioSistema de EmpréstimosFuncionalidade de BuscaInterface do AdministradorIntegração de Tratamento de ExceçõesTestes e Integração2Modificadores 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 IteratorPratique por conta própria: Compilador de Java online