QuickLibrary es una aplicación de consola desarrollada en Java diseñada para resolver los problemas de organización, seguimiento y control de préstamos de libros en una biblioteca universitaria. El sistema permite administrar un catálogo de libros y gestionar eficientemente una cola de solicitudes de préstamo enviadas por los estudiantes.
La característica principal de este proyecto es que no utiliza las colecciones nativas de Java (como LinkedList, Queue, TreeMap, etc.). En su lugar, implementa estructuras de datos lineales y no lineales de forma totalmente genérica y propia, garantizando un control óptimo de la memoria y algoritmos eficientes para la búsqueda, inserción y eliminación de registros.
El proyecto sigue el patrón de diseño arquitectónico MVC (Modelo-Vista-Controlador), organizado en los siguientes paquetes:
Estructura: Contiene las estructuras de datos fundamentales implementadas desde cero.Nodo.java: Estructura base para componentes enlazados.Cola.java: Cola genérica enlazada para las solicitudes de préstamo (FIFO).Pila.java: Pila genérica enlazada utilizada para el historial de transacciones (LIFO).LinkedBST.java: Árbol Binario de Búsqueda genérico encargado de ordenar los libros por su código.
Modelo: Define las entidades de datos del sistema.Libro.java: Representa un libro con atributos como código, título, autor, categoría, año y estado. ImplementaComparable<Libro>.Solicitud.java: Contiene la información del estudiante y el libro solicitado.Transaccion.java: Registra los eventos lógicos del sistema (préstamos, devoluciones, fallos).
Controlador: Contiene la lógica de negocio.BibliotecaControlador.java: Gestiona las operaciones de los libros sobre el árbol binario de búsqueda.MotorTransacciones.java: Coordina los préstamos atendiendo la cola, realiza las devoluciones y genera los reportes estadísticos.
Util: Módulos auxiliares y de soporte.LectorCSV.java: Lector encargado de la persistencia inicial de datos.ExceptionIsEmpty.java: Excepción personalizada para el control de estructuras vacías.
Vista: Interfaz de usuario de la aplicación.Vista.java: Maneja la interacción por consola con menús interactivos y capturas de teclado.
Para dar cumplimiento estricto a las restricciones técnicas del proyecto, se diseñaron las siguientes estructuras de datos:
Se utiliza como la estructura principal para organizar el catálogo de libros mediante su atributo código. Al implementar la interfaz Comparable<Libro>, permite inserciones y búsquedas eficientes en tiempo logarítmico.
- Operaciones principales:
insert(E data): O(log n) promedio / O(n) peor caso (árbol desbalanceado).search(E data): O(log n) promedio / O(n) peor caso.delete(E data): O(log n) promedio / O(n) peor caso.inOrder(): Recorrido que lista los libros ordenados ascendentemente por código en tiempo O(n).countNodes()ycountByEstado(String estado): Métodos recursivos de conteo con complejidad O(n).
Implementada mediante nodos enlazados simples con referencias al frente (head) y al final (tail). Garantiza que las solicitudes de préstamo se procesen estrictamente bajo el principio FIFO (First-In, First-Out), respetando el orden de llegada de los estudiantes.
- Operaciones principales:
enqueue(T dato): Inserción al final en tiempo constante O(1).dequeue(): Extracción del frente en tiempo constante O(1).peek(): Consulta del frente sin extraer en tiempo constante O(1).size(): Retorna el número de elementos recorriendo la cola en tiempo O(n).
Implementada con nodos enlazados utilizando una referencia fija al tope (top). Administra el historial de transacciones en orden LIFO (Last-In, First-Out), permitiendo auditar las últimas operaciones realizadas en el sistema.
- Operaciones principales:
push(T dato): Apilar al tope en tiempo constante O(1).pop(): Desapilar del tope en tiempo constante O(1).peek(): Inspeccionar el tope en tiempo constante O(1).
Para compilar y ejecutar de forma correcta la aplicación QuickLibrary, el entorno de desarrollo debe contar con:
- Java Development Kit (JDK): Versión 8 o superior instalado y configurado en las variables de entorno (
JAVA_HOME). - Entorno de Desarrollo (IDE): Visual Studio Code (con la extensión Extension Pack for Java), Eclipse, NetBeans o IntelliJ IDEA.
- Archivo de Datos Iniciales: El archivo
libros.csvdebe estar obligatoriamente ubicado en la raíz del proyecto para realizar la carga masiva automatizada al iniciar.
- Clonar o Descargar el Repositorio:
git clone [https://github.com/usuario/QuickLibrary.git](https://github.com/usuario/QuickLibrary.git)
- Abrir el Proyecto: Iniciar su IDE de preferencia y seleccionar la carpeta raíz
QuickLibrary. - Verificar Persistencia: Asegúrese de que el archivo
libros.csvcontenga registros válidos estructurados de la siguiente forma:codigo,titulo,autor,categoria,anio,estado 101,Harry Potter y la Piedra Filosofal,J.K. Rowling,Fantasia,1997,Disponible
- Ejecutar: Localice el archivo
Vista.javadentro del paqueteVista, haga clic derecho y seleccione la opción Run (Ejecutar).
Al iniciar el programa, se leerá el archivo CSV y se desplegará el siguiente menú interactivo. Digite el número de la opción deseada y presione Enter.
==== QUICKLIBRARY =====
1. Registrar solicitud de préstamo
2. Mostrar cola de solicitudes
3. Atender siguiente solicitud de préstamo
4. Registrar devolución de libro
5. Mostrar reporte básico
6. Mostrar historial de transacciones
7. Registrar libro
8. Mostrar catálogo de libros
9. Buscar libro
10. Modificar libro
11. Eliminar libro
12. Salir
Seleccione una opción:
-
Paso 1: Consultar el catálogo inicial (Opción 8) Muestra todos los libros cargados desde el archivo CSV ordenados de menor a mayor código a través del recorrido Inorden del Árbol Binario. Ejemplo de salida:
CATÁLOGO DE LIBROS: Código: 101 | Título: Harry Potter y la Piedra Filosofal | Autor: J.K. Rowling | Categoría: Fantasia | Año: 1997 | Estado: Disponible Código: 102 | Título: Harry Potter y la Cámara Secreta | Autor: J.K. Rowling | Categoría: Fantasia | Año: 1998 | Estado: Disponible -
Paso 2: Registrar una solicitud de préstamo (Opción 1) Agrega a un estudiante a la cola de espera para un libro en específico. Entrada:
Ingrese código del estudiante: EST2026 Ingrese nombre del estudiante: Carlos Mendoza Ingrese código del libro solicitado: 101Salida:
Solicitud registrada correctamente. -
Paso 3: Ver la cola de espera (Opción 2) Muestra de forma lineal todas las solicitudes pendientes por atender en el estricto orden de registro. Salida:
======= COLA DE SOLICITUDES ======= 1. Estudiante: Carlos Mendoza | Código: EST2026 | Libro: 101 | Fecha: 30/06/2026 12:00 Total en cola: 1 =================================== -
Paso 4: Atender la solicitud (Opción 3) El sistema extrae de forma automática la primera solicitud de la cola empleando el método
dequeue(). Busca el libro en el árbol (search) y, si estáDisponible, cambia su estado aPrestado. Salida:Préstamo realizado correctamente.Nota: Si intenta atender la solicitud y el libro ya está "Prestado" o no existe, el sistema denegará el préstamo y guardará el fallo en el historial. -
Paso 5: Registrar la devolución de un libro (Opción 4) Cambia el estado de un libro de "Prestado" a "Disponible" para que pueda ser solicitado nuevamente. Entrada:
Ingrese el código del libro a devolver: 101Salida:
Devolución registrada correctamente. -
Paso 6: Buscar Libros con Filtros Avanzados (Opción 9) Permite realizar búsquedas exactas o parciales divididas en sub-métodos:
- Por Código: Utiliza la eficiencia O(log n) del árbol binario.
- Por Título / Autor / Categoría: Convierte temporalmente el árbol en un arreglo de objetos nativos (
toArray()) para realizar búsquedas avanzadas que ignoren mayúsculas y minúsculas.
-
Paso 7: Consultar Reportes Estadísticos e Historial (Opciones 5 y 6) La Opción 5 genera un reporte cuantitativo en tiempo real basado en la cantidad de nodos y el filtrado por estados. La Opción 6 recorre la Pila de transacciones mostrando de manera inversa (desde la más reciente hasta la más antigua) todas las actividades ejecutadas en el sistema.
Este proyecto está bajo la Licencia Apache 2.0. Consulte el archivo LICENSE en la raíz de este repositorio para conocer los términos y condiciones detallados de uso, reproducción y distribución.