Continuamos en el curso de Java de RedesZone.net con las estructuras de datos y sus utilizaciones.
En la entrega anterior hablamos sobre los ArrayList y os dimos un ejemplo de cómo podían ser utilizados, además de daros la solución del ejercicio que os propusimos haciendo uso de las LinkedList.
En esta entrega, además de daros la solución al ejercicio que os habíamos propuesto, que era sólo cambiar la implementación de LinkedList a ArrayList. También os explicaremos el uso que puede hacerse de las pilas de datos.
Vamos con la solución del ejercicio. Hay que decir que con respecto a la solución basada en una LinkedList, únicamente hay que cambiar la clase GestionReparaciones. Dependiendo los métodos que hayáis implementado, tendréis que cambiar o hacer modificaciones ya que algunas operaciones que posee el LinkedList, el ArrayList no las posee. A pesar de todo, os vuelvo a poner después de la clase GestionReparaciones, el resto de clases.
[java]
import java.util.*;
public class GestionReparaciones
{
//Atributos
private ArrayList<FichaVehiculo> lista = new ArrayList<FichaVehiculo>();
/**Metodo que añade un vehiculo para ser arreglado con una fecha
* de entrada
* @param nombre
* @param matricula
*/
public void anadeVehiculo(String nombre, String matricula)
{
long f= Reloj.ahora();
FichaVehiculo fich = new FichaVehiculo(nombre, matricula, f);
lista.add(fich);
}
/**Metodo que añade una fecha de reparacion a un vehiculo
*
* @param matricula
*/
public void reparado(String matricula)
{
boolean encontrado =false;
int i=0;
while(!encontrado && i<lista.size())
{
if(lista.get(i).matricula().equals(matricula) && lista.get(i).fechaReparacion()==0)
{
lista.get(i).modificaFechaReparacion(Reloj.ahora());
encontrado=true;
}else{
i++;
}
}
if(encontrado==true)
{
System.out.println("Fecha de reparación modificada correctamente");
}else{
System.out.println("Error al modificar la fecha de reparación del vehículo "+ matricula);
}
}
/**Metodo que añade una fecha de salida a un vehiculo
*
* @param matricula
*/
public void fechaSalidaTaller(String matricula)
{
boolean encontrado =false;
int i=0;
while(!encontrado && i<lista.size())
{
if(lista.get(i).matricula().equals(matricula) && lista.get(i).fechaSalida()==0 && lista.get(i).estaArreglado())
{
lista.get(i).modificaFechaSalida(Reloj.ahora());
encontrado=true;
}else{
i++;
}
}
if(encontrado==true)
{
System.out.println("Fecha de salida modificada correctamente");
}else{
System.out.println("Error al modificar la fecha de salida del vehículo "+ matricula);
}
}
/**Borramos la primera fiche de un vehiculo
*
* @return
*/
public boolean eliminarPrimerRegistro()
{
if(lista.isEmpty())
{
return false;
}else{
lista.remove(0);
return true;
}
}
}
[/java]
[java]
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();
}
}
[/java]
[java]
public class FichaVehiculo
{
private long entrada, reparacion, salida;
private String modelo;
private String matricula;
public FichaVehiculo(String m, String ma, long e)
{
modelo=m;
matricula=ma;
entrada=e;
reparacion=0;
salida=0;
}
public String matricula()
{
return matricula;
}
public String modelo()
{
return modelo;
}
public void modificaFechaEntrada(long fecha_entrada)
{
entrada=fecha_entrada;
}
public void modificaFechaSalida(long fecha_salida)
{
entrada=fecha_salida;
}
public void modificaFechaReparacion(long fecha_reparacion)
{
entrada=fecha_reparacion;
}
public boolean estaArreglado()
{
if(reparacion!=0)
{
return true;
}else{
return false;
}
}
/****************Observadores de las fechas de reparación y salida****/
public long fechaReparacion()
{
return reparacion;
}
public long fechaSalida()
{
return salida;
}
}
[/java]
[java]
public class Clase
{
public static void main (String[]args)
{
//Atributos
GestionReparaciones taller = new GestionReparaciones();
String matricula1="12345";
String modelo1="Leon";
String matricula2="54321";
String modelo2="Mondeo";
String matricula3="67890";
String modelo3="Laguna";
//Añado dos vehiculos al taller
taller.anadeVehiculo(modelo1, matricula1);
taller.anadeVehiculo(modelo2, matricula2);
//Voy a fijar una fecha de reparacion a un vehiculo que no existe en el taller, dara error
taller.reparado(matricula3);
//Este funcionara bien
taller.reparado(matricula1);
//Este dará error, no esta reparado, por lo que no puede salir, es una condicion que hemos puesto en el if
taller.fechaSalidaTaller(matricula2);
}
}
[/java]
En entregas posteriores explicaremos el por qué de que ambas implementaciones no tengan los mismos métodos.
Vamos ahora con la parte teórica del día de hoy, las pilas de datos.
Una pila (o stack) es una lista especial en la que todos los elementos se insertan o extraen por un extremo de la lista (LIFO)
La implementación:
- implementa estas operaciones eficientemente
- aprovecha las limitaciones para simplificar
Las colecciones Java no disponen de ninguna interfaz específica para las pilas. Como implementación puede usarse una LinkedList, pues dispone de operaciones para insertar y extraer elementos por un extremo
[java]
public E getFirst();
public E removeFirst();
public void addFirst(E o);
[/java]
Los dos primeros lanzan NoSuchElementException si la pila está vacía.
A continuación, la relación de los métodos:
Para que entendáis mejor, vamos a realizar la implementación de la pila.
[java]
import java.util.*;
public class PilaEnlazada<E> implements Pila<E>
{
// la pila
private LinkedList<E> p;
/**
* Constructor de la pila; la crea vacía
*/
public PilaEnlazada() {
p=new LinkedList<E>();
}</pre>
/**
* Añade un elemento a la pila
*/
public void apila(E e) {
p.addFirst(e);
}
/**
* Elimina y retorna un elemento de la pila
*/
public E desapila()
throws NoSuchElementException
{
return p.removeFirst();
}
/**
* Deja la pila vacía
*/
public void hazNula(){
p.clear();
}
/**
* Retorna el primer elemento
*/
public E cima()
throws NoSuchElementException
{
return p.getFirst();
}
/**
* Indica si la pila está vacía o no
*/
public boolean estaVacia() {
return p.isEmpty();
}
/**
* Retorna el número de elementos
*/
public int tamano(){
return p.size();
}
}
[/java]
Hasta aquí la entrega de hoy. En la próxima entrega veremos lo opuesto a las pilas de datos, las colas, así como un ejemplo. Además os propondremos un ejercicio relacionado con ambas.