Curso de Java: solución al ejercicio de ArrayList y pilas de datos

Escrito por Adrián Crespo
Java
1

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.


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;
 }
 }

}


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();
 }
}


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;
 }

}


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);

 }
}

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


public E getFirst();

public E removeFirst();

public void addFirst(E o);

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.


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();

}

}

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.


Continúa leyendo
  • Juan

    Muchisimas gracias por seguir con el curso de Java adelante, yo hace un par de días que empece y estoy aprendiendo muy rápido. Espero que sigais así. Ahora voy a empezar con la herencia y el polimorfismo. Espero ponerme al día en un par de meses como mucho.
    Gracias de nuevo.