From 02e889ae74a09aebbbea156f7ab500b631c96a95 Mon Sep 17 00:00:00 2001
From: Javier Calvo <javiercalvoporro@gmail.com>
Date: Wed, 4 Dec 2024 02:45:35 +0100
Subject: [PATCH] Muelle casi arreglado. Falta mejoras
---
src/es/markse/Muelle.java | 289 ++++++++++++++------------------------
src/es/markse/Puerto.java | 16 +--
2 files changed, 110 insertions(+), 195 deletions(-)
diff --git a/src/es/markse/Muelle.java b/src/es/markse/Muelle.java
index 74ed1c3..c8e01da 100644
--- a/src/es/markse/Muelle.java
+++ b/src/es/markse/Muelle.java
@@ -5,6 +5,7 @@
package es.markse;
import java.util.ArrayList;
import java.util.List;
+import java.util.regex.Pattern;
import es.uva.inf.poo.maps.GPSCoordinate;
@@ -14,17 +15,18 @@ import es.uva.inf.poo.maps.GPSCoordinate;
* @author victorm
*/
public class Muelle {
- private Plaza[] plazas;
- private String identificador;
- private boolean operativo;
- private GPSCoordinate cord;
- private int plazasVacias;
- private int plazasLlenas = 0;
- private int plazasSemillenas = 0;
+ private final Plaza[] plazas;
+ private final String identificador;
+ private enum estado{
+ OPERATIVO, FUERA_DE_SERVICIO
+ }
+ private estado estadoActual;
+ private final GPSCoordinate cord;
+ private final Pattern IDENTIFICADOR_REGUEX = Pattern.compile("^\\d{2}$");
private static class Plaza {
private int altura;
- private List<Contenedor> contenedores = new ArrayList<>();
+ private final List<Contenedor> contenedores = new ArrayList<>();
/**
* Constructor del objeto Plaza
@@ -40,7 +42,7 @@ public class Muelle {
* @return true si contiene ese contenedor en la Plaza o false si no lo tiene
*/
public boolean contieneContenedor(String codigo) {
- return this.contenedores.stream().anyMatch(c -> c.getCodigo().equals(codigo));
+ return (this.nivelContenedor(codigo)!=-1) ? true : false;
}
/**
@@ -57,7 +59,6 @@ public class Muelle {
return -1;
}
-
/**
*Metodo que sirve para colar el contenedor en una plaza (apilarlo si esppsible)
* @param codigo: Codigo del contenedor
@@ -117,6 +118,22 @@ public class Muelle {
public int altura() {
return this.altura;
}
+
+ /**
+ * Metodo que devuelve si una plaza esta vacia o no
+ * @return true si esta vacia o false si no lo esta
+ */
+ public boolean plazaVacia() {
+ return (this.contenedores.size() == 0) ? true : false;
+ }
+
+ /**
+ * Metodo que devuelve si una plaza esta llena o no
+ * @return true si la plaza esta llena o si no lo esta
+ */
+ public boolean plazaLlena() {
+ return (this.contenedores.size() == this.altura || this.ultimoContenedor().tieneTecho()) ? true : false;
+ }
}
/**
@@ -127,14 +144,19 @@ public class Muelle {
* @param plazas Numero de plazas totales que tiene el Muelle
* @param altura numero maximo de contenedores que se pueden apilar encima de otro
*/
+ //CHANGE BOOLEAN OPERATIVO FOR AN STATE OF ESTADO
public Muelle (String identificador, GPSCoordinate cord, boolean operativo, int plazas, int altura) {
- comprobarValoresNulos(identificador, cord);
- comprobarValoresMuelle(identificador, plazas, altura);
+ if(!comprobarValoresNulos(identificador, cord))
+ throw new IllegalArgumentException("Los valores del identificador y coordenada no pueden ser nulos");
+ if(!comprobarTamanyoAlturaPlazas(plazas, altura))
+ throw new IllegalArgumentException("Los tamaños (altura y plaza) no puedne ser menores a 1");
+ if (!comprobarIdentificador(identificador))
+ throw new IllegalArgumentException("El formato del identificador es incorrecto");
+
this.identificador = identificador;
this.cord = cord;
- this.plazasVacias = plazas;
this.plazas = new Plaza[plazas];
- this.operativo = operativo;
+ this.estadoActual = operativo ? estado.OPERATIVO : estado.FUERA_DE_SERVICIO;
//Inicializamos el array de las plazas
for (int i = 0; i < plazas; i++) {
@@ -144,64 +166,38 @@ public class Muelle {
}
/**
- * Metodo para comporbar que los valores no sean nulos a la hora de crear un Objeto de tipo Muelle
+ * Metodo para comporbar que los valores no sean nulos
* @param identificador Identificador del muelle
* @param cord Coordenadas de muelle (clase GPSCoordinate)
- * @throws IllegalArgumentException si el identificador o la coordenada son nulos
+ * @return true si los valores son nulos o false si no lo son
*/
- private void comprobarValoresNulos(String identificador, GPSCoordinate cord) {
- if (identificador == null) throw new IllegalArgumentException("Identificador no puede ser nulo");
- if (cord == null) throw new IllegalArgumentException("Identificador no puede ser nulo");
+ private boolean comprobarValoresNulos(String identificador, GPSCoordinate cord) {
+ if (identificador == null || cord == null) return true;
+ else return false;
}
/**
- * Metodo que comprueba si el identificador es correcto (2 digitos)
- * @param identificador identificador del muelle
- * @throws IllegalArgumentException si la altura o la plaza son menores que 1, o si el identificador
- * no es correcto
+ * Metodo que sirve para comprobar si son correctas el tamaño de las plazas
+ * @param plazas El numero de plazas del muelle
+ * @param altura El tamaño de la altura del muelle
+ * @return true si el tamaño es correcto, false si no lo es
*/
- private void comprobarValoresMuelle(String identificador, int plazas, int altura) {
- if (plazas<1) throw new IllegalArgumentException("Numero de plazas debe ser 1 o mas");
- if (altura<1) throw new IllegalArgumentException("La altura debe ser 1 o mayor");
- if (identificador.length() != 2 || !identificador.matches("\\d{2}")) {
- throw new IllegalArgumentException("Formato incorrecto. Debe ser un entero de 2 dígitos numéricos (por ejemplo, 04, 15, 65)");
- }
+ private boolean comprobarTamanyoAlturaPlazas (int plazas, int altura) {
+ return (plazas<1 || altura <1)? false : true;
}
/**
- * Metodo que sirve para si un codigo de contenedor es correcto
- * @param codigo Codigo del contenedor que se comprueba
- * @throws IllegalArgumentException si el codigo es nulo o no corresponde a un codigo correcto
- */
- private void comprobarCodigoContenedor(String codigo) {
- if (codigo == null) throw new IllegalArgumentException("Codigo no puede ser nulo");
- if (!codigo.matches("[A-Z]{4}\\d{7}")) throw new IllegalArgumentException("El codigo no pertenece a un codigo de contenedor");
- }
-
- /**
- * Metodo que devuelve el identificador de un muelle. Este identificador sera de 2 digitos.
- * @return identificador del muelle
- */
- public String getIdentificador() {
- return this.identificador;
- }
-
- /**
- * Metodo que indica si el Muelle esta operativo o no
- * @return Si esta operativo (true) o no (false)
+ * Metodo que comprueba si el identificador es correcto
+ * @param identificador Identificador del muelle
+ * @return true si es correcto o false si no lo es
*/
- public boolean estaOperativo() {
- return this.operativo;
+ private boolean comprobarIdentificador(String identificador) {
+ return (IDENTIFICADOR_REGUEX.matcher(identificador).matches()) ? true : false;
}
- /**
- * Metodo que devuelve el punto de coordenadas del muelle
- * Este punto pertenece a la clase GPSCoordinate
- * @return coordenadas del muelle;
- */
- public GPSCoordinate getGPSCoordinate() {
- return this.cord;
- }
+ /***************************************
+ * EMPLEACION DE LOS METODOS QUE PIDEN *
+ ****************************************/
/**
* 1.1.7 Metodo que devuelve el numero de plazas totales que tiene el muelle
@@ -217,26 +213,35 @@ public class Muelle {
* @return numero de plazas vacias.
*/
public int plazasVacias() {
- return this.plazasVacias;
+ int c = 0;
+ for (Plaza p : this.plazas)
+ if(p.plazaVacia()) c++;
+ return c;
}
/**
* 1.1.8 Metodo que devuelve el numero de plazas llenas. Una plaza llena es la que:
* - Se encuentran con el numero máximo de contenedores apilados en la plaza
* - El contenedor o el ultimo contenedor apilado no tiene techo, lo que no se peden colocar más.
- * @return plazasLlenas
+ * @return numero de plazas llenas
*/
public int plazasLlenas() {
- return this.plazasLlenas;
+ int c = 0;
+ for (Plaza p: this.plazas)
+ if (p.plazaLlena()) c++;
+ return c;
}
/**
* 1.1.8 Metodo que devuelve el numero de plazas semillenas. Las plazas semillenas son aquellas que
* contienen un contenedor y se puede apilar mas encima de el (tiene techo)
- * @return plazasSemillenas
+ * @return numero de plazas semillenas
*/
public int plazasSemillenas() {
- return this.plazasSemillenas;
+ int c = 0;
+ for (Plaza p: this.plazas)
+ if (!p.plazaLlena() && !p.plazaVacia()) c++;
+ return c;
}
/**
@@ -292,14 +297,9 @@ public class Muelle {
throw new IllegalArgumentException("El Contenedor esta en transito, no se puede colocar");
}
- Contenedor ultimo = this.plazas[plaza].ultimoContenedor();
// Verificar si hay un último contenedor y si tiene techo
- boolean teniaTecho = (ultimo != null && ultimo.tieneTecho());
if (this.plazas[plaza].colocarContenedor(contenedor)) {
contenedor.cambiarEstadoApilado();
- int plazasDespues = this.plazas[plaza].numeroContenedores();
- int plazasAntes = plazasDespues - 1;
- this.actualizarPlazas(plazasAntes, plazasDespues, this.plazas[plaza], teniaTecho);
}
else {
if (!this.plazas[plaza].ultimoContenedor().tieneTecho())
@@ -314,7 +314,6 @@ public class Muelle {
* @throws IllegalArgumentException si el contenedor es nulo, si no se encuentra apilado en ningun sitio o
* si el contenedor no se encuentra en la ultima posicion (no se podria desapilar)
*/
-
public void sacarContenedorDePlaza(Contenedor contenedor) {
if (contenedor == null) throw new IllegalArgumentException("El Ccontenedor no puede ser nulo");
if (!contenedor.estadoApilado()) throw new IllegalArgumentException("El Contenedor no esta en ninguna plaza. Se encuentra en transito o en recogida");
@@ -322,12 +321,8 @@ public class Muelle {
for (Plaza plaza : this.plazas) {
if (plaza.contieneContenedor(contenedor.getCodigo())) {
if (plaza.estaEnUltimoNivel(contenedor.getCodigo())) {
- int plazasAntes = plaza.numeroContenedores();
- boolean teniaTecho = plaza.ultimoContenedor().tieneTecho();
plaza.desapilarContenedor();
contenedor.cambiarEstadoDesapilado();
- int plazasDespues = plaza.numeroContenedores();
- this.actualizarPlazas(plazasAntes, plazasDespues, plaza, teniaTecho);
}
else {
throw new IllegalArgumentException("El Contenedor No esta en el ultimo nivel");
@@ -337,123 +332,45 @@ public class Muelle {
}
/**
- * Metodo que cambia el techo a un contenedor comprobando que este sea el ultimo de la plaza para evitar
- * problemas, ya que no se puede cambiar el techo a un contenedor que tenga apilado otro encima
- * @param contenedor Contenedor que se cambia el techo
- * @throws IllegalArgumentException si el contenedero es nulo, si el contenedor no se encuentra en la ultima
- * plaza (no se puede cambiar el techo) o si el contenedor no se encuentra en el muelle
+ * Metodo para alternar si esta operativo o no (Test)
*/
- public void alternarTechoContenedor(Contenedor contenedor) {
- if (contenedor == null) throw new IllegalArgumentException("El contenedor no puede ser nulo");
- String codigo = contenedor.getCodigo();
- boolean encontrado = false;
- for (Plaza plaza: this.plazas) {
- if (plaza.contieneContenedor(codigo)) {
- encontrado = true;
- //Si el contenedor esta en el ultimo nivel de una plaza se puede cambiar el techo
- if (plaza.estaEnUltimoNivel(codigo)) {
- plaza.ultimoContenedor().alternarTecho();
- //Si la cantidad de contenedores es menor a la altura, hay cambios en el numero de plazas
- if (plaza.numeroContenedores() < plaza.altura()) {
- //Si ahora tiene techo, las llenas son uno mas y semillenas uno menos
- if (plaza.ultimoContenedor().tieneTecho()) {
- this.plazasLlenas--;
- this.plazasSemillenas++;
- }
- //Si ahora no lo tiene, las llenas son una mas y semillenas uno menos
- else {
- this.plazasLlenas++;
- this.plazasSemillenas--;
- }
- }
- }
- //No se encuentra en la ultima plaza
- else {
- throw new IllegalArgumentException("El contenedor no esta en la ultima plaza (no se puede cambiar el techo");
- }
- }
- }
- if(!encontrado) throw new IllegalArgumentException("No se en cuentra el contenedor");
+ public void alternarOperativo() {
+ this.estadoActual = (this.estadoActual == estado.OPERATIVO) ? estado.FUERA_DE_SERVICIO : estado.OPERATIVO;
+ }
+
+ /**
+ * Metodo que sirve para si un codigo de contenedor es correcto
+ * @param codigo Codigo del contenedor que se comprueba
+ * @throws IllegalArgumentException si el codigo es nulo o no corresponde a un codigo correcto
+ */
+ private void comprobarCodigoContenedor(String codigo) {
+ if (codigo == null) throw new IllegalArgumentException("Codigo no puede ser nulo");
+ if (!codigo.matches("[A-Z]{4}\\d{7}")) throw new IllegalArgumentException("El codigo no pertenece a un codigo de contenedor");
}
/**
- * Metodo para alternar si esta operativo o no (Test)
+ * Metodo que devuelve el identificador de un muelle. Este identificador sera de 2 digitos.
+ * @return identificador del muelle
*/
- public void alternarOperativo() {
- this.operativo = !this.operativo;
- }
+ public String getIdentificador() {
+ return this.identificador;
+ }
/**
- * Metodo que actualiza el numero de plazas (vacias, llenas, semillenas) al añadir o eliminar un contenedor
- * @param plazasAntes El numero de plazas antes de añadir o eliminar un contenedor
- * @param plazasDespues El numero despues
- * @param plaza La plaza donde se ha realizado una de esas 2 acciones (eliminar/añadir)
+ * Metodo que indica si el Muelle esta operativo o no
+ * @return Si esta operativo (true) o no (false)
*/
- private void actualizarPlazas(int plazasAntes, int plazasDespues, Plaza plaza, boolean teniaTecho) {
- int alturaMaxima = plaza.altura();
- boolean esVacio = plazasDespues == 0;
- boolean esPrimerContenedor = plazasDespues == 1;
- boolean esPenultimoContenedor = plazasDespues == (alturaMaxima - 1);
- boolean esLleno = plazasDespues == alturaMaxima;
-
- // Eliminación de contenedor
- if (plazasDespues < plazasAntes) {
- //Plaza queda vacia
- if (esVacio) {
- if (alturaMaxima == 1 || !teniaTecho) {
- this.plazasLlenas--;
- this.plazasVacias++;
- }
- else {
- this.plazasSemillenas--;
- this.plazasVacias++;
- }
- }
- //Se queda con el penultimo contenedor
- else if (esPenultimoContenedor) {
- this.plazasLlenas--;
- this.plazasSemillenas++;
- }
-
- //Se elimina un contenedor que no sea ni el primero ni el ultimo
- else {
- //Si el contenedor eliminado tenia no techo Llenas a Semillenas
- if (!teniaTecho) {
- this.plazasLlenas--;
- this.plazasSemillenas++;
- }
- }
-
- }
- // Adición de contenedor
- else {
- //Si coloca el ultimo contenedor
- if (esLleno) {
- if (alturaMaxima == 1) {
- plazasVacias--;
- plazasLlenas++;
- }
- else {
- plazasSemillenas--;
- plazasLlenas++;
- }
- }
- //Si coloca el primer contenedor
- else if (esPrimerContenedor) {
- if (plaza.ultimoContenedor().tieneTecho()) {
- plazasVacias--;
- plazasSemillenas++;
- }
- else {
- plazasVacias--;
- plazasLlenas++;
- }
- }
- //Resto de contenedores sin ser el primero ni el ultimo
- else if (!plaza.ultimoContenedor().tieneTecho()) {
- plazasSemillenas--;
- plazasLlenas++;
- }
- }
- }
-}
\ No newline at end of file
+ public boolean estaOperativo() {
+ return this.estadoActual == estado.OPERATIVO;
+ }
+
+ /**
+ * Metodo que devuelve el punto de coordenadas del muelle
+ * Este punto pertenece a la clase GPSCoordinate
+ * @return coordenadas del muelle;
+ */
+ public GPSCoordinate getGPSCoordinate() {
+ return this.cord;
+ }
+}
+
diff --git a/src/es/markse/Puerto.java b/src/es/markse/Puerto.java
index 8eea05d..f90506a 100644
--- a/src/es/markse/Puerto.java
+++ b/src/es/markse/Puerto.java
@@ -20,8 +20,8 @@ public class Puerto {
private final String pais;
private final String ciudad;
private final List<Muelle> muelles = new ArrayList<>();
- private final String PAIS_REGUEX ="[A-Za-z]{2}";
- private final String CIUDAD_REGUEX ="[A-Za-z]{3}";
+ private final Pattern PAIS_REGUEX = Pattern.compile("[A-Za-z]{2}");
+ private final Pattern CIUDAD_REGUEX = Pattern.compile("[A-Za-z]{2}");
/**
@@ -55,9 +55,7 @@ public class Puerto {
* @return true si es el formto correcto o false si no lo es
*/
private boolean comprobarIdentifiadores(String pais, String ciudad) {
- Pattern paisPattern = Pattern.compile(this.PAIS_REGUEX);
- Pattern ciudadPattern = Pattern.compile(this.CIUDAD_REGUEX);
- return (paisPattern.matcher(pais).matches() && ciudadPattern.matcher(ciudad).matches()) ? true: false;
+ return (PAIS_REGUEX.matcher(pais).matches() && CIUDAD_REGUEX.matcher(ciudad).matches()) ? true: false;
}
/**
@@ -75,7 +73,7 @@ public class Puerto {
}
/**
- * 1.1.2 Método que elimina un muelle del puerto.
+ * 1.1.2 Método que elimina un muelle del puerto. Si encuentra uno con el mismo ID, lo elimina
* @param id : Identificador del muelle que se elimina
* @return true si se ha eliminado el muelle y false si no se ha eliminado ninguno (n)
*/
@@ -85,15 +83,15 @@ public class Puerto {
}
/**
- * Metodo para comprobar si un muelle esta en ese puerto o no, para agregarle, ya que solo puede haber un muelle con el mismo
- * identificador para cada puerto.
+ * Metodo para comprobar si un muelle esta en ese puerto o no, para agregarle,
+ * ya que solo puede haber un muelle con el mismo identificador para cada puerto.
* @param m obtejo Muelle
* @return true si esta, y false si no se encuentra en el puerto
*/
public boolean comprobarMuelleEnPuerto(Muelle m) {
String id = m.getIdentificador();
GPSCoordinate cord = m.getGPSCoordinate();
- //Para daca muelle comprobamos si ya esta entro de este puerto
+ //Para daca muelle comprobamos si hay alguno con el mismo id o las mismas coordenadas
for (Muelle muelle : this.muelles) {
if (id.equals(muelle.getIdentificador())|| (cord.getDistanceTo(muelle.getGPSCoordinate())==0)) {
return true;
--
GitLab