Curso de Java: Resolución del ejercicio de LinkedList

Escrito por Adrián Crespo
Java
2

Otro lunes más, seguimos en RedesZone.net con el curso de Java.

Continuamos con las estructuras de datos, en este caso con un ejercicio propuesto en la entrega anterior, relacionado con las LinkedList. Hoy también hablaremos de los ArrayList, y tendremos un ejemplo de lo mismo, a la vez que os propondremos un ejercicio para que practiquéis.

Lo primero de todo vamos a dar solución al ejercicio de la semana pasada que si acordáis, estaba relacionado con un taller de reparación de coches.

Vamos con la primera de las clases de nuestro ejercicio, la clase Reloj, que únicamente será la encargada de proporcionarnos una fecha y una hora para las fichas de nuestros vehículos del taller.


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

Se trata de la misma implementación que en el ejemplo que o pusimos, por lo que podéis copiar y pegar tal cual está.

Ahora vamos con la primera de las clases que nos interesa, la clase FichaVehiculo. Se encargará de recoger todos los datos referidos a los vehículos que entre en el taller. Estará forma principalmente por observadores de atributos, que poseen visibilidad privada.

public class FichaVehiculo
{
 private long entrada, reparacion, salida;
 private String modelo;
 private String matricula;

/**Constructor*/
 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;
 }

}

Esta clase no tiene mayores complicaciones. Si se quiere, se pueden añadir más datos a tener en cuenta a la hora de registrar un vehículo, ya que esto, sólo se trata de un modelo básico.

Vamos con la clase GestionReparaciones, que implementará la gestión de vehículos de nuestro taller.


import java.util.*;
public class GestionReparaciones
{
 //Atributos
 private LinkedList<FichaVehiculo> lista = new LinkedList<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);//creamos un nuevo vehículo
 lista.add(fich);//añadimos
 }

 /**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())
 {

//condiciones que ha de cumplir(todas)
 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())
 {

//condiciones que ha de cumplir(todas)
 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.removeFirst();
 return true;
 }
 }

}

Se pueden añadir más métodos si queréis practicar, ya que yo sólo he implementado el funcionamiento básico descrito en el enunciado del ejercicio.

Y un pequeño programa de prueba para verificar que todo funciona bien.

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

 }
}

Hasta aquí la solución del ejercicio. Si habéis tenido algún problema, o duda de implementación, no dudéis en preguntarlo.

Vamos con el ejemplo de los ArrayList de Java. Vamos a hacer un ejemplo sencillo con la baraja española.


import java.util.*;
public class Baraja
{
 // constantes estáticas
private static String[] palo={"Bastos", "Copas", "Oros", "Espadas"};

 private static String[] carta={"As", "Dos", "Tres", "Cuatro", "Cinco","Seis", "Siete", "Sota", "Caballo","Rey"};

 // la baraja es una lista de cartas
 private ArrayList<String> mazo;

/**
 * Constructor de la baraja
 */
public Baraja()
{
 mazo= new ArrayList<String>(40);
 for (String p: palo) {
 for (String c: carta) {
 mazo.add(c+" de "+p);
 }
 }
 }

/**
 * Repartir num cartas
 */
 public List<String> repartir(int num)
{

int numCartas=mazo.size();
 List<String> vistaDeMano = mazo.subList(numCartas - num,numCartas);
 List<String> mano = new ArrayList<String>(vistaDeMano);
 vistaDeMano.clear();
 return mano;
 }
}

Como podéis ver la mecánica de programación es similar a la de las LinkedList.

Como el ejercicio anterior que os propusimos tiene mucho juego, os vamos a proponer que en vez de utilizar las LinkedList para su programación, lo implementéis utilizando los ArrayList. Y en la próxima entrega los corregiremos y hablaremos además de las Pilas de datos y sus funciones y como se pueden implementar.


Continúa leyendo
  • Domingo A.

    Hola, muy buen trabajo!!! Sencillo, directamente al grano y con muchos ejemplos. Genial!!!
    Solamente un comentario:
    Creo que hay dos errores en la clase FichaVehiculo (líneas 35 y 40) al asignar las fechas de salida y reparación. En ambos casos se han asignado al atributo privado “entrada” cuando deberían asignarse a los atributos “salida” y “reparacion” respectivamente.

    Saludos.

  • Cristian Montoya

    dijo que iba a crar tres listas, yo solo veo una, no?