20260223 ExAbril24 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Bueno, pues aquí primero la clase apunte económico abstracta con tres propiedades, dos métodos, uno de los cuales no hace falta que sea abstracto y otro sí.
00:00:01
Bueno, pues aquí seguimos las pautas y os habrá quedado pues algo como esto, la clase abstracta con sus tres propiedades, un constructor, las clases abstractas pueden tener constructores aunque no se instancien nunca, claro.
00:00:12
Los get y los set
00:00:27
Que heredarán las subclases
00:00:30
Y ejercicio actual
00:00:32
Pues bueno, hay que coger
00:00:36
Del código
00:00:38
Los cuatro primeros dígitos
00:00:39
Que son el año
00:00:42
Y ya está, entonces como el código es un entero
00:00:42
Lo primero habrá que pasarlo a string
00:00:46
Para poder coger los cuatro primeros dígitos
00:00:48
¿Vale?
00:00:51
Bueno, pues esta es la forma más cómoda
00:00:52
De pasar a string
00:00:54
Ahora, ¿cómo cogemos los cuatro primeros dígitos?
00:00:55
Pues hombre, si desplegáis en los métodos de string
00:01:00
Rápidamente encontráis su string
00:01:02
O si no lo podéis hacer a mano
00:01:04
Concatenando charad0, macharad1, macharad2
00:01:06
¿Vale?
00:01:09
Siempre podríais hacer esto a mano
00:01:10
Así un poco a lo más cutre, ¿no?
00:01:12
Es decir, primero nos cogemos
00:01:14
El año, que es el código en string
00:01:17
Que sería
00:01:21
Esto, por ejemplo
00:01:22
Y ahora, pues siempre
00:01:27
Podríais hacer
00:01:31
Y así
00:01:32
Concatenado uno
00:01:45
Tras otro
00:01:47
Lo cual sería un rollo
00:01:48
Un poco feo y muy poco
00:01:51
Profesional, pero bueno
00:01:53
Así os estaríais quedando
00:01:55
Entendéis lo que estoy haciendo
00:01:59
Os estaríais quedando con los cuatro
00:02:00
Primeros caracteres
00:02:03
Y luego ya tendríais que pasarlo a string
00:02:04
O sea, esto sería una cosa muy fea
00:02:07
Pero bueno, puestos a hacer cosas feas
00:02:09
Pues ya
00:02:11
Charac3
00:02:12
Charac3
00:02:20
Esto sería los cuatro primeros dígitos
00:02:23
En string
00:02:29
Y ahora tendríamos que convertirlos a entero, claro
00:02:30
Para convertir a entero
00:02:32
Ya sabemos que tenemos el parseInt
00:02:36
Entonces, hombre
00:02:38
En caso de
00:02:41
Necesidad, que no se nos ocurra
00:02:42
cotillear los métodos de string
00:02:44
que no, pues bueno, siempre podemos hacer esto
00:02:46
¿no?
00:02:48
siempre podríamos hacer esto de aquí arriba
00:02:50
pero bueno, un poco feo es
00:02:51
un poco feo es, lo dejamos aquí comentado
00:02:53
siempre sería mejor
00:02:56
me quedo con los cuatro primeros
00:02:58
dígitos del substring, pues si uno
00:03:00
mira la ayuda, empieza
00:03:02
en la posición que tú le digas
00:03:04
y coge tantos caracteres
00:03:06
a partir de ahí como tú le digas después
00:03:08
empieza en la cero y coge cuatro
00:03:10
vale, y ahora
00:03:12
esa subcadena
00:03:14
que son los cuatro primeros dígitos
00:03:16
pues la tenemos que cambiar a entero, claro
00:03:18
pero para eso ya conocemos este método
00:03:20
vale, pues get ejercicio
00:03:22
actual, este puede
00:03:25
estar en la clase abstracta porque en todos
00:03:27
los apuntes económicos funciona igual
00:03:28
pues así lo dejamos
00:03:30
vale, y ahora
00:03:32
el método de escribir es el que se queda como
00:03:34
abstracto porque cada apunte económico
00:03:36
tiene su propia descripción
00:03:39
se supone
00:03:40
bueno
00:03:41
entonces el hashCode
00:03:43
e equals lo he puesto
00:03:45
luego a posteriori
00:03:47
cuando ya he hecho gestión económica
00:03:50
al ver que es un hashSet
00:03:51
pero bueno, ahora mismo como que lo ignoramos
00:03:53
vale, pues tenemos aquí las propiedades
00:03:55
constructor, getSet
00:03:58
y los dos métodos, uno de los cuales es
00:04:00
abstracto
00:04:02
está por definir, lo cual
00:04:04
hace la clase abstracta, vale
00:04:06
subclases, la factura
00:04:07
la factura que añade
00:04:10
dos propiedades
00:04:12
¿qué son esas dos?
00:04:14
¿vale? pues entonces
00:04:16
aquí es que esto
00:04:18
es así, vale
00:04:21
bueno, pues un constructor
00:04:23
un constructor normalmente basado
00:04:26
en el superconstructor
00:04:28
en el constructor de la superclase
00:04:30
como siempre, pues este
00:04:32
constructor recibe los cinco parámetros
00:04:34
de la factura, los cinco parámetros
00:04:36
y con esos cinco
00:04:38
Actualiza las propiedades
00:04:39
¿Vale? Aquí
00:04:41
Pues podríamos poner protected
00:04:42
A lo mejor para
00:04:45
Facilitar el acceso
00:04:48
A estos campos
00:04:51
En la subclase
00:04:52
¿Vale? Así en cualquier subclase
00:04:54
Pues podemos acceder
00:05:01
Pues venga
00:05:03
Vale
00:05:04
Y ahora al heredar tiene que implementar
00:05:07
Describir, pues ya está
00:05:10
Lo que fuera, da igual
00:05:12
Lo que fuera
00:05:13
Venga, gestión empresarial
00:05:15
Pues lo mismo
00:05:17
Hereda
00:05:18
Dos propiedades, ponía string
00:05:20
Pero bueno, pues como es una fecha
00:05:23
Podríamos poner local date
00:05:25
Constructor
00:05:27
Basado en el super constructor, como siempre
00:05:29
Get y set
00:05:31
Y el sobrescrito
00:05:33
Este obligatorio
00:05:35
De hacerlo, claro
00:05:37
Pues lo que fuera, lo que pidiera el examen
00:05:38
Que sería mostrar un mensajito con toda la descripción
00:05:41
El emisor, el no sé qué, lo que fuera
00:05:43
Mostrar los datos, vamos, en definitiva
00:05:46
Como si fuera un toString
00:05:48
El describir sería como si fuera un toString
00:05:49
Vale, y ahora ya
00:05:52
Esta clase tiene el main
00:05:53
Tiene los datos, lo tiene todo
00:05:56
Pues venga
00:05:58
Los datos de la aplicación
00:06:00
Son todo el conjunto de apuntes económicos
00:06:02
Pues son estos
00:06:05
Los ponemos aquí, fuera del main
00:06:06
Para que puedan acceder a los datos
00:06:08
Todos los métodos del main
00:06:12
porque me han dicho aquí que el main
00:06:13
que es este, gestión económica
00:06:16
implementa el main y tiene los métodos
00:06:18
que hacen cosas
00:06:19
pues entonces para facilitar
00:06:20
que los métodos puedan acceder
00:06:23
a todas esas cosas que se hace
00:06:25
pues ese conjunto
00:06:27
fuera del main
00:06:29
vale, pues aquí está
00:06:30
este es mi set de apuntes
00:06:33
entonces ahora ya sí
00:06:37
cuando
00:06:39
veo que los apuntes económicos
00:06:40
van a estar metidos en un hash set
00:06:43
para que ciertos métodos del hashSet
00:06:45
como contains, equals, todo eso
00:06:49
funcionen correctamente
00:06:51
el remove para que funcionen correctamente
00:06:52
pues necesitamos que haya
00:06:55
un hashCode equals o lo que es lo mismo
00:06:57
que haya un criterio de igualdad
00:06:59
para el hashSet dentro
00:07:01
de la clase a la que pertenece
00:07:03
entonces aquí la confusión
00:07:04
es que tengo tres clases
00:07:07
¿dónde pongo el hashCode equals?
00:07:09
claro, entonces
00:07:13
si la igualdad de todos es por código, el código está en la superclase
00:07:14
entonces no hay problema, yo lo pongo en la superclase por código
00:07:19
y ya vale los de abajo, si la igualdad
00:07:23
de las clases de abajo fuera por otros parámetros suyos propios
00:07:26
pues luego tendría que sobreescribir abajo el jasco de equals, pero aquí no hace falta
00:07:30
entonces en apunto económico, pues aquí es donde pondríamos jasco de equals
00:07:34
por código
00:07:39
entonces mirad que aquí el equals
00:07:41
aquí, esto es un caso
00:07:45
un poco raro, lo que pasa es que claro, este ejercicio
00:07:49
no estaba pensado para hacerse con un hash set
00:07:51
sino con un hash map que como funciona
00:07:53
de forma distinta, al transformarlo
00:07:55
a un hash set, se queda una situación
00:07:57
un poco rara, vale
00:07:59
porque si yo digo
00:08:01
la igualdad es por códigos, vale
00:08:03
entonces tengo una factura
00:08:05
y una gestión empresarial
00:08:06
con el mismo código
00:08:09
son la misma
00:08:11
en realidad no deberían ser la misma
00:08:12
porque una es un gasto empresarial
00:08:15
y otra es una factura
00:08:18
entonces
00:08:19
eso
00:08:21
se contempla aquí
00:08:23
recordad que el equals que te da
00:08:25
el equals que te da
00:08:28
el eclipse
00:08:29
te dice ya directamente
00:08:31
si la clase a la que pertenece este objeto
00:08:32
no es la clase a la que pertenece
00:08:35
el que tú le pasas
00:08:37
Doy por sentado que son distintos
00:08:38
Doy por sentado que son distintos
00:08:41
Aunque tuvieran el mismo código
00:08:43
Entonces habría que ver
00:08:45
En esta situación queremos que sea así
00:08:48
Tengo una factura con código 3
00:08:49
Y un gasto empresarial con código 3
00:08:52
Asumo que son la misma
00:08:54
Pues hombre, no deberían ser la misma
00:08:56
Vale, lo que quiero decir es que
00:08:58
Al haber cambiado este ejercicio
00:09:00
De Hashmat a Hashet
00:09:02
Se queda una cosa un poco rara
00:09:03
Pero bueno
00:09:05
Pues ya está
00:09:06
Tenemos hascode equal
00:09:09
Se hereda tal cual en las otras dos
00:09:10
Igualdad por código y ya está
00:09:13
Y ya está
00:09:14
Y con eso acabamos
00:09:16
La primera clase
00:09:18
Perdón
00:09:20
El tema de los datos
00:09:24
Aquí
00:09:26
Estábamos aquí
00:09:27
Un set, un haset de estos
00:09:29
Vale, ahora
00:09:31
¿Qué métodos tiene mi aplicación?
00:09:33
Métodos que yo he puesto aquí
00:09:35
que luego ya la idea es llamarlos
00:09:36
desde el main para probar
00:09:38
crear apunte
00:09:40
pues nada, crear apunte
00:09:42
aquí es un rollo
00:09:44
porque hay que decir, ¿qué quiere? factura y gestión
00:09:46
económico, en función de eso un switch case
00:09:48
o un if else
00:09:50
y en función del que quiera pedir ya los datos
00:09:52
y ya está
00:09:54
y instancia el objeto
00:09:56
y una vez instancia el objeto añadirlo
00:09:58
con un add, o sea este no
00:10:00
tiene ninguna dificultad salvo el
00:10:02
rollo de pedir todos los datos
00:10:04
Salvo el rollo de pedirlos y además distinguir, preguntarle primero, ¿es factura, gestión empresarial? En función de eso te pido unos datos u otros. Pero la única cosa que tenía es que la aplicación se tiene que asegurar de que el código es único, ¿vale?
00:10:06
Y entonces, para que el código sea único, ¿cuál es la mejor estrategia? El código normalmente, los códigos, las claves primarias de los datos, y esto en bases de datos funciona igual, las claves primarias no suelen ser datos que se le pidan al usuario, porque trasladar al usuario la responsabilidad de la unicidad es un poco,
00:10:24
y si tengo mil datos y me dices
00:10:50
dame la clave, jolín, hasta que
00:10:52
acierte con uno que no exista
00:10:54
entonces no se debería trasladar
00:10:55
al que mete los datos
00:10:57
del nuevo objeto
00:11:00
la responsabilidad de dar un código único
00:11:01
porque podría haber otros 30.000
00:11:04
por eso la mayoría de las
00:11:05
tablas
00:11:07
en bases de datos pues tienen una clave
00:11:09
primaria que es autoincrement
00:11:11
¿no? porque
00:11:13
así se genera ya solita
00:11:15
y tenemos la seguridad, la garantía de que
00:11:17
hay una clave primaria que es imprescindible
00:11:20
en un diseño relacional
00:11:22
aquí no hay un autoincrement
00:11:23
no hay algo que Java
00:11:26
te diga, vale, usa un tipo
00:11:27
de dato autoincrement y yo me aseguro
00:11:30
de que se se incrementa, no, pero lo podemos
00:11:32
simular nosotros
00:11:33
vale, pues yo aquí es lo que haría
00:11:34
entonces, cada vez
00:11:37
que creemos un nuevo apunte
00:11:40
yo no le pido ese dato al usuario
00:11:41
no se lo pido
00:11:44
sino le asigno
00:11:45
uno a partir
00:11:48
De un valor que tenga esta variable
00:11:49
Inicialmente cero
00:11:52
Que podría ser el primer código
00:11:53
Cuando se lo asigne al primer apunte
00:11:55
Me aseguro de dejarlo incrementado
00:11:57
Me aseguro de dejarlo incrementado
00:12:00
¿Vale?
00:12:02
Pero
00:12:04
¿Este es el código
00:12:05
Primero es la fecha y después ya?
00:12:07
Claro, pero sí, pero luego lo concatenarías
00:12:09
Claro, lo concatenarías al año
00:12:12
¿Vale?
00:12:14
Entonces
00:12:17
pero esto es para generar ese serial
00:12:17
de alguna manera
00:12:20
entonces la forma más cómoda es simular
00:12:21
el autoincrement de una base
00:12:24
de datos
00:12:26
entonces el crear apunte
00:12:26
pues es pedir los datos
00:12:30
el año
00:12:31
el año y
00:12:33
luego generar esto
00:12:36
que generarlo es coger
00:12:37
el valor que tenga esta variable estática
00:12:41
ahí global, estática
00:12:44
y dejarla incrementada
00:12:48
¿vale? dejarla incrementada
00:12:49
y ya está
00:12:51
el año
00:12:52
o bien se podría pedir
00:12:56
o bien incluso se podría sacar
00:12:57
pero bueno, eso es una cosa que no os pedí
00:12:59
en el examen no se pedía
00:13:01
lógicamente por el manejo del local date
00:13:04
y de todo eso
00:13:06
pues se podría sacar el año actual de la clase local date
00:13:06
que tiene un montón de métodos para hacer cosas
00:13:10
entre ellas el año en el que estás
00:13:11
pues podrías tú sacar de la clase local date
00:13:13
el año
00:13:15
el año en el que estás actualmente
00:13:16
y concatenarlo a este código
00:13:19
y ya está, o si no se le pregunta
00:13:21
al usuario y se acabó
00:13:23
¿vale? pero sobre todo lo que me importa es
00:13:24
la idea
00:13:27
de que los códigos únicos
00:13:29
no son responsabilidad
00:13:31
normalmente del que introduce los datos
00:13:32
sino de la propia aplicación
00:13:35
¿vale? y esta es la forma
00:13:36
más sencilla de asegurarse un código
00:13:39
único, ¿entendido?
00:13:41
¿no? vale
00:13:43
Buscar apunte
00:13:46
Pues esto es lo más sencillo
00:13:48
Y teras
00:13:52
Y como tenemos la suerte
00:13:54
De que el código
00:13:56
Pertenece a la superclase
00:13:58
Pertenece a la superclase
00:14:01
Pues no necesito
00:14:03
Distinguir si es una factura
00:14:05
Si es una factura
00:14:07
No necesito
00:14:08
Este es el polimorfismo puro
00:14:09
Todos los apuntes económicos
00:14:11
Sean gestiones, sean facturas
00:14:14
Sean gastos empresariales
00:14:15
Sean facturas, tienen getcode
00:14:17
Lo llamo, si es igual al código que me han dado
00:14:19
Ya tengo el objeto
00:14:21
Si he salido de aquí
00:14:22
Si he salido de este for
00:14:25
Lo he completado, es porque nunca salí por aquí
00:14:26
¿Verdad? Nunca salí por aquí
00:14:29
Eso significa
00:14:31
Que no aparece
00:14:33
Ese código, pues entonces devuelvo null
00:14:36
Devuelvo null y se acabó
00:14:38
Vale, aquí lo único
00:14:40
Que, pero ya digo
00:14:44
es que este ejercicio no estaba pensado para hacer con
00:14:46
haset, si
00:14:48
queréis usar el contains
00:14:49
para ver si
00:14:51
existe alguno con
00:14:53
este, si existe alguno, pues aquí
00:14:56
no es tan sencillo, porque
00:14:58
aquí uno haría, si apuntes
00:15:00
punto contains
00:15:02
y aquí
00:15:04
como usábamos esto, pues como
00:15:06
la igualdad es por código
00:15:08
aquí poníamos un objeto
00:15:09
con ese código
00:15:12
y el resto de propiedades nos daban igual
00:15:14
porque el contains va a mirar la igualdad
00:15:16
basada en el código solo
00:15:19
pero yo aquí no puedo instanciar un apunte económico
00:15:21
no puedo instanciarlo
00:15:24
entonces el contains aquí no sería tan fácil
00:15:26
tendría que poner
00:15:30
si contiene una new factura con este código
00:15:32
o si contiene
00:15:37
es decir, no sería tan fácil
00:15:40
factura, por ejemplo, con el código code
00:15:42
y el resto de propiedades de factura que son double int, no, double string, int y string.
00:15:48
Pues por ejemplo, 0, 0, 0, 0 o new gasto empresarial con lo que tenga gasto empresarial
00:16:00
Que la que nos importa es
00:16:32
El código y luego tiene
00:16:34
Double string
00:16:36
Y todo, puedo ponerlo ahí
00:16:37
Vale, entendéis lo que digo
00:16:40
Que aquí el contains
00:16:48
Se complica
00:16:50
Porque la aplicación
00:16:51
Perdón
00:16:54
El set de apuntes tiene dos tipos de objetos
00:16:55
Puede tener facturas
00:16:58
Puede tener gastos empresariales
00:17:00
Ahí perfectamente entremezclados
00:17:02
Porque como todos son apuntes económicos
00:17:04
Y el set es de apunte económico
00:17:05
Puede tener de todo
00:17:07
Entonces cuando yo quiero ver si apuntes contiene algo
00:17:08
Siempre hacemos
00:17:12
Si contiene un objeto como este
00:17:13
Y ahí ya nos hacíamos new la clase que fuera
00:17:15
Con los datos que fueran
00:17:18
Pero aquí
00:17:20
No puedo hacer un si contiene un new
00:17:21
Apunto económico con ese código
00:17:23
No puedo porque no puedo instanciar apunto económico
00:17:25
Porque es una clase abstracta
00:17:27
Pero podríamos hacer esto
00:17:29
Si contiene una factura con este código
00:17:30
Porque el resto de propiedades me dan igual
00:17:33
Porque no se miran en el equals
00:17:35
o contiene
00:17:36
un gasto empresarial con ese código
00:17:39
pues entonces podría
00:17:41
concluir que sí
00:17:43
que
00:17:44
contiene un apunte económico con ese código
00:17:45
¿vale?
00:17:49
si quisiéramos usar el contains
00:17:50
me refiero, para lo que fuera
00:17:52
entonces
00:17:54
por ejemplo
00:17:56
para dejarlo aquí puesto
00:17:59
voy a hacer al contrario, si no contiene
00:18:01
que devuelva null
00:18:05
y entonces
00:18:07
sería el negado del or sería si no contiene una factura con ese código y tampoco contiene una con
00:18:09
ese reto nulo y ahora ya si no me pasó aquí por ejemplo vale pero bueno que esto es un poco lío
00:18:19
por tener dos sub clases dentro de la super clase lo dejo aquí comentado vale siguiente método
00:18:36
importe total de las facturas, esto como lo haríais, como lo habéis hecho, importe total de las facturas hay que recorrer la colección de apuntes y solo, solamente sumar a la suma las que sean facturas, entonces esto pues habréis hecho algo así,
00:18:49
Aquí con una variable suma inicialmente igual a 0
00:19:14
Y ahora aquí solamente si A resulta que es una factura
00:19:30
Solamente en el caso de que A sea una factura
00:19:39
Pues entonces en ese caso habrá que sumar su importe
00:19:43
¿Vale? Y entonces
00:19:49
Porque factura es una propiedad
00:19:52
Solo, perdón
00:19:55
Ah, importe es de
00:19:56
Apunte, con lo cual no hace falta
00:20:01
Ni hacer el casting ni nada
00:20:03
Porque ya tiene GetImporte
00:20:04
¿Vale?
00:20:07
Si importe solo fuera de factura
00:20:11
Solo, pues habría que hacer aquí
00:20:13
Un casting, claro, pero no es el caso
00:20:15
Y ahora
00:20:17
RetunSuma y ya está
00:20:19
Algo así
00:20:21
¿Vale?
00:20:22
Vale, pues entonces os pongo yo ahora
00:20:24
Por ejemplo este método
00:20:26
Porque quedaría algo aquí más
00:20:27
Importar facturas
00:20:30
¿Ya está?
00:20:33
¿Qué?
00:20:38
Bueno, luego ya tiene el main
00:20:42
El main que es para probarlo
00:20:43
¿Vale?
00:20:45
Que es llamar a estos y ya está
00:20:46
El main, vale
00:20:47
Pero lo que me interesa ahora
00:20:48
Pues imaginaos
00:20:51
Imaginad que ahora añadimos
00:20:52
un método que fuera este listado de todos los gastos empresariales por orden
00:20:53
devuelve un listado de gastos empresariales por orden de importe, por orden descendente,
00:21:03
es decir, el más caro primero
00:21:21
descendente
00:21:23
de importe
00:21:26
vale, pues venga, si hubiera que hacer
00:21:27
este método, ¿qué es lo que haríais?
00:21:32
primero
00:21:37
pensamos, hay que ordenar
00:21:38
hay que ordenar
00:21:39
pues como no sabemos
00:21:40
ordenar nosotros, porque no hemos implementado
00:21:44
la ordenación nosotros
00:21:46
ya sabemos que tenemos un sort, que es como ordenamos
00:21:47
con un sort, vale
00:21:50
pero lo primero que pensamos es
00:21:51
vale, el método sort
00:21:53
me funcionan las listas
00:21:55
y en los Arrays, claro
00:21:57
me funcionan las listas
00:21:58
entonces yo necesito una lista
00:22:00
de gastos empresariales
00:22:03
¿tengo una lista de gastos empresariales
00:22:04
que pueda ordenar, sea algún
00:22:07
criterio?
00:22:09
no, tenemos un conjunto de apuntes
00:22:11
pues entonces
00:22:13
lo ideal sería, vamos a crearnos
00:22:15
una lista de gastos empresariales
00:22:16
y cuando ya tenga eso, eso ya
00:22:19
lo puedo ordenar
00:22:21
¿vale? entonces, primero
00:22:22
me piden que ordene no sé qué
00:22:24
vale, para ordenarlo
00:22:27
tengo que tener una lista, si no, no puedo ordenar
00:22:29
nada, o en un array
00:22:31
pero una lista es más fácil de crear
00:22:32
bueno, pues voy a
00:22:35
crearme esa lista, esa lista
00:22:37
de donde me saco los datos para
00:22:38
ella, pues tendrán que ser
00:22:41
todos los gastos empresariales
00:22:43
de
00:22:45
los apuntes, bueno pues
00:22:45
entonces nos vamos a hacer esa lista
00:22:49
lo primero de todo, una lista
00:22:50
De gasto empresarial
00:22:56
Vale
00:22:59
Esto mismo por ejemplo
00:23:00
Ahora vamos a construirla
00:23:17
Pues para construirla lo más fácil es
00:23:18
Pues venga
00:23:21
Vamos a sacarlos de aquí
00:23:23
Económico
00:23:25
Apuntes
00:23:27
Y ahora
00:23:34
Si A
00:23:38
Resulta que es
00:23:39
Un objeto
00:23:42
Gasto
00:23:44
empresarial
00:23:46
pues si lo es
00:23:48
se va a mi lista
00:23:51
gastos.ad
00:23:53
ese objeto
00:23:56
¿por qué me da este rojo?
00:23:57
¿por qué me da error de compilación?
00:24:10
ahí
00:24:14
me da error de compilación
00:24:14
porque a esta lista
00:24:20
al estar parametrizada
00:24:21
a esta lista solo le puedo meter
00:24:22
gastos empresariales o subclases
00:24:24
y estoy intentando
00:24:27
meterle algo que está declarado
00:24:28
como apunte económico, claro
00:24:30
pero no pasa nada porque yo sé que se
00:24:32
instanció como gasto
00:24:34
empresarial, entonces al haberse
00:24:36
instanciado como gasto empresarial no hay ningún
00:24:38
problema en que le
00:24:40
haga esto
00:24:42
porque ya he verificado antes
00:24:43
empresarial
00:24:46
ahora, vale
00:24:53
ya está, y ahora ya es cuando
00:24:56
uno ya se puede plantear ordenar
00:24:58
¿Vale? Porque esta lista, al ser una lista, pues tendrá un método sort, ¿vale? Y este método sort ya sabemos cómo funciona.
00:24:59
¿Los gastos empresariales tienen un criterio de ordenación definido? No lo tienen, aquí no hay ningún implements comparable.
00:25:16
Tenemos dos opciones
00:25:25
O aquí un implements comparable
00:25:28
Porque ese es su orden natural
00:25:30
Para toda la aplicación
00:25:32
O hacer un comparator
00:25:33
¿Vale? Entonces
00:25:35
¿Qué decido?
00:25:38
Depende, primero tengo que tener acceso
00:25:40
A esta clase
00:25:42
Para poder plantearme y poner aquí
00:25:43
El implements comparable
00:25:46
Y luego cuando lo haga
00:25:47
Tengo que pensar
00:25:49
Que voy a estar alterando al resto del universo
00:25:51
Que esté usando esta clase
00:25:53
porque automáticamente la estoy poniendo
00:25:55
en un orden natural, orden descendente
00:25:57
de
00:25:59
importes
00:26:00
y el resto del universo
00:26:02
que use esa clase, cuando ordene
00:26:05
cuando haga cosas, cuando haga un triset
00:26:07
pues de repente va a tener ese orden
00:26:09
establecido
00:26:11
entonces eso
00:26:12
es peligroso de hacer
00:26:14
en un contexto real es peligroso, aunque aquí no
00:26:16
funcione, vamos a suponer que lo
00:26:19
hacemos aquí, pues esto se quedaría
00:26:21
Implements comparable
00:26:23
De gasto económico
00:26:26
Vale, entonces al implementar
00:26:30
Lo bajo aquí abajo
00:26:35
Al implementar el comparable de gasto económico
00:26:37
Pues necesito
00:26:41
El gasto empresarial, perdón
00:26:44
Perdón, perdón, perdón
00:26:47
Empresarial
00:26:49
Ahora sí, vale
00:26:53
Ahora entonces ya necesito
00:26:54
Esto
00:26:57
Gasto
00:26:59
Empresarial
00:27:01
Empresarial
00:27:02
Empresarial
00:27:05
Vale
00:27:06
Entonces descendente de importe
00:27:08
Pues descendente de importe
00:27:11
Sería
00:27:13
Que o.get
00:27:14
Importe
00:27:16
menos
00:27:18
dis.get
00:27:25
importe, ¿verdad?
00:27:28
Porque si esta cantidad
00:27:30
es
00:27:31
ahora le hacemos el casting
00:27:33
entero, porque
00:27:39
los importes son double, porque si esta cantidad
00:27:41
es negativa
00:27:43
significa que
00:27:44
el importe
00:27:47
de el parámetro
00:27:49
es
00:27:52
más pequeño
00:27:53
luego va
00:27:54
eso significa
00:27:56
que efectivamente
00:27:58
si esta cantidad es negativa estoy diciendo
00:28:00
que el que llama this va el primero
00:28:02
y debería ir el primero
00:28:05
sí, porque su cantidad
00:28:07
es mayor que esta de aquí
00:28:09
es mayor
00:28:11
luego ese sería el orden descendente
00:28:11
da negativo cuando el que llama
00:28:14
el que llama
00:28:17
tiene más cantidad que el parámetro
00:28:18
vale
00:28:21
Lo que pasa es que como los importes son double
00:28:23
Esto me va a dar en double
00:28:24
Pero a mí lo que me importa es el signo de la
00:28:26
De la operación
00:28:29
Es lo que me importa, el signo de la operación
00:28:30
Pues le hago un casting y ya está
00:28:33
¿Vale? Me importa el signo, si es negativo
00:28:34
Positivo o cero
00:28:37
Bueno, pues esto sería un criterio de orden
00:28:38
Que hemos plantado ahí
00:28:44
Que es el descendente de gastos
00:28:45
Vale
00:28:48
Y
00:28:55
Entonces ahora esto se ordenaría
00:28:55
Y ahora vamos a hacer el listado
00:29:01
Y ahora aquí ya, para cada gasto empresarial de mi lista, pues listado más igual g.describir, que para eso tenemos un describir.
00:29:03
Ah, bueno, que describir no te lo devolvía, te lo imprimía, te devolvía un void.
00:29:42
Pues entonces lo dejamos así, le ponemos un toString y ya está.
00:29:46
¿Vale?
00:29:52
Va concatenando y lo devuelve.
00:29:54
Entonces haría falta un toString en gasto empresarial
00:30:02
para que al concatenar uno con otro, uno con otro,
00:30:05
más el salto de línea, claro,
00:30:08
pues no nos quede muy feo el listado.
00:30:12
Vale, vamos a ponerle un gasto empresarial aquí a este.
00:30:18
O sea, un toString, perdón.
00:30:23
Vale, ya está.
00:30:29
A ver, ¿dónde estamos?
00:30:35
Aquí.
00:30:37
Vale.
00:30:39
el compare to de comparable
00:30:39
o el compare de comparator
00:30:42
porque son la misma idea
00:30:44
trabaja siempre
00:30:45
con dos elementos
00:30:48
que son el que llama al método
00:30:49
que es dis
00:30:51
y este que es o en este caso
00:30:52
entonces
00:30:55
te tiene que devolver
00:30:56
negativo si el dis
00:30:58
va antes
00:31:01
que este
00:31:03
cero si son
00:31:04
claro claro porque es el criterio
00:31:06
con el que todos lo tienen en cuenta, ¿vale?
00:31:09
0 si está en la misma posición
00:31:12
y positivo si el dis está después.
00:31:13
Vale, pues nosotros lo que queremos es
00:31:18
que cuando este esté antes, el dis esté antes,
00:31:19
es porque su valor es mayor,
00:31:24
porque queremos el orden descendente, ¿no?
00:31:25
Pues su valor es mayor.
00:31:27
Pues si nos hacemos esta resta,
00:31:28
cuando el dis, su valor sea mayor,
00:31:30
esta resta me va a dar negativo.
00:31:33
Y cuando su valor sea menor,
00:31:36
esta resta me va a dar positivo
00:31:37
que es justo lo que queremos
00:31:40
pues ya está, si lo quisiéramos
00:31:41
en orden al revés, orden
00:31:44
ascendente en vez de descendente
00:31:45
cambiaríamos
00:31:48
los elementos de la resta
00:31:50
lo que pasa es que esta resta
00:31:52
me da en double, porque son números double
00:31:54
pero a mí lo que me importa es el signo de lo que me devuelve
00:31:56
pues lo hago un casting a int y ya está
00:31:58
y cuando sea en el mismo
00:32:00
importe, luego está en la misma posición
00:32:02
pues me da
00:32:04
me dará cero
00:32:05
nunca usaríamos este comparable
00:32:06
este compare tú
00:32:10
para un triset
00:32:12
porque el triset entonces dos gastos
00:32:13
del mismo importe le parecerían
00:32:17
que son el mismo
00:32:19
porque el triset este es su criterio de igualdad
00:32:19
el del compare tú
00:32:23
y no tiene sentido que dos gastos empresariales
00:32:24
solo por tener el mismo importe
00:32:27
fueran el mismo
00:32:28
entonces si usáramos un triset para meter gastos empresariales
00:32:29
tendríamos que hacerle a él
00:32:32
un comparator por nombre
00:32:34
por código
00:32:36
que quiera un triset
00:32:37
me preguntas ahora
00:32:41
a 10 horas del examen
00:32:43
pues otra implementación
00:32:44
de set
00:32:47
está en la grabación que pone triset
00:32:47
lo tienes todo
00:32:50
vale
00:32:51
vale
00:32:51
entonces
00:32:55
y si nosotros ahora
00:32:59
añadieramos aquí
00:33:01
listado de gastos empresariales
00:33:02
pues por ejemplo
00:33:04
ahora, este mismo
00:33:06
listado de gastos empresariales lo quiero
00:33:08
pero por fecha, pues aquí
00:33:10
de nuevo, aquí tendríamos un problema
00:33:25
porque, espérate, otra vez estoy en las
00:33:26
mismas, quiero un listado
00:33:29
de gastos empresariales, vale, ese lo consigo
00:33:31
muy rápido
00:33:33
lo consigo aquí
00:33:33
muy rápido, ya tengo el listado
00:33:38
ahora voy a ordenarlo
00:33:40
pero ahora mi orden
00:33:42
mi orden ya está
00:33:44
establecido, el orden natural yo ya lo he fijado
00:33:50
aquí y he fijado que fuera por
00:33:52
importe, como entonces
00:33:54
como hago ahora para ordenar
00:33:56
por otro criterio distinto
00:33:58
que no sea el natural que yo he puesto
00:34:01
aquí, pues ya
00:34:02
sabemos como, en lugar de decirle
00:34:04
null, dame mi
00:34:07
criterio de ordenación, uno
00:34:08
en concreto para esta ordenación
00:34:10
uno en concreto, pues
00:34:12
tendremos que hacernos un criterio de ordenación
00:34:14
un comparator en
00:34:16
particular para este sort
00:34:18
que le aplique a él solamente
00:34:20
Porque ya sabemos que si le pasamos null
00:34:22
Entonces este sort va a tirar del que haya en la clase
00:34:25
Va a tirar de este
00:34:29
Entonces yo no le puedo pasar null
00:34:30
Porque no quiero que tire del de la clase
00:34:33
Quiero que tire de un criterio distinto que es por fechas
00:34:36
Pues tendremos que pasarle un criterio
00:34:39
Me tendré que hacer, que está sin hacer
00:34:44
Este, pues necesito un criterio
00:34:47
Comparator fechas, como yo lo quiera llamar
00:34:51
Pues venga
00:34:54
Vamos a hacerlo
00:34:56
Pues sería esta clase
00:34:56
Pues yo me la haría
00:35:04
Public class comparator de fechas
00:35:06
Vale
00:35:09
Para que sea
00:35:10
Vale
00:35:13
Aquí ya
00:35:14
Para que sea un comparador
00:35:15
Para que sea un criterio de comparación
00:35:18
Tiene que implementar
00:35:20
Implements
00:35:21
Tiene que implementar
00:35:23
comparador
00:35:25
quiero que sea yo un comparador
00:35:27
entre objetos cualesquiera
00:35:30
o solo entre gastos empresariales
00:35:32
solo entre gastos empresariales
00:35:34
pues venga
00:35:36
empresarial
00:35:37
parametrizalo ahí
00:35:39
y ahora ya
00:35:40
al ser esto una clase
00:35:43
que implemente esto de aquí
00:35:46
necesita sobre escribir los
00:35:47
métodos, no hay otra
00:35:50
que método es
00:35:51
Pues este
00:35:54
Este
00:36:04
Me da un criterio de ordenación
00:36:07
Entre estos dos parámetros
00:36:10
Entre este y este otro
00:36:11
Entonces ahora tenemos que pensar aquí
00:36:13
¿Cómo hacemos para que devuelva negativo
00:36:15
Si la fecha de este
00:36:17
Es antes que la de este otro
00:36:20
Cero, bueno pues menos mal que
00:36:21
Local date
00:36:24
Tiene métodos para ver si una fecha
00:36:26
Es antes que otra
00:36:28
Vamos a ver, pues si el gasto empresarial 1 está, tendrá aquí un get date, claro, get fecha, get fecha, si la fecha del gasto empresarial 1 está después que la fecha del gasto empresarial 2,
00:36:29
Si está después
00:36:53
Entonces aquí me interesa devolver positivo
00:36:55
¿Verdad?
00:36:58
Perdón
00:37:01
O2
00:37:01
Si este está después de este
00:37:02
Me interesa devolver positivo
00:37:06
Pues 1
00:37:08
El 6
00:37:09
Si en lugar de después está antes
00:37:13
Tendrá un is before
00:37:23
Imagino lo tiene
00:37:27
Pues si está antes entonces devuelve menos 1
00:37:28
Porque tiene que devolver negativo
00:37:31
Si el primero está antes que el segundo
00:37:32
retun-1
00:37:35
y si no está antes ni después
00:37:37
es la misma fecha
00:37:40
en ese caso pues ahora ya sí
00:37:41
vale, bueno pues
00:37:43
este es un criterio de ordenación ahí suelto
00:37:55
para quien lo quiera usar
00:37:57
no va asociado a la clase
00:37:59
es por si
00:38:01
lo queremos usar en algún momento
00:38:03
bueno pues este criterio de ordenación que está por aquí
00:38:04
suelto, ahora ya sí
00:38:07
que lo vamos a usar aquí
00:38:09
Y ahora ya pues nos hacemos nuestro listado
00:38:11
Otra vez como aquí
00:38:15
Y aquí sigo teniendo un error rojo
00:38:16
Que no sé
00:38:34
Ah, por este context que tenía yo puesto aquí
00:38:35
Suelto
00:38:38
Vale, venga, vamos a añadir
00:38:39
Otro método, por ejemplo
00:38:47
Vamos a eliminar
00:38:48
Todos los
00:38:50
Todas las facturas de un emisor
00:38:52
Todas las de un emisor fuera
00:39:00
Elimina
00:39:02
Facturas
00:39:11
De un emisor
00:39:13
Que aquí se le pase
00:39:18
Pues aquí cuidado
00:39:19
Vamos a eliminar de un set
00:39:23
Entonces recordad
00:39:25
Que uno no se plantea hacer esto
00:39:27
Para cada
00:39:30
Vámonos a los apuntes económicos
00:39:33
Apunte
00:39:36
Económico
00:39:37
A
00:39:41
De apuntes
00:39:42
De la tentación
00:39:44
Que uno tendría
00:39:45
Pues si este apunte resulta que es una factura
00:39:46
Y además de ser una factura
00:39:55
Y además de ser una factura
00:40:00
Resulta que su emisor
00:40:04
Factura A
00:40:06
Resulta que su emisor es igual a este que me han dado
00:40:12
Resulta que es igual a este que me han dado
00:40:24
pues un juego tendría tentaciones
00:40:30
aquí de hacer, pues oye tú
00:40:32
de apuntes
00:40:34
punto remove
00:40:36
esa factura, vale
00:40:38
y esto es lo que hemos dicho que es muy mal
00:40:42
bueno aquí antes de eso
00:40:44
fijaos que aquí gracias al doble
00:40:47
AND
00:40:49
este casting
00:40:50
no va a tener ningún problema
00:40:52
porque este doble AND
00:40:55
solo entra aquí
00:40:57
en la segunda cláusula si esta es true
00:40:59
Si es false esta ni se evalúa
00:41:01
Si es false ni se evalúa
00:41:04
Pero
00:41:05
Si es true
00:41:07
Si que se evalúa
00:41:08
Y en ese caso al ser true
00:41:10
Este casting tiene sentido
00:41:13
Porque factura es la clase de A
00:41:14
Pero bueno a lo que íbamos
00:41:17
Esto recordad que es lo que no podíamos
00:41:19
Estamos recorriendo la colección for remove
00:41:20
A su vez otra vez va a recorrerlo
00:41:23
Entonces
00:41:25
Esto no fatal ya lo sabemos
00:41:26
Vale
00:41:29
Ya hemos visto en ejemplo
00:41:31
Como
00:41:34
Como nos da
00:41:35
Concurrent modification exception etc
00:41:41
Vale entonces aquí que hacemos
00:41:43
Bueno pues el método remove ya sabemos
00:41:45
Que puede borrar pero borra por igualdad
00:41:49
Pero claro aquí no hay que borrar
00:41:51
Por
00:41:53
Igualdad de objeto
00:41:54
Sino todos aquellos que su emisor sea
00:41:56
Igual que este
00:41:59
Y ese no es
00:42:01
El criterio de igualdad del hasco
00:42:03
de equals, el criterio de igualdad
00:42:05
del jasco de equals es por código
00:42:07
entonces aquí yo no puedo usar
00:42:09
el remove
00:42:11
y pasarle un objeto con un emisor
00:42:12
igual a este, porque el remove
00:42:15
te borra por igualdad
00:42:17
de jasco de equals
00:42:19
luego aquí como
00:42:20
lo haríamos entonces
00:42:22
que usaríamos
00:42:24
para eliminar de un set
00:42:27
por un criterio que no fuera el de
00:42:30
clave primaria
00:42:33
por un criterio que no es el de jasco de equals
00:42:34
¿qué usaríamos?
00:42:37
no nos queda más remedio que usar
00:42:41
¿qué? el
00:42:42
el iterador, no nos queda más remedio que usar el iterador
00:42:43
para borrar
00:42:47
por un criterio, bueno
00:42:48
y las lambdas que no las conocemos
00:42:49
para borrar por un criterio que no sea
00:42:52
clave primaria
00:42:56
repito, esto no lo podemos hacer
00:42:57
nos va a fallar, nos va a dar
00:43:00
concurrent modification exception por acceder
00:43:02
por un lado por el for y luego por el remove
00:43:04
que a su vez tiene dentro un for
00:43:06
¿Vale?
00:43:07
Y si yo pongo un remove suelto
00:43:09
A punto remove algo
00:43:11
El remove suelto
00:43:13
Lo que yo le pase aquí
00:43:15
El remove va a buscar algo que sea
00:43:17
Igualito a este
00:43:19
Igualito a este
00:43:20
Y la igualdad es por código
00:43:22
No es por emisor
00:43:25
Luego este remove suelto aquí no pinta nada
00:43:26
Este remove solo me vale para borrar
00:43:29
Por clave primaria
00:43:32
En este caso por código
00:43:34
Nunca me borraría por emisor
00:43:35
Nunca me borraría por emisor
00:43:37
Luego esto nada
00:43:38
Vale, entonces tenemos que hacer un iterador
00:43:39
Que ya sabemos
00:43:42
Apuntes
00:43:43
Y ahora ya
00:43:48
Pues ya usamos el iterador
00:43:58
Como ya sabemos usarlo
00:44:00
Mientras tengamos
00:44:01
Un siguiente
00:44:06
En mi iterador
00:44:07
Pues vamos a guardar el elemento en el que estemos
00:44:08
Que es, vamos a dejarlo claro
00:44:14
Apunte
00:44:16
económico
00:44:18
y punto
00:44:20
next, vale, estamos aquí parados
00:44:22
vale, que
00:44:24
teníamos que hacer aquí, borrar
00:44:26
solo si es factura
00:44:28
iterator de
00:44:29
vale
00:44:35
esto a punto de
00:44:39
económico, es que se me había
00:44:41
dado
00:44:44
parametrizar, vale
00:44:44
ahora, si a
00:44:47
resulta que
00:44:50
es una instancia de factura, solo en el caso de que sea una instancia de factura, y si
00:44:54
además de ser una instancia de factura, si además de serlo, resulta que esta condición
00:45:02
de aquí, que ahora ya sí que podemos moverla, y si además de eso resulta que su emisor
00:45:09
es igual que este emisor
00:45:26
que me han dado
00:45:28
pues entonces en ese caso
00:45:29
ahora ya
00:45:31
id.remove
00:45:33
¿vale? así si podemos
00:45:36
borrar todas las facturas
00:45:39
de un emisor
00:45:42
así si
00:45:42
¿vale? ya se quedarían borradas
00:45:44
¿vale?
00:45:47
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 1
- Fecha:
- 3 de marzo de 2026 - 17:11
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 46′ 02″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 190.88 MBytes