Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
E
Entrega_javcalv_victorm
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
javcalv
Entrega_javcalv_victorm
Commits
02e889ae
Commit
02e889ae
authored
5 months ago
by
Javier Calvo
Browse files
Options
Downloads
Patches
Plain Diff
Muelle casi arreglado. Falta mejoras
parent
c2b08cc8
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/es/markse/Muelle.java
+103
-186
103 additions, 186 deletions
src/es/markse/Muelle.java
src/es/markse/Puerto.java
+7
-9
7 additions, 9 deletions
src/es/markse/Puerto.java
with
110 additions
and
195 deletions
src/es/markse/Muelle.java
+
103
−
186
View file @
02e889ae
...
...
@@ -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
.
c
ontenedor
es
.
stream
().
anyMatch
(
c
->
c
.
getCodigo
().
equals
(
codigo
))
;
return
(
this
.
nivelC
ontenedor
(
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 compr
ue
ba 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
compr
o
ba
r
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
*/
p
ublic
boolean
estaOperativo
(
)
{
return
this
.
operativo
;
p
rivate
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 plazas
L
lenas
* @return
numero de
plazas
l
lenas
*/
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 plazas
S
emillenas
* @return
numero de
plazas
s
emillenas
*/
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
;
}
}
This diff is collapsed.
Click to expand it.
src/es/markse/Puerto.java
+
7
−
9
View file @
02e889ae
...
...
@@ -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
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment