Curso de Java. Ejemplos de LinkedList

Escrito por Adrián Crespo
Java
3

Volvemos otro lunes más con una entrega del curso de Java de RedesZone.net. La entrega anterior, nos ocupó la introducción a los ArrayList y los LinkedList, así como la explicación de que métodos poseían cada uno de ellos.

En la entrega de hoy, vamos a ver un ejemplo de utilización del LinkedList, para posteriormente plantear un ejercicio del mismo, del cual, daremos la solución la próxima semana.

Vamos por lo tanto con el primero de los ejemplos, en este caso, el de LinkedList.

La implementación de las colas en Java es la LinkedList, que implementa la interfaz Queue

  • Las operaciones de inserción y extracción son eficientes.

Puede ser conveniente hacer nuestra propia implementación para conseguir más sencillez y eficiencia.

Escribir una clase para controlar el acceso de clientes a un servicio.

  • Se guardará una cola de espera de clientes y otra cola de clientes ya atendidos.

Cada cliente tiene un nombre, un número de móvil.

  • Junto al cliente se guarda su fecha y hora de llegada, y su fecha y hora de atención.

Operaciones

  • añadir un cliente
  • atender a un cliente
  • obtener el tiempo medio de espera de los clientes que aún no han sido atendidos
  • obtener el tiempo medio de espera de los clientes ya atendidos
  • mostrar el estado de las colas

Escribir también un programa de prueba. Para la fecha y hora usar la clase predefinida Calendar.

Vamos a implementar la clase Reloj, que nos dará una medida para calcular el tiempo que tarda en ser atendido un paciente:


import java.util.Calendar;
/**
 * Clase que permite obtener la fecha y hora actual,
 * en milisegundos desde la época
 */
public class Reloj
{
 public static long ahora()
 {
 return Calendar.getInstance().getTimeInMillis();
 }
}

Ahora vamos a implementar la cola de espera, propiamente dicha:


import java.util.*;
public class ColaEspera {
 /** Clase interna para almacenar todos los
 * datos de un cliente
 */
 private static class DatosCliente {
 String nombre;
 long entrada, salida; // milisegundos
/** Constructor; pone la hora de entrada*/
 DatosCliente (Cliente c) {
this.c=c;
entrada=Reloj.ahora();
 }

void atiende() {
 salida=Reloj.ahora();
 }
 }
// colas del servicio
private Queue<DatosCliente> colaEspera;
 private Queue<DatosCliente> colaAtendidos;
 /**Constructor de ColaEspera */
public ColaEspera() {
 colaEspera=new LinkedList<DatosCliente>();
 colaAtendidos=new
 LinkedList<DatosCliente>();
 }

/**
 * Nuevo cliente; se mete en la cola de espera
 */
 public void nuevoCliente(Cliente c)
 {
 DatosCliente datos=new DatosCliente(c);
 colaEspera.add(datos);
 }

/**
 * Atender cliente: se saca de la cola de
 * espera y se mete en la de atendidos;
 * retorna el cliente atendido
 */
 public Cliente atenderCliente()
 throws NoSuchElementException
 {
 DatosCliente datos=colaEspera.remove();
 datos.atiende();
 colaAtendidos.add(datos);
 return datos.c;
 }

public double tiempoEsperaAtendidos()
 {
 long tiempo=0;
 int num=0;
 for (DatosCliente datos: colaAtendidos) {
 tiempo=tiempo+datos.salida-datos.entrada;
 num++;
 }
if (num==0) {
 return 0.0;
 } else {
 return (((double) tiempo)/num)/1000.0;
 }
 }
}

Como parte opcional, se puede hacer un programa principal que prueba el funcionamiento de esta cola, creando un main y añadiendo clientes y extrayéndolos, y comprobando el tiempo que ha tardado en ser atendido.

Como podéis ver el funcionamiento de las LinkedList es sencillo, y los métodos que hereda de la interfaz List nos facilitan muchos las cosas. Ahora vamos a proponeros un ejercicio ara que practiquéis.

Ejercicio

Se pide implementar una lista que gestione la lista de espera de un taller mecánico. El taller tendrá una lista de fichas de vehículos que serán dados de alta en el momento de su llegada al taller, donde se le asignará la hora de entrada. Una vez resuelto el problema del coche se le asignará una fecha de resolución de la avería y sólo cuando el técnico venga a buscarlo, se le dará una fecha de salida y el borrado de la lista de espera. Es recomendable crear tres listas, una para los no arreglados, otra para los arreglados y están pendientes de retirar.

Hasta aquí la entrega del curso de Java de hoy. La próxima entrega daremos solución a este ejercicio y os daremos un ejemplo de utilización de ArrayList así como su ejercicio opcional correspondiente.


Continúa leyendo
  • Jarod

    Tengo varios errores con el codigo que has puesto.
    El primero con el constructor DatosCliente que me pide otro nuevo con el parametro Cliente.
    El segundo que el codigo del metodo AtenderCliente esta repetido 2 veces.
    El tercero en el return de AtenderClientes me da un error con el “.c”.

  • Debes crear una clase Cliente para que funcione y compile. El código he corregido varias cosas que estaban mal, en concreto dos, una en el constructor de DatosCliente y otra, el método repetido que me has comentado y que ha sido un error mio al copiar y pegar del Eclipse.

    Mira haber si ahora te funciona. Con lo que sea me dices

  • Jarod

    He añadido despues de la linea 8 la linea siguiente : “Cliente c;” y ya no me da error respecto a lo tuyo. En la clase Cliente he puesto solo el nombre con su get y set.
    En Main no me ha quedado claro como hay que hacerlo pero he puesto esto :

    ColaEspera ce = new ColaEspera();
    Cliente cli1 = new Cliente();
    Cliente cli2 = new Cliente();
    String nombre1 = “Julian”;
    String nombre2 = “Ana”;
    cli1.setNombre(nombre1);
    ce.nuevoCliente(cli1);
    Cliente cliente1 = ce.atenderCliente();
    System.out.println(cliente1.getNombre());
    System.out.println(ce.tiempoEsperaAtendidos());
    cli2.setNombre(nombre2);
    ce.nuevoCliente(cli2);
    Cliente cliente2 = ce.atenderCliente();
    System.out.println(cliente2.getNombre());
    System.out.println(ce.tiempoEsperaAtendidos());

  • Pingback: Curso de Java: colas de prioridad()