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¡Mejoremos tu sistema de gestión de bibliotecas con potentes capacidades de búsqueda! Una biblioteca no es muy útil si los usuarios no pueden encontrar los libros que buscan. Añadirás métodos para buscar por título y autor, haciendo que tu biblioteca sea realmente funcional.
Seguirás desarrollando tu código existente en cuatro archivos:
Book.java: Conserva tu clase Book con toda la funcionalidad existente: isbn, title, author, isAvailable, borrowedBy, getDetails(), y los getters/setters correspondientes. Asegúrate de tener métodos getter paratitleyauthorsi aún no los has añadido.User.java: Conserva 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. Conserva todos los métodos existentes (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) y añade 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 mayúsculas de 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 mayúsculas de minúsculas).getAvailableBooks(): devuelve unArrayList<Book>que contiene únicamente los libros que están disponibles actualmente para préstamo.Main.java: ¡Demuestra tu sistema de búsqueda! Recibirás los datos de tres libros (ISBN, título y autor de cada uno), después un usuario (ID y nombre), seguido de una operación de préstamo y dos consultas de búsqueda.Crea una Library, añade los tres libros y registra al usuario. Procesa la operación de préstamo (con el formato
userId:isbn). Después realiza las dos búsquedas: la primera entrada es una palabra clave del título y la segunda es una palabra clave del autor.Imprime los resultados en este orden:
- Después del préstamo, 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: 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 del usuario, nombre del usuario, operación de préstamo, palabra clave de búsqueda del título, palabra clave de búsqueda del 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 coincidencias que no distinguen mayúsculas de 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 realmente útil!
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 agregar 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
// 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]':"
// Usa library.searchByAuthor(authorKeyword)
// Print each book's getDetails(), or "No books found" if empty
// TODO: Available books
// Print "Available books:"
// Use library.getAvailableBooks()
// Imprime 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 UsuarioSistema de préstamosFuncionalidad de búsquedaInterfaz de administradorIntegración de manejo de excepcionesPruebas e integración2Modificadores 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 IteratorPractica por tu cuenta: Compilador de Java online