Examen Práctico – Clase PedidoController


Descripción

En un sistema de gestión logística de comercio electrónico, es crucial poder filtrar, organizar y priorizar pedidos en función de características operativas como su zona de entrega y su nivel de urgencia. El método filtrarPorZona permite aislar pedidos que deben entregarse en zonas geográficas específicas, lo cual es útil para la optimización de rutas y asignación de recursos de transporte. Posteriormente, ordenarPorZona organiza dichos pedidos para facilitar la planificación de entregas, priorizando aquellas zonas con mayor código numérico. Por otro lado, agruparPorUrgencia permite identificar rápidamente grupos de pedidos con niveles similares de prioridad de entrega, y explotarGrupo se encarga de aislar de manera eficiente el conjunto de mayor urgencia, lo que resulta clave para cumplir con compromisos de entrega rápida y satisfacción del cliente. Estas operaciones están encadenadas lógicamente para simular procesos reales de análisis en centros de distribución.

Objetivo

Desarrollar una clase PedidoController que gestione objetos de tipo Pedido con uso de estructuras de datos como Stack, Queue, TreeSet y TreeMap, aplicando razonamiento lógico, campos calculados y métodos encadenados.

alt text

Modelo: Pedido

Cada objeto Pedido posee los siguientes atributos:

Además, contiene dos campos calculados:

// La zona se calcula con split: split("-"); // Ejemplo: "28045-301" -> zona: 301

Ejemplo de cálculo de urgencia:

Pedido 1:

Pedido 2:


Clase a implementar: PedidoController

Método A – filtrarPorZona(List<Pedido> pedidos, int umbral)

Ejemplo:

Entrada: - Pedido(cliente="Ana", codigoPostal="28045-150", prioridades=[3,6]) → zona=150 - Pedido(cliente="Luis", codigoPostal="28045-200", prioridades=[9]) → zona=200 - Pedido(cliente="Maria", codigoPostal="28045-100", prioridades=[12]) → zona=100 - Pedido(cliente="Pedro", codigoPostal="28045-250", prioridades=[6]) → zona=250 umbral = 150 Salida (Stack): [Pedro(zona=250), Luis(zona=200)]

Método B – ordenarPorZona(Stack<Pedido> pila)

Ejemplo:

Entrada (Stack): [Pedro(zona=250), Luis(zona=200)] Salida (TreeSet ordenado): [Pedro(zona=250), Luis(zona=200)]

Método C – agruparPorUrgencia(List<Pedido> pedidos)

Ejemplo:

Entrada: - Pedido(cliente="Ana", urgencia=30) - Pedido(cliente="Luis", urgencia=60) - Pedido(cliente="Maria", urgencia=30) - Pedido(cliente="Pedro", urgencia=45) Salida (TreeMap): { 30: Queue[Ana, Maria], 45: Queue[Pedro], 60: Queue[Luis] }

Método D – explotarGrupo(Map<Integer, Queue<Pedido>> mapa)

Ejemplo:

Entrada (TreeMap): { 30: Queue[Ana, Maria], ← 2 pedidos 45: Queue[Pedro], ← 1 pedido 60: Queue[Luis] ← 1 pedido } Salida (Stack): [Maria, Ana] ← Grupo de urgencia=30 porque tiene más pedidos (2)

Implementación y validación

Para validar tu implementación se ejecutarán pruebas unitarias sobre:


RÚBRICA DE EVALUACIÓN (9 puntos)

Componente Evaluado Descripción Puntos
Campo calculado: zona Extrae correctamente los últimos 3 dígitos del código postal 1.5
Campo calculado: urgencia Suma prioridades múltiplos de 3 y multiplica por vocales únicas del cliente (sin considerar mayúsculas) 1.5
Método A – filtrarPorZona Filtra correctamente y mantiene orden de entrada 1.5
Método B – ordenarPorZona Ordena por zona DESC, luego cliente ASC. Elimina duplicados por zona y cliente 1.5
Método C – agruparPorUrgencia Agrupa correctamente en TreeMap con Queue por urgencia 1.5
Método D – explotarGrupo Identifica correctamente el grupo más numeroso y, en caso de empate, el de mayor urgencia. Invierte orden a LIFO 1.5
Total 9.0

Estructura esperada

src/ ├── App.java ├── controllers/ │ └── PedidoController.java ├── models/ │ └── Pedido.java ├── test/ │ └── PedidoControllerTest.java └── validaciones/ └── ValidacionesPedido.java

Notas importantes