Funcionalidad de búsqueda
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 80 de 87.
Desafío
Fácil¡Vamos a mejorar tu Sistema de Gestión de Biblioteca con potentes capacidades de búsqueda! Una biblioteca no es muy útil si los usuarios no pueden encontrar los libros que buscan. Agregarás métodos para buscar por título y autor, haciendo que tu biblioteca sea verdaderamente funcional.
Continuarás construyendo sobre tu código existente en cuatro archivos:
Book.java: Mantén tu clase Book con toda la funcionalidad existente: isbn, title, author, isAvailable, borrowedBy, getDetails() y los getters/setters apropiados. Asegúrate de tener métodos getter paratitleyauthorsi aún no los has agregado.User.java: Mantén tu clase User sin cambios con id, name, el ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() y toString().Library.java: Amplía tu clase Library con funcionalidad de búsqueda. Mantén todos los métodos existentes (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) y agrega estos nuevos métodos de búsqueda:searchByTitle(String keyword)- devuelve unArrayList<Book>que contiene todos los libros cuyo título contiene la palabra clave (sin distinguir entre mayúsculas y minúsculas). UsatoLowerCase()tanto en el título como en la palabra clave para la comparación.searchByAuthor(String keyword)- devuelve unArrayList<Book>que contiene todos los libros cuyo nombre de autor contiene la palabra clave (sin distinguir entre mayúsculas y minúsculas).getAvailableBooks()- devuelve unArrayList<Book>que contiene solo los libros que están actualmente disponibles para préstamo.Main.java: ¡Demuestra tu sistema de búsqueda! Recibirás entradas para tres libros (ISBN, título, autor para cada uno), luego un usuario (ID, nombre), seguido de una operación de préstamo y dos consultas de búsqueda.Crea una Library, agrega los tres libros y registra al usuario. Procesa la operación de préstamo (con formato
userId:isbn). Luego realiza las dos búsquedas: la primera entrada es una palabra clave de título, la segunda es una palabra clave de autor.Imprime los resultados en este orden:
- Después de prestar, imprime la confirmación del préstamo
- Imprime
Title search '[keyword]':seguido de los detalles de cada libro coincidente en líneas separadas (usando getDetails()). Si no hay coincidencias, imprimeNo books found - Imprime
Author search '[keyword]':seguido de los detalles de cada libro coincidente. Si no hay coincidencias, imprimeNo books found - Imprime
Available books:seguido de los detalles de cada libro disponible
Recibirás las entradas en este orden: book1 ISBN, book1 title, book1 author, book2 ISBN, book2 title, book2 author, book3 ISBN, book3 title, book3 author, user ID, user name, operación de préstamo, palabra clave de búsqueda de título, palabra clave de búsqueda de autor.
Por ejemplo, con las 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, tu salida sería:
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 FourObserva cómo los métodos de búsqueda utilizan la coincidencia sin distinguir entre mayúsculas y minúsculas: buscar "clean" encuentra tanto "Clean Code" como "The Clean Coder". La lista de libros disponibles excluye correctamente el libro prestado. ¡Estas capacidades de búsqueda transforman tu biblioteca de una simple colección en un sistema verdaderamente utilizable!
Pruébalo tú mismo
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leer información del libro 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Leer información del libro 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Leer información del libro 3
String isbn3 = scanner.nextLine();
String title3 = scanner.nextLine();
String author3 = scanner.nextLine();
// Leer información del usuario
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Leer operación de préstamo
String borrowOp = scanner.nextLine();
// Leer palabras clave de búsqueda
String titleKeyword = scanner.nextLine();
String authorKeyword = scanner.nextLine();
// Crear objetos Book
Book book1 = new Book(isbn1, title1, author1);
Book book2 = new Book(isbn2, title2, author2);
Book book3 = new Book(isbn3, title3, author3);
// Crear objeto User
User user = new User(userId, userName);
// Crear Library y añadir libros y usuario
Library library = new Library();
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.registerUser(user);
// Procesar operación de préstamo
String[] parts = borrowOp.split(":");
String opUserId = parts[0];
String opIsbn = parts[1];
library.borrowBook(opUserId, opIsbn);
// TODO: Búsqueda por título
// Imprimir "Title search '[titleKeyword]':"
// Usar library.searchByTitle(titleKeyword)
// Imprimir getDetails() de cada libro, o "No books found" si está vacío
// TODO: Búsqueda por autor
// Imprimir "Author search '[authorKeyword]':"
// Usar library.searchByAuthor(authorKeyword)
// Imprimir getDetails() de cada libro, o "No books found" si está vacío
// TODO: Libros disponibles
// Imprimir "Available books:"
// Usar library.getAvailableBooks()
// Imprimir getDetails() de cada libro
}
}Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado10Manejo de excepciones en POO
Jerarquía de clases de excepcionesExcepciones personalizadasErrores Checked vs UncheckedPatrón Try With ResourcesResumen - Usuario validado13Proyecto: Gestión de biblioteca
Descripción general del proyecto y diseño UMLClases de Libro y Usuario2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Iterator