V2#
Problema 2: Gestión de Turnos en una Clínica#
La clínica «Salud Total» utiliza un sistema para gestionar los turnos de los pacientes. Los pacientes son atendidos en el orden en que llegan, excepto en casos de emergencia los cuales no tendremos en cuenta. Los pacientes están representados por una clase llamada Pacientes, que tiene 6 atributos que describen la información relevante de cada paciente (nombre, edad, número de paciente, triage, categoria, y otro que se inventen). Al llegar, los pacientes son añadidos a una estructura de datos.
Acciones:
Los siguientes pacientes llegan a la clínica en este orden:
Paciente 1: Ana Torres
Paciente 2: Carlos García
Paciente 3: Laura Pérez
Luego llega un paciente más pero antes se atiende otro:
Paciente 4: José Martínez, emergencia
El sistema atiende a dos pacientes.
A continuación, llegan dos pacientes más:
Paciente 5: María López, consulta regular
Paciente 6: Juan Morales, consulta regular
Se atiende a otros dos paciente y después llega otro:
Paciente 7: Diana Sánchez, emergencia
Finalmente, se atienden un paciente pacientes más.
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;
public class Fila<T> implements Queue<T> {
private LinkedList<T> elementos;
public Fila() {
elementos = new LinkedList<>();
}
@Override
public boolean add(T e) {
return elementos.add(e); // Agrega un elemento al final de la cola
}
@Override
public boolean offer(T e) {
return elementos.add(e); // Similar a add, pero no lanza una excepción si falla
}
@Override
public T remove() {
if (elementos.isEmpty()) {
throw new NoSuchElementException("La cola está vacía");
}
return elementos.removeFirst(); // Remueve el primer elemento de la cola
}
@Override
public T poll() {
return elementos.isEmpty() ? null : elementos.removeFirst(); // Devuelve y remueve el primer elemento o null si está vacía
}
@Override
public T element() {
if (elementos.isEmpty()) {
throw new NoSuchElementException("La cola está vacía");
}
return elementos.getFirst(); // Devuelve el primer elemento sin removerlo
}
@Override
public T peek() {
return elementos.isEmpty() ? null : elementos.getFirst(); // Devuelve el primer elemento o null si está vacía
}
@Override
public int size() {
return elementos.size(); // Devuelve el tamaño de la cola
}
@Override
public boolean isEmpty() {
return elementos.isEmpty(); // Verifica si la cola está vacía
}
@Override
public boolean contains(Object o) {
return elementos.contains(o); // Verifica si la cola contiene el elemento
}
@Override
public Iterator<T> iterator() {
return elementos.iterator(); // Devuelve un iterador para recorrer los elementos de la cola
}
@Override
public Object[] toArray() {
return elementos.toArray(); // Convierte la cola a un array de objetos
}
@Override
public <U> U[] toArray(U[] a) {
return elementos.toArray(a); // Convierte la cola a un array de un tipo específico
}
@Override
public boolean remove(Object o) {
return elementos.remove(o); // Remueve un objeto de la cola
}
@Override
public boolean containsAll(Collection<?> c) {
return elementos.containsAll(c); // Verifica si la cola contiene todos los elementos de la colección dada
}
@Override
public boolean addAll(Collection<? extends T> c) {
return elementos.addAll(c); // Agrega todos los elementos de la colección dada a la cola
}
@Override
public boolean removeAll(Collection<?> c) {
return elementos.removeAll(c); // Remueve todos los elementos de la colección dada de la cola
}
@Override
public boolean retainAll(Collection<?> c) {
return elementos.retainAll(c); // Retiene solo los elementos presentes en la colección dada
}
@Override
public void clear() {
elementos.clear(); // Limpia todos los elementos de la cola
}
@Override
public String toString() {
return elementos.toString(); // Convierte la lista de elementos a una cadena y la devuelve
}
}
public class Paciente{
String nombre;
Integer edad;
Integer no_paciente;
Integer triage;
String categoria;
boolean viene_solo;
public Paciente(String nombre, Integer edad, Integer no_paciente, Integer triage, String categoria, boolean viene_solo){
this.nombre = nombre;
this.edad = edad;
this.no_paciente = no_paciente;
this.triage = triage;
this.categoria = categoria;
this.viene_solo = viene_solo;
}
@Override
public String toString(){
return "\n Nombre: "+nombre+". Edad: "+edad+". Número paciente: "+no_paciente+". Categoria: "+categoria+". Viene solo: "+viene_solo+".";
}
}
public class SegundoPunto{
public static void main(String[] args){
Fila<Paciente> pacientes = new Fila<>();
// 1
pacientes.offer(new Paciente("Ana Torres", 27, 1, 1, "A", true));
pacientes.offer(new Paciente("Carlos Garcia", 17, 2, 1, "A", false));
pacientes.offer(new Paciente("Laura Perez", 15, 1, 3, "B", true));
System.out.println("Punto 1:\n"+pacientes);
// 2
pacientes.poll();
pacientes.offer(new Paciente("Jose Martinez", 54, 4, 1, "C", false));
System.out.println("Punto 2:\n"+pacientes);
// 3
pacientes.poll();
pacientes.poll();
System.out.println("Punto 3:\n"+pacientes);
// 4
pacientes.offer(new Paciente("María López", 8, 5, 1, "C", true));
pacientes.offer(new Paciente("Juan Morales", 27, 6, 1, "B", true));
System.out.println("Punto 4:\n"+pacientes);
// 5
pacientes.poll();
pacientes.poll();
pacientes.offer(new Paciente("Diana Sánchez", 30, 7, 1, "B", true));
System.out.println("Punto 5:\n"+pacientes);
// 6
pacientes.poll();
System.out.println("Punto 5:\n"+pacientes);
System.out.println("\nFinal del problema:\n"+pacientes);
}
}
new SegundoPunto().main(null);
Punto 1:
[
Nombre: Ana Torres. Edad: 27. Número paciente: 1. Categoria: A. Viene solo: true.,
Nombre: Carlos Garcia. Edad: 17. Número paciente: 2. Categoria: A. Viene solo: false.,
Nombre: Laura Perez. Edad: 15. Número paciente: 1. Categoria: B. Viene solo: true.]
Punto 2:
[
Nombre: Carlos Garcia. Edad: 17. Número paciente: 2. Categoria: A. Viene solo: false.,
Nombre: Laura Perez. Edad: 15. Número paciente: 1. Categoria: B. Viene solo: true.,
Nombre: Jose Martinez. Edad: 54. Número paciente: 4. Categoria: C. Viene solo: false.]
Punto 3:
[
Nombre: Jose Martinez. Edad: 54. Número paciente: 4. Categoria: C. Viene solo: false.]
Punto 4:
[
Nombre: Jose Martinez. Edad: 54. Número paciente: 4. Categoria: C. Viene solo: false.,
Nombre: María López. Edad: 8. Número paciente: 5. Categoria: C. Viene solo: true.,
Nombre: Juan Morales. Edad: 27. Número paciente: 6. Categoria: B. Viene solo: true.]
Punto 5:
[
Nombre: Juan Morales. Edad: 27. Número paciente: 6. Categoria: B. Viene solo: true.,
Nombre: Diana Sánchez. Edad: 30. Número paciente: 7. Categoria: B. Viene solo: true.]
Punto 5:
[
Nombre: Diana Sánchez. Edad: 30. Número paciente: 7. Categoria: B. Viene solo: true.]
Final del problema:
[
Nombre: Diana Sánchez. Edad: 30. Número paciente: 7. Categoria: B. Viene solo: true.]
Preguntas:
¿Qué estructura de datos usarías para gestionar los turnos de los pacientes?
RTA: Como los pacientes son atendidos en el orden que llegan, FIFO, se utiliza una estructura de datos tipo cola/fila.
¿La estructura de datos queda vacía?
RTA: No, quedan tres páginas en ella.
Explica el proceso que seguirías para atender a los pacientes en el orden adecuado utilizando la estructura de datos apropiada para los pacientes.
RTA: Cada vez que un paciente llega es colocado en la cola y cuando son atendidos se retiran de la cola.
Si existiesen pacientes de emergencia, ¿Cómo se podrían gestionar estos tipos de usuarios?
RTA: Colocando una pila que se organice por prioridad, dando una prioridad alta para los pacientes de emergencia y una prioridad baja para los pacientes regulares, o agregando la opción de que la pila se pueda llenar desde la cola (sin embargo, esta opción dañaria la estructura). Otra posible opción es haciendo una copia de la pila, más un elemento, y agregando el elemento en la base.
Consideraciones Adicionales#
Problema 1 (Navegación Web): Asegúrate de describir los momentos en que las páginas se agregan o eliminan. Analiza lo que sucede cuando el usuario retrocede y luego visita una nueva página, y cómo afecta eso a la estructura de datos seleccionada de páginas siguientes.
Problema 2 (Turnos en Clínica): Los pacientes deben ser gestionados en una estructura de datos apropiada, pero los casos de emergencia requieren un manejo especial. Explica cómo asegurarte de que el orden de llegada no se vea afectado por las emergencias, y cómo se continúa el proceso de atención luego de atender un caso urgente.