20250213 Colecciones_Iterador - 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:
Venga, vamos a intentar ser rápidos
00:00:00
Para que nos junde el tiempo
00:00:03
Ejercicio 2
00:00:04
A ver
00:00:08
Una clase
00:00:10
Es más sencillo que el 1
00:00:13
Porque solamente tiene
00:00:14
Dos clases
00:00:17
Bueno
00:00:19
Ese también tenía dos
00:00:21
Pero era un poquito más lioso
00:00:23
Una discoteca que tiene un montón de discos
00:00:24
Y se acabó
00:00:28
vale, nada más, y ahora ya vamos a hacer las cosas con los discos que hay ahí dentro, o sea, una tonterita, vale, pero el problema es cuando eliminamos de una colección, eliminamos de una colección, no por la clave primaria, no por el equals, porque si eliminamos por el equals hacemos remove y listo, si no eliminamos por el equals es el problema, vale, pues venga, vamos a hacernos estas clases,
00:00:29
Primero disco, que es la que depende
00:00:54
De la que depende la discoteca esa
00:00:56
Eso
00:00:58
Entonces la clase disco
00:01:00
Que tenía como propiedades
00:01:02
El título y autor
00:01:04
Imagino
00:01:05
Sí, disco
00:01:07
Vosotros como ya este concierto
00:01:15
Vosotros tenéis las canciones
00:01:16
De streaming, que uno saca una canción
00:01:18
Y ya está, y se acabó
00:01:20
Antes no, antes las cosas se curraban
00:01:21
Y sacabas un disco completo
00:01:23
y no te ponías ahí en streaming
00:01:25
a hacer el tonto y el idiota
00:01:28
como se hace ahora
00:01:29
me desahogo
00:01:30
es que esto de banalizar la cultura
00:01:33
como se está haciendo me pone muy nerviosa
00:01:38
déjame que me desahogue
00:01:40
Sí
00:01:55
Vale, pues ya está
00:01:56
Tenemos el disco con sus dos propiedades
00:02:01
Por supuesto, aquí no nos paramos ya
00:02:03
Silencio, con los constructores
00:02:07
Getty Set, no me para decir nada
00:02:09
Los ponemos y ya está
00:02:11
Que tampoco
00:02:12
Vale, y ahora
00:02:14
La discoteca que tiene la temática
00:02:17
Y los discos, y ya está
00:02:19
Constructores Getty Setter
00:02:21
y ya iremos poniéndolos
00:02:22
igual los jascos, todo eso según nos vaya
00:02:24
pidiendo el cuerpo
00:02:26
si hombre, siempre
00:02:27
hacemos constructores getter y setter
00:02:30
y la verdad es que si generamos
00:02:32
siempre por sistema los toStream
00:02:34
pues mejor
00:02:36
venga
00:02:37
porque estoy idiota
00:02:39
pero no pasa nada
00:02:43
voy a refactorizar
00:02:46
aunque el getty set no me la refactoriza
00:02:48
así que cuidadín
00:02:50
Autor
00:02:50
Vale, entonces
00:02:52
Autor
00:02:56
Autor
00:02:59
Y set autor
00:03:15
Vale
00:03:28
Pues ya está todo
00:03:29
en el constructor
00:03:30
autor y título
00:03:32
autor, autor y título
00:03:33
vale, ya está
00:03:36
entonces mira, ya que he vuelto a entrar en esta clase
00:03:37
y no nos cuesta nada, vamos a hacer un toString
00:03:39
porque cuando lo pasamos a un system.out
00:03:41
es más bonito lo que nos saca
00:03:43
como ya sabemos
00:03:46
¿vale? o sea, otro ejemplo
00:03:47
del polimorfismo
00:03:50
el toString es un método
00:03:51
al que llama el system.out.println
00:03:54
cuando lo pasamos a un objeto
00:03:56
y llamará al toString de ese objeto
00:03:57
entonces es un ejemplo más de polimorfismo
00:03:59
el tuestring funciona diferente en alumno
00:04:01
en disco, en no sé qué
00:04:04
si escucharas
00:04:05
vale, ahora la otra clase
00:04:12
este, que nombre más feo
00:04:14
pero bueno
00:04:21
sí, un nombre muy feo
00:04:21
que si no me gustaban
00:04:24
¿por qué habláis en pasado?
00:04:28
si yo sé que soy muy mayor
00:04:30
pero todavía puedo ir a discotecas
00:04:31
te lo digo, en serio
00:04:33
y seguramente haga muchas más cosas
00:04:35
que tú en la discoteca
00:04:37
es que de verdad
00:04:38
a ver si es freje
00:04:43
la vida se acaba
00:04:44
vale
00:04:46
venga, entonces
00:04:49
vamos a hacer que sea
00:04:56
un conjunto
00:04:58
una lista
00:05:00
que
00:05:00
¿qué colección
00:05:02
os es más incómoda?
00:05:05
Conjunto, dice conjunto
00:05:08
y lo habéis hecho con conjunto, pues vamos a hacerlo
00:05:09
con conjunto
00:05:11
conjunto sería siempre la opción natural
00:05:11
por defecto porque es más sencilla
00:05:15
de implementar, un segundo
00:05:16
pero si necesitamos
00:05:18
las posiciones porque me son interesantes
00:05:20
para algo, pues haríamos una lista
00:05:23
¿vale? dime
00:05:25
ya, es que me ponéis nerviosa
00:05:26
Pues cambio las cosas
00:05:31
Venga, set
00:05:32
De disco
00:05:36
Vale, los discos que tiene
00:05:38
Aquí lo mismo
00:05:41
Es buena práctica instanciarlo aquí
00:05:43
Para que ya directamente haya una colección vacía
00:05:45
Me ahorro null pointer exception cuando añade el primero
00:05:47
Etcétera
00:05:49
¿Cuál nos gusta? ¿Hashet? ¿Treset?
00:05:50
Hashet
00:05:53
Vale, y luego vamos a rápidamente a cambiarlo en treset
00:05:53
A ver qué cambiaría en el ejercicio
00:05:57
Si uno decide que lo cambie a treset
00:05:59
¿vale? porque de cambiarlo
00:06:00
a linked hash no cambiaría nada
00:06:03
absolutamente nada
00:06:04
pues venga
00:06:05
importamos
00:06:08
vale
00:06:10
en entidades como estas
00:06:12
está bien hacer un constructor
00:06:14
con las propiedades que no sean colección
00:06:16
porque normalmente cuando yo instancio
00:06:18
una discoteca la instanciaré primero
00:06:21
con una temática y discos vacíos
00:06:22
y luego ya voy metiendo, es lo normal
00:06:24
entonces bueno, es habitual hacer un
00:06:26
constructor solo con
00:06:28
Esta propiedad
00:06:30
Ya los discos los iré metiendo después
00:06:32
Uno sin parámetros porque me facilita
00:06:34
La vida
00:06:37
Seguramente en algunas situaciones
00:06:37
Y
00:06:40
Y
00:06:46
Vale
00:06:50
Y un to stream, ya que nos ponemos
00:06:53
Un to stream
00:06:56
Bueno, aunque mirar la discoteca vamos a hacer
00:06:58
Vamos a mirar los discos, va, pasamos del to stream
00:07:00
Para no perder tiempo
00:07:02
vale, no he puesto ni Haskell
00:07:03
ni Equals ni nada
00:07:06
aunque nos podríamos adelantar desde ya porque no perdemos nada
00:07:06
pero vamos a hacerlo cuando ya identifiquemos
00:07:10
que es que es imprescindible
00:07:11
vale, pues estas entidades
00:07:13
no tienen métodos propios, aquí estaría
00:07:15
muy bien hacer un método que fuera
00:07:17
pues agregar un disco a la discoteca
00:07:19
pero bueno, es que eso es hacerle un
00:07:21
add, tampoco tiene más rollo
00:07:23
¿no? pero
00:07:25
para que no se nos vayan olvidando
00:07:27
bueno, no, porque si no os cambio el ejercicio
00:07:28
iba a poner un método que fuera
00:07:31
agregar disco
00:07:34
que tuviera dentro
00:07:35
lo único que tendría dentro es una
00:07:37
ya está
00:07:38
pero bueno suele ser el diseño habitual
00:07:39
que la clase
00:07:44
tenga sus propios
00:07:45
ofrezca los métodos
00:07:47
como la propiedad discos es privada
00:07:49
pues que tú no tengas que hacerlo
00:07:52
con un get desde el otro sitio
00:07:54
y luego añadir
00:07:56
sino que te ofrezca lo que tú
00:07:57
lo que tú quieras hacer, agregar disco
00:07:59
A ver, porque tú podrías
00:08:01
Quitar el get
00:08:08
Y ocultar toda tu implementación interna
00:08:09
Ocultar que es un set, que es una lista
00:08:12
Entonces si la ocultas
00:08:13
Tienes ya que publicar tú en métodos propios
00:08:15
Lo que tú dejas hacer
00:08:18
Agregar un disco, no sé qué
00:08:19
Entonces estás ocultando si es un set, una lista, lo que sea
00:08:20
Entonces es un diseño habitual
00:08:23
Pero en nuestro caso
00:08:25
Como nos pueden coger el set
00:08:26
Desde el get
00:08:29
vale, pues venga
00:08:30
un main con estas funcionalidades
00:08:32
de aquí, pues ala
00:08:34
vamos allá
00:08:36
vale, las funcionalidades las vamos a poner como métodos
00:08:36
aparte para probarlas
00:08:48
pues venga
00:08:49
la primera de ellas
00:08:51
vamos a
00:08:53
añadir
00:08:54
discos
00:08:58
como se van a pedir por teclado
00:09:01
ahí no se lo pasamos
00:09:10
se lo voy a llamar desde el main
00:09:11
efectivamente
00:09:13
como los vamos a pedir por teclado
00:09:15
han dicho, no los vamos a meter
00:09:17
ahí, pero ahí sí que vamos a meterle
00:09:19
el objeto al que
00:09:21
se lo vamos a añadir, pues entonces eso
00:09:23
vale, es a esta discoteca al que se lo vamos
00:09:25
a añadir, y ahora aquí ya
00:09:30
leemos
00:09:32
pues por ejemplo, lo primero que le
00:09:33
diríamos, en lugar de
00:09:36
hacerlo con un escáner
00:09:38
pues yo lo voy a hacer
00:09:40
con la otra
00:09:42
pues hazlo como
00:09:43
Por si luego importáis estos proyectos
00:09:45
Vosotros, me voy a acostumbrar a
00:09:54
Poner la librería dentro
00:09:55
Y así no tenéis luego que cambiarlo
00:09:58
Y os funciona
00:09:59
Si yo la pongo aquí
00:10:00
En una carpeta
00:10:03
Live
00:10:06
La pongo aquí en una carpeta
00:10:07
Live
00:10:12
La meto aquí
00:10:12
Paste
00:10:14
Y ahora ya
00:10:16
Actuil
00:10:20
Vale, pues entonces ahora ya
00:10:21
¿Cuántos discos quiere usted?
00:10:25
Pues nada
00:10:36
Estos discos quiere
00:10:37
Y ahora ya
00:10:43
Hacemos un
00:10:44
For
00:10:46
Solamente con N
00:10:48
Y ahora ya le decimos
00:10:50
El disco tiene el título y autor solamente
00:10:55
Título
00:10:57
Y autor
00:11:01
Claro, como lo va a meter seguido
00:11:02
Pues entonces, como ha dicho
00:11:06
Esto simplemente para practicar con ese método
00:11:08
Añadir y eliminar
00:11:10
Vamos a usar el método
00:11:12
AddAll y RemoveAll, que es añadir de golpe
00:11:13
Entonces vamos a crearnos una colección
00:11:16
Primero para meter esos
00:11:18
Y le hacemos un AddAll y ya está
00:11:19
Y así nos vamos
00:11:20
¿Eh?
00:11:21
Y con lo
00:11:24
Eh
00:11:25
¿Eh?
00:11:27
¿Eh?
00:11:29
A ver, espérate
00:11:29
Tú tranquila que forzaremos el error
00:11:38
Vale, por lo pronto estamos añadiendo ahora mismo
00:11:40
Entonces aquí no va a dar error en ningún caso
00:11:42
Vamos a esperar al remove, vale
00:11:44
Entonces vamos a crear aquí una colección
00:11:45
Y de hecho, nos da igual que sea una lista
00:11:48
Que una set, nos da lo mismo
00:11:52
Vamos a crear una colección de discos
00:11:53
Vale, vamos a crear una colección de discos
00:11:55
Y ahora en esta colección de discos
00:12:13
Temporal
00:12:14
pues vamos metiendo
00:12:15
un nuevo disco con los datos que me han dado
00:12:19
no sé en el
00:12:21
constructor en qué orden iban
00:12:24
en el constructor mío al menos
00:12:25
iban autor y título
00:12:27
pues entonces
00:12:29
es que todavía no tengo la colección
00:12:31
que voy a añadir de golpe
00:12:33
claro todavía no
00:12:34
ya sé, desvinculártelos a raíz
00:12:38
te cuesta
00:12:44
que no pasa nada
00:12:44
que si uno
00:12:50
pues al final se encariña
00:12:52
con quien se encariña, tampoco puede elegir
00:12:53
vale, pues ya hemos añadido
00:12:56
ya tenemos este for que está añadiendo
00:13:01
todo el rato a esta lista temporal
00:13:03
que nos hemos hecho, está añadiendo
00:13:05
todo el rato un nuevo disco
00:13:07
un nuevo disco
00:13:09
ahora ya
00:13:09
de mi colección dentro de la discoteca
00:13:12
que es esta
00:13:15
getDiscos de esta
00:13:16
yo ahora ya tengo un método addAll
00:13:18
al cual
00:13:21
le puedo pasar cualquier otra colección
00:13:23
cualquier otra
00:13:25
y se acabó y todos los discos de esta
00:13:27
colección, todos ellos van
00:13:29
al set
00:13:31
entonces es verdad que en esta colección
00:13:32
discos están ordenaditos
00:13:35
pero según se van metiendo al set
00:13:37
pues van cayendo ya en cualquier lado
00:13:39
¿vale?
00:13:41
el addAll los va sacando de la lista
00:13:43
y los va metiendo al set ahí a mogollón
00:13:45
si alguno
00:13:46
de los de esta lista
00:13:49
si alguno de los de esta lista
00:13:50
estuviera ya en el set, pues no lo metería
00:13:52
pero eso ya sabemos que funciona así
00:13:55
¿por qué utiliza una lista?
00:13:56
porque me da igual
00:14:01
o sea, he utilizado una lista
00:14:03
me he dicho, bueno, me da igual una lista, un conjunto
00:14:04
me da igual, vamos a ver que
00:14:06
para especificar que
00:14:08
aunque esto sea un set
00:14:09
yo le puedo meter todo lo que hay en una lista
00:14:11
en cualquier cosa
00:14:14
que sea colección, en cualquier cosa que sea colección
00:14:16
vale
00:14:19
entonces
00:14:22
el add all
00:14:23
vale
00:14:26
ya está
00:14:28
vale
00:14:43
entonces pensaba yo
00:14:45
que igual te devolvía el número de discos
00:14:47
que realmente he insertado
00:14:49
pero no, o sea te devuelve un boolean
00:14:50
que es true si se ha insertado
00:14:52
alguno al menos, o sea si ha habido
00:14:55
alguna modificación en el set y falso si no se ha
00:14:57
insertado ninguno. Pero esto ya sabemos
00:14:59
que es un set, con lo cual de esta colección
00:15:01
solo se van a insertar aquellos que
00:15:03
no estén previamente. Pero que
00:15:05
no estén, ¿cómo? Pues
00:15:07
según el criterio de igualdad entre discos.
00:15:09
Como no tenemos ninguno,
00:15:11
no tenemos ninguno,
00:15:13
pues se van a insertar todos.
00:15:15
Que yo, este usuario ha vuelto a
00:15:17
meter el disco
00:15:19
no sé qué
00:15:21
de no sé quién, y ese ya estaba.
00:15:23
Pues lo va a volver
00:15:26
Lo va a volver a añadir
00:15:27
¿Vale?
00:15:29
Entonces, si no queremos repetidos
00:15:31
Porque lo
00:15:33
Oye usuario, que el que me estás dando ya lo tengo
00:15:34
Pues si no queremos repetidos
00:15:37
Tendremos que ponerle en disco
00:15:39
Un jasco de equals
00:15:41
¿Vale?
00:15:42
Entonces, ¿por qué
00:15:45
Esta colección
00:15:47
Es un set?
00:15:49
Vale, pues ¿qué jasco de equals
00:15:51
Podríamos poner aquí?
00:15:53
A ver, aquí el jasco de equals en realidad deberían ser los dos porque un autor puede tener varios discos y un disco que se titula Hermoso Día puede tener varios autores.
00:15:57
¿No? Entonces, aquí es un ejemplo en el cual las claves primarias no tienen que ser siempre un único valor. La clave primaria puede ser múltiple, ¿verdad?
00:16:13
Es decir, el autor no identifica de forma única el disco, porque puede haber varios discos con el mismo autor.
00:16:27
Y el título tampoco lo identifica de forma única, porque puede haber varios autores que hayan coincidido en el título del disco.
00:16:34
¿Vale?
00:16:40
¿Qué podría ocurrir si no tienen mucha imaginación?
00:16:41
Y pasa.
00:16:45
Pues entonces no pasa nada, hacemos un jasco de equals con las dos propiedades.
00:16:46
Y ya está.
00:16:55
Entonces, solamente los objetos que coincidan en título y autor son considerados iguales, ¿vale?
00:16:56
Este jasco de equals que me ha generado considera tanto autor como título.
00:17:06
Vale
00:17:30
Bueno, pues entonces
00:17:34
Nos vamos al main
00:17:42
Pues ya está, añadir discos
00:17:45
Ahora, eliminar
00:17:46
Vale, pues lo mismo, vamos a decirle
00:17:47
Oye, ¿cuántos discos quieres eliminar?
00:18:06
Los vamos a meter en una colección
00:18:09
Aparte
00:18:10
Y luego le mandamos borrar
00:18:11
Las cuatro primeras líneas de arriba
00:18:14
Bueno, todas son idénticas
00:18:18
¿Cuántos discos quieres eliminar?
00:18:22
Todos estos discos
00:18:30
Guárdamelos a una colección aparte
00:18:31
Título autor, título autor
00:18:33
Y ahora a esta de aquí
00:18:34
De .get
00:18:36
Ah, que no le he pasado
00:18:41
Perdón
00:18:46
Este no se lo he pasado
00:18:46
Pues ahora ya a este punto
00:18:52
A esta colección
00:18:56
Bórrame todos aquellos
00:18:58
Que sean iguales
00:19:02
A alguno de estos de aquí
00:19:04
Y esto no da ningún tipo de error
00:19:07
Porque el error que os da a vosotros
00:19:09
Es un error que se genera
00:19:12
Cuando dentro de un for
00:19:14
Hay un remove
00:19:16
Porque anidas dos bucles
00:19:18
Y los dos bucles colisionan
00:19:20
En la colección
00:19:22
¿Vale?
00:19:23
Entonces, ¿cómo podríamos provocar el error?
00:19:25
Aquí lo que pasa es que vosotros igual
00:19:28
Habéis recorrido la colección, los habéis ido eliminando uno por uno
00:19:29
¿O cómo habéis hecho?
00:19:32
Para que os salga el error
00:19:33
Vale, vamos a hacer una cosa
00:19:34
Vamos a hacer un método
00:19:50
Que borra todos los discos
00:19:51
Del autor patatín
00:19:53
Que es un ejemplo
00:19:54
Que vamos a tener que hacer
00:19:56
Lo que vosotros habéis hecho
00:19:58
Forzar, eso, que es la misma idea
00:20:00
Ah, en la siguiente funcionalidad
00:20:03
En la última, vale
00:20:07
Por ahora vamos a añadir
00:20:08
Por ahora vamos a añadir
00:20:10
Un método extra para ver ese error
00:20:13
Por qué sale y cómo arreglarlo
00:20:14
Vamos a añadir un método extra
00:20:16
que es, vamos a borrar
00:20:18
todos los discos de un autor
00:20:20
porque ese autor
00:20:22
se ha condenado
00:20:23
la han cancelado, ha escrito un tweet
00:20:26
muy incorrecto
00:20:31
y han dicho, tú fuera
00:20:33
vamos a eliminar
00:20:35
todos los títulos que se llamen
00:20:38
de este
00:20:40
ala
00:20:45
todos los de este, entonces
00:20:48
aquí
00:20:49
vale
00:20:52
no tiene sentido
00:20:53
que nosotros
00:20:55
hiciéramos esto
00:20:57
de esto de aquí
00:20:59
vamos a ver, vamos a crearnos
00:21:01
un disco
00:21:04
de
00:21:04
igual a new disco
00:21:06
vamos a ponerle
00:21:11
a este disco
00:21:14
como propiedad autor
00:21:15
este autor de aquí
00:21:17
vale
00:21:18
y ahora
00:21:20
imaginaos que hacemos
00:21:22
de punto getDiscos y ahora
00:21:23
borrame uno igual a este
00:21:26
vale
00:21:28
esto no nos va a eliminar nada
00:21:32
está claro, ¿por qué?
00:21:34
porque ¿qué hace el método remove?
00:21:35
el método remove
00:21:37
te borra el disco que encuentre
00:21:39
en esta colección
00:21:42
igual a este
00:21:43
vale, pero para que sea igual
00:21:44
tiene que ser igual el autor y el título
00:21:48
y este disco, su autor es este
00:21:50
pero su título es null
00:21:52
yo no se lo he fijado, es null
00:21:54
entonces no te va a encontrar ninguno igual a ese
00:21:55
¿vale?
00:21:58
claro, porque es que el problema es que yo quiero borrar
00:22:00
no solo uno, uno igual a ese
00:22:02
sino quiero borrar todos
00:22:04
los cuyo autor sea este
00:22:06
por eso aquí no fijo el título
00:22:08
claro, yo aquí no fijo el título
00:22:10
no lo fijo, porque
00:22:14
yo quiero borrar todos
00:22:16
los que tienen como autor este
00:22:18
y título cualquiera
00:22:20
entonces no puedo hacerlo con un remove sin más
00:22:21
así no puedo
00:22:24
lo puedo hacer con un remove sin más
00:22:25
si me dijeran
00:22:28
borra el
00:22:29
claro, borra
00:22:31
este autor
00:22:33
y de este autor borra
00:22:35
su disco que se llama así
00:22:37
este en concreto
00:22:40
entonces sí, porque el método equals
00:22:42
utiliza los dos
00:22:44
entonces, ahora ya
00:22:45
lo tendría resuelto, le digo, oye tú
00:22:46
borra ese disco
00:22:49
que encuentres igualito a este
00:22:51
entonces, él coge el autor de ese
00:22:53
el título de ese
00:22:55
que ya se lo he fijado los dos, busca
00:22:57
uno igualito a ese y te lo elimina
00:22:59
pero ese no es el problema
00:23:01
que nos han dado, el problema que nos han dado es
00:23:03
no, no, no, bórrame todos
00:23:05
los del autor, luego un único remove no nos vale
00:23:07
porque el remove es para borrar
00:23:09
uno igual a ese
00:23:10
luego un único remove no nos vale
00:23:12
vale, vale, entonces
00:23:14
¿qué es la siguiente cosa que nos plantearíamos hacer?
00:23:17
bueno, pues voy a recorrer la colección
00:23:19
voy a recorrer la colección
00:23:21
que como es un set
00:23:23
la tengo que recorrer con un for each
00:23:26
no sabemos, hasta ahora no sabemos de otra manera
00:23:28
si fuera una lista
00:23:30
podríamos recorrerla con un for de índice
00:23:33
desde igual a cero, mientras sea menor que el tamaño
00:23:35
de la lista, pero como es un set
00:23:37
un for each, no tenemos otra historia
00:23:39
vale, pues para cada disco
00:23:41
en
00:23:45
de
00:23:48
que es la discoteca que me han dado como parámetro
00:23:50
punto get discos
00:23:53
vale, para cada disco
00:23:54
dis
00:23:57
en esta
00:23:59
pues ahora, podríamos preguntarnos
00:23:59
a ver, este es uno de los que yo quiero borrar
00:24:02
o lo que es lo mismo
00:24:04
dis.get autor
00:24:05
resulta que es igual
00:24:07
al autor que me han dado
00:24:10
¿vale? que esta no es
00:24:12
la igualdad total del objeto
00:24:14
no es la igualdad, esta es solo la igualdad
00:24:17
en autor
00:24:19
claro, la igualdad en el string autor
00:24:19
¿vale? este disco
00:24:22
dis resulta que su autor
00:24:25
es igual que este
00:24:27
autor, es igual que este autor
00:24:28
pues sí
00:24:31
es igual
00:24:32
¿vale? entonces
00:24:34
tendríamos que borrar este disco
00:24:36
¿y qué haríamos? pues yo cojo
00:24:39
mi discoteca esta de aquí
00:24:40
que la saco con dis.getDiscos
00:24:42
y le digo
00:24:45
oye, bórrame
00:24:46
este disco dis, que es el que quiero borrar
00:24:47
este dis, que es el que he comprobado
00:24:50
que el autor es igual a este
00:24:53
este dis, que es el que tú quieres borrar
00:24:54
este, bórramelo
00:24:56
y así con el for todo el rato
00:24:57
pasamos al siguiente dis
00:24:59
su autor es igual al autor que me han dado
00:25:01
también lo es, pues ala
00:25:04
de esa colección
00:25:06
borra el igual a ese
00:25:08
vale, y así creeríamos
00:25:09
que estamos borrando las cosas
00:25:12
y esto a nivel de código
00:25:13
está bien, tiene sentido
00:25:15
está bien hecho, vale
00:25:17
vamos a
00:25:19
public static, me falta el void
00:25:22
vale
00:25:23
vamos a hacer una pequeña
00:25:25
prueba, primero en
00:25:28
mi main, añadiendo
00:25:30
unos discos
00:25:32
vale, vamos a llamar
00:25:33
primero vamos a crear la discoteca
00:25:36
Claro, discoteca
00:25:38
De una nueva
00:25:40
Discoteca, aquí veis que bien
00:25:42
Me viene el constructor solo con la temática
00:25:44
Me viene genial el constructor solo con la temática
00:25:46
Porque, joel, nunca he visto tantos bostezos
00:25:49
Simultáneamente
00:25:50
Bueno, me viene muy bien una
00:25:51
Un constructor solo con la temática
00:25:53
Porque
00:25:57
Le digo, ¿de qué va a ser tu discoteca?
00:25:58
Pues va a ser de jazz
00:26:00
Muy bien
00:26:02
Toma ya, y la colección no la
00:26:04
Ahí está. No la inicializo porque ya se inicializa
00:26:06
aquí.
00:26:08
Ya se inicializa aquí.
00:26:10
Es maravilloso.
00:26:15
Lo que pasa es que es unos osos.
00:26:16
Claro, es que es tan amplio.
00:26:20
Vale, pues entonces,
00:26:23
ahora vamos a añadir unos cuantos discos.
00:26:24
Vale.
00:26:39
Y ahora
00:26:40
vamos a borrar unos cuantos
00:26:42
discos.
00:26:44
entonces vamos a poner aquí
00:26:44
un este
00:26:52
para
00:26:54
que sepamos donde
00:26:54
empieza este método
00:26:57
venga
00:27:01
vamos a ejecutar esto
00:27:04
a ver si nos añade y nos borra
00:27:05
porque aquí podemos haber hecho cualquier tontería
00:27:08
depende de si el que borra
00:27:11
es justo el último
00:27:14
si coincide que el que tiene que borrar es justo el último
00:27:15
pero bueno
00:27:17
vale, ¿cuántos vamos a meter?
00:27:19
Venga, vamos a meter tres. Autor, pues el autor va a ser A1 y su título va a ser título 1. El segundo autor, el A1, también va a tener otro disquito, que es el título 2.
00:27:21
Y luego vamos a tener un autor 2, cuyo título es el título 3.
00:27:35
Entonces, tenemos tres autores.
00:27:44
El A1, que ha hecho dos discos, y el A2, que ha hecho un disco solo.
00:27:48
¿Cuántos discos...?
00:27:53
¿Por qué me pregunta esto? Un momentito.
00:27:57
Me tendría que preguntar el autor, ¿no?
00:28:00
Un momentín.
00:28:03
a ver
00:28:05
ah, es que he llamado
00:28:08
elimina discos, no, yo quiero
00:28:17
probar elimina autor, para probar he llamado
00:28:19
he probado elimina discos, bueno ya que lo he lanzado
00:28:21
vamos a probar a ver si nos elimina los discos
00:28:23
y nos da error, ¿cuántos discos?
00:28:25
pues venga, vamos a borrar
00:28:27
el autor 2
00:28:28
con el título 3 y ya está
00:28:31
a ver si nos da algún error o no
00:28:32
¿cuántos discos
00:28:34
quiero borrar? pues quiero borrar un disco
00:28:37
Autor
00:28:39
A2 y título 3
00:28:41
No ha dado error
00:28:44
Seguramente sé de eliminar discos
00:28:46
Este bien hecho
00:28:48
Vale, y ahora ya yo quería probar
00:28:49
El elimina autor
00:28:52
No elimina discos
00:28:53
Voy a probar este
00:28:55
Elimina autor
00:28:57
Vamos a borrar
00:29:01
Entonces le vamos a decir
00:29:05
Autor a borrar
00:29:06
Autor a borrar
00:29:09
leemos el autor a borrar
00:29:13
y ahora ya
00:29:16
a elimina autor le decimos
00:29:23
bórrame todos los de este autor
00:29:25
en esta discoteca que acabas de hacer
00:29:27
y en la que acabas de agregar discos
00:29:29
vale
00:29:31
otra vez
00:29:33
ejecutamos
00:29:35
vamos a meter 3
00:29:36
el autor 1
00:29:39
te ha hecho un disco
00:29:41
t1
00:29:44
el autor 1 te ha hecho un disco
00:29:44
t2
00:29:47
y el autor 2
00:29:48
te ha hecho un disco T3
00:29:50
vale, vamos a borrar
00:29:52
¿a quién quieres borrar? al autor 1
00:29:55
pam, ¿vale?
00:29:56
era de esperar porque estamos
00:29:59
borrando autores que están ahí metidos
00:30:00
en la colección, es este concurrent
00:30:03
este de aquí
00:30:05
entonces, este error ha salido
00:30:05
de esto, vale
00:30:10
ha salido de esta situación
00:30:12
que
00:30:16
dentro de un for en el que yo estoy recorriendo
00:30:18
estoy borrando
00:30:20
también, entonces esta colección
00:30:22
getDiscos
00:30:24
ya se ha apropiado de ella el forEach
00:30:25
porque ya la está recorriendo
00:30:27
y el remove se quiere meter también en ella
00:30:29
a recorrerla, porque tiene que recorrerla
00:30:31
también hasta que encuentre el disco
00:30:34
igual a dis y borrarlo
00:30:35
pues no, no, con dos no
00:30:36
aquí estos tríos
00:30:39
no le van, tiene que ser o uno o el otro
00:30:43
con lo cual, ¿cómo arreglamos esto?
00:30:45
pues esto no nos gusta
00:30:48
vale
00:30:48
pues en esta situación en concreto
00:30:50
cuando queremos
00:30:53
borrar por otros
00:30:58
datos que no son la clave
00:31:03
primaria, es decir
00:31:04
lo que está en el equals
00:31:09
o hashcode
00:31:10
si es que es un set, porque esto es igual para
00:31:13
lista que para set, me da lo mismo
00:31:15
no podemos
00:31:16
anidar
00:31:23
remove en el
00:31:24
for each
00:31:29
es porque
00:31:30
da una excepción
00:31:34
de
00:31:36
concurrencia.
00:31:37
Vale.
00:31:41
Eso, esa situación,
00:31:42
la hacemos con un iterador.
00:31:44
Vale, que el iterador además te ofrece
00:31:52
otras funcionalidades y todo eso.
00:31:54
Pues venga, ¿cómo hacemos esto mismo?
00:31:56
Esto ya lo hemos comentado. Vale.
00:31:58
Pues el iterador es un objeto que es capaz de iterar
00:32:00
por una colección, como su nombre indica.
00:32:02
y el iterador pertenece a la clase iterator
00:32:04
vale, pues el iterador hay que decirle
00:32:06
es una clase genérica, hay que decirle tú sobre qué vas a iterar
00:32:10
sobre qué tipo de objetos, en este caso
00:32:13
como nuestra colección es de discos, pues le decimos
00:32:16
oye iterador, tú vas a iterar sobre una colección
00:32:19
que tiene discos, si quisiéramos iterar
00:32:22
sobre una colección que no está parametrizada, que puede tener cualquier cosa
00:32:25
pues podríamos crear el iterador así
00:32:28
pero como en nuestro caso es una colección de discos
00:32:30
parametrizada a discos, pues iteramos así
00:32:34
vale, pues este iterator
00:32:36
¿cómo se instancia? ¿cómo se crea?
00:32:38
pues tendremos que coger la colección
00:32:41
en la cual queramos iterar
00:32:43
que en nuestro caso es de .getDiscos
00:32:45
y esa colección tiene un método
00:32:48
que es el método iterator
00:32:50
que te genera un iterador y te lo devuelve
00:32:52
uno pone la colección que sea
00:32:55
de la que quiere sacar el iterador
00:32:58
y con este método
00:33:00
saca ese objeto iterador
00:33:02
y te lo devuelve
00:33:04
vale, pues ya está, ya tenemos el iterador
00:33:05
que está en java útil
00:33:08
lo importamos y ya está
00:33:10
y ahora este objeto iterador
00:33:12
tiene métodos
00:33:14
para avanzar por mi colección
00:33:16
y devolverme los objetos
00:33:19
en los que está posicionado
00:33:21
según avanza y hacer cosas con ellos
00:33:22
¿cuál es el método
00:33:24
más importante de el iterador?
00:33:26
pues deliterador si vemos lo que tiene
00:33:29
tiene muchas cosas
00:33:34
pero tiene un método
00:33:38
next
00:33:42
que es el que sirve para
00:33:43
avanzar, el literador
00:33:45
inicialmente está colocado
00:33:47
antes del primero, el literador está
00:33:49
colocado antes del primero y cada
00:33:51
next que hacemos le avanza una posición
00:33:53
con lo cual para empezar por
00:33:55
el primero ya hay que hacer un primer next
00:33:58
para luego pasar al segundo hay que hacer un segundo
00:33:59
next, para luego pasar al tercero
00:34:02
hay que hacer un tercer next.
00:34:04
Ese es el método más importante.
00:34:05
Y luego tiene hashNext que te dice
00:34:08
¿hay un siguiente? O sea, ¿tiene sentido
00:34:09
que hagas un next porque hay un siguiente?
00:34:11
True si hay un siguiente,
00:34:14
con lo cual tú avanzas, y false si no.
00:34:16
Entonces, la combinación de estos
00:34:18
dos métodos en un bucle
00:34:20
es la que te permite ir avanzando con el iterador.
00:34:21
Y luego, aparte, pues iterator
00:34:24
pues tiene
00:34:26
métodos para hacer cositas, pero como veis
00:34:26
muy poco.
00:34:30
Justo. Claro, entonces, ¿cómo
00:34:32
usamos un iterador para recorrer
00:34:34
una colección.
00:34:36
Pues hacemos. Mientras. ¿Mientras qué?
00:34:38
Pues mientras tenga siguiente.
00:34:40
Mientras tenga
00:34:43
siguiente.
00:34:44
Mientras tenga siguiente. Vale.
00:34:45
Pues mientras tenga siguiente.
00:34:48
Hacemos un next. ¿Vale?
00:34:50
Para colocarnos en ese siguiente.
00:34:52
Ese next
00:34:55
coloca el iterador en el siguiente.
00:34:56
Y te lo devuelve como parámetro.
00:34:58
Entonces si tú quieres hacer algo con él
00:35:00
porque quieres pues
00:35:01
como es un disco, pues lo podemos guardar aquí
00:35:04
por ejemplo, y yo aquí
00:35:06
con este disco, pues podría
00:35:11
cambiarle una propiedad, cambiarle
00:35:13
el autor
00:35:15
mostrarlo, lo que quisiera
00:35:15
pero en particular, el iterador
00:35:18
te permite borrar
00:35:21
el elemento en el que estés
00:35:23
te permite borrarlo
00:35:24
claro, con el
00:35:26
método remove
00:35:29
que está sincronizado con el while
00:35:30
y al estar sincronizado no te da
00:35:33
concurrencia, entonces este bucle
00:35:35
en particular que he hecho te los estaría borrando todos
00:35:37
pero no, no queremos borrar todos
00:35:39
queremos borrar solo los que sean
00:35:41
autor, pues entonces aquí lo que incluiríamos es
00:35:43
a ver, si este disco
00:35:45
de aquí, su autor
00:35:47
resulta que es igual
00:35:49
al autor que me han dado como parámetro
00:35:51
pues entonces
00:35:53
it, porque ahora
00:35:55
me it está posicionado ahí
00:35:57
remove, y esto no
00:35:58
nos va a dar error de concurrencia, porque
00:36:01
el iterador ya es un objeto
00:36:03
aparte que gestiona la concurrencia
00:36:05
entre el while y...
00:36:07
¿Vale?
00:36:09
Un segundinín que digo lo último y ya me preguntas.
00:36:14
O es un descansito, era.
00:36:17
Vale, pues digo lo último y un descansito.
00:36:19
Cuidado aquí.
00:36:21
Yo lo he...
00:36:23
¿Vale? Cuidado aquí porque
00:36:25
cada it next que hagas
00:36:26
te avanza.
00:36:28
Entonces, imaginaos que en lugar de haberlo
00:36:30
guardado aquí,
00:36:32
yo hago un it next,
00:36:33
Por ejemplo, imaginaos que hago esto
00:36:35
Pensando, avanza
00:36:39
Y ahora como no lo tengo guardado en ningún sitio
00:36:42
Pues sustituyo esto por esto
00:36:45
Cuidado, o sea, cada next te avanza una posición
00:36:47
No, a ver
00:36:50
Lo que estoy diciendo, itnext.getAutor
00:36:53
A ver, cuidados
00:36:57
Cada next te avanza una posición
00:36:59
Entonces imaginaos que yo he hecho un itnext aquí
00:37:01
Creyendo que con eso avanzo
00:37:03
para el literador, que es lo que tengo que hacer, efectivamente
00:37:04
lo he avanzado, vale
00:37:06
e in next me devuelve el objeto disco
00:37:08
vale, pero si vuelvo a hacer otro
00:37:10
in next aquí para coger el objeto disco
00:37:12
ya me he avanzado al siguiente
00:37:15
entonces, dentro de este
00:37:17
while, estaría avanzando
00:37:19
de dos en dos, avanzo uno
00:37:20
y luego avanzo otro, y ya de este miro el autor
00:37:22
entonces, cuidado
00:37:25
por eso lo he guardado en un sitio
00:37:26
para no avanzarlo dos veces
00:37:28
lo he guardado aquí, digo, a ver, avanza una vez
00:37:30
solo una, avanza una
00:37:33
el disco al que has avanzado es este
00:37:34
vale, pues si este disco
00:37:37
y este disco
00:37:39
su autor es este
00:37:41
me lo borras, porque el iterador está
00:37:42
colocado en él, vale, ojo
00:37:45
porque cada it next dentro del
00:37:47
bucle, va, te va saltando, te va saltando
00:37:49
dime
00:37:50
el it next, lo que te devuelve
00:37:51
es el disco anterior al que has saltado
00:37:55
no, no, no, el disco en el que te acabas de
00:37:57
colocar, it
00:37:59
el iterador inicial, si tu
00:38:00
colección es este, este y este
00:38:03
de tres, el iterador inicialmente
00:38:04
se queda colocado antes del
00:38:06
primero, entonces
00:38:08
el primer itnex se coloca en el primero
00:38:10
y te devuelve el primero, y hasta que
00:38:12
tú no hagas un itnex, el iterador está
00:38:14
ahí colocado, vale
00:38:16
si yo hiciera otro itnex ya estaría en el siguiente
00:38:18
entonces por eso la mejor forma de no
00:38:20
colocar, de no confundirse
00:38:22
es que tú hagas un
00:38:25
itnex, cojas el objeto
00:38:26
con ese objeto hagas ya todo lo que
00:38:28
quieras aquí, no vaya a ser que te saltes
00:38:30
al siguiente sin querer, hagas todo lo que quieras
00:38:32
y no hagas el siguiente index hasta
00:38:34
la siguiente vuelta
00:38:36
¿vale? entonces
00:38:37
esta versión ya no nos va a dar ese error
00:38:39
la probamos y descansamos
00:38:43
vale
00:38:47
vamos a volver a ejecutar esto
00:38:50
a ver si lo hemos escrito bien
00:38:52
vamos a meter tres autores
00:38:54
vamos a simular la misma situación de antes
00:38:56
el autor uno que me ha escrito
00:38:58
este disco
00:39:01
el autor uno que ha
00:39:02
escrito este otro
00:39:04
y el autor 2 que ya ha escrito
00:39:06
uno cualquiera
00:39:10
vamos a borrar el autor a 1
00:39:12
y aquí no da error
00:39:16
a ver si lo visualizará con un for
00:39:18
veríamos que sí, que efectivamente me los ha borrado
00:39:21
solo hay uno, lo podríais añadir
00:39:22
que lo recorra para ver si están
00:39:25
pero como veis aquí no ha dado el error
00:39:26
en una situación idéntica a la anterior
00:39:29
¿vale?
00:39:30
no hombre, no
00:39:33
y venga
00:39:36
- 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:
- 19
- Fecha:
- 13 de febrero de 2025 - 13:13
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 39′ 38″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 182.21 MBytes