Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 02-04-24 - 1 - 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 esta era la famosa jerarquía de las colecciones, en las cuales efectivamente aquí nos falta eso de los mapas, nos falta, ¿verdad?
00:00:03
Había una primera interfaz iterable que no ofrece prácticamente ningún método, solamente el de general iterator, de esa heredaba collection, que incorporaba métodos abstractos, porque esto que está en azulito son interfaces.
00:00:14
lo que está en azulito
00:00:31
son clases vacías
00:00:34
o clases abstractas o interfaces
00:00:37
lo que está en azulito
00:00:38
y lo que está en amarillo
00:00:40
esto ya sí que eran clases implementaciones
00:00:41
y implementaciones
00:00:45
entonces en la raíz
00:00:46
de la jerarquía de colecciones estaba esta
00:00:48
interfaz que lo único que
00:00:50
obligaba era a tener un método vacío
00:00:52
iterator para crear un iterador
00:00:55
de ese le daba
00:00:56
collection que además
00:00:58
te incorporaba métodos para
00:01:00
añadir, borrar
00:01:01
y poquito más, entonces cualquiera
00:01:04
que implementaba de aquí tenía que incorporar esos
00:01:06
métodos y luego ya teníamos
00:01:08
las dos grandes
00:01:10
variantes
00:01:12
la de list y la de set
00:01:12
que la de list ya te incorporaba
00:01:16
un chorizo de métodos
00:01:18
para recuperar por posición, etc
00:01:19
y luego serían las implementaciones
00:01:22
¿vale?
00:01:24
que de list pues ya
00:01:26
sabemos que teníamos estas
00:01:28
ArrayList, LinkedList
00:01:29
y estas dos
00:01:32
antiguas
00:01:34
las
00:01:35
primeras versiones
00:01:36
y luego de Set, pues
00:01:39
estas. Vale, entonces aquí en esta
00:01:41
jerarquía no aparecen los mapas
00:01:45
¿vale? Porque los mapas
00:01:47
no heredan de aquí, van por libre
00:01:49
Entonces, ¿qué es un mapa?
00:01:51
Dentro del término colecciones, en general
00:01:53
se mete lo de los mapas porque vale
00:01:55
para guardar cosas
00:01:57
entonces en general se interpreta como colecciones
00:01:58
todo lo que vale para guardar objetos
00:02:01
entonces los mapas valen para guardar objetos
00:02:03
pero de una forma un poquito distinta
00:02:06
entonces vale para guardar objetos
00:02:08
pero de una forma un poquito distinta
00:02:11
y por eso no heredan ni de colección
00:02:13
ni de iterator ni de nada
00:02:16
porque funcionan de manera un poco distinta
00:02:17
y van por libre
00:02:19
pero valen también para guardar cosas
00:02:20
bueno pues los mapas
00:02:22
¿en qué se basan?
00:02:25
los mapas en realidad tienen una jerarquía
00:02:26
Mucho más sencillita
00:02:27
Que es
00:02:29
Esto de aquí, en realidad
00:02:30
¿Me lo doy?
00:02:33
¿Me puedo poner esto más grande o qué?
00:02:39
Ay
00:02:42
De verdad, estos niños tan listos de hoy en día
00:02:43
A ver, venga
00:02:45
Vamos a ver
00:02:47
Esto, le di
00:02:48
Lo conseguí, me costó
00:02:50
Vale
00:02:53
Eh, destruir más, ¿verdad?
00:02:54
Sí, vale, la jerarquía es más sencillita
00:02:57
¿Vale?
00:03:00
Esta es la interfaz map, la superinterfaz, que tiene unos métodos que luego implementan las implementaciones HashMap, LinkedHashMap y TrimMap. Estas son, ¿vale? Las tres implementaciones, porque esta es otra interfaz intermedia, esta también es una interfaz.
00:03:01
estas son las tres impermeaciones
00:03:20
y como veis
00:03:22
tienen un nombrecito
00:03:23
prácticamente igual
00:03:25
que haset, linked, haset
00:03:27
y triset, pero cambiando
00:03:30
set por map
00:03:32
porque por dentro en realidad
00:03:33
el funcionamiento
00:03:36
es como haset, linked, haset
00:03:37
triset, salvo
00:03:40
por una pequeña variante que veremos ahora
00:03:42
y el hastable
00:03:44
esta es como la versión antigua
00:03:46
del diccionario, del mapa
00:03:48
la versión antigua, pues como vector y stack
00:03:50
eran la versión antigua de las listas
00:03:52
pues el hash table es como
00:03:55
la primera versión de este concepto de mapa
00:03:56
la primera versión
00:03:58
pero estas de alguna manera son un poco las
00:03:59
implementaciones más
00:04:02
utilizadas, no nos vamos a
00:04:04
volver locos con ellas, simplemente
00:04:06
¿para qué existen?
00:04:08
existen para reproducir
00:04:10
una idea que se utiliza
00:04:12
muchísimo y está
00:04:14
precisamente relacionada con la famosa
00:04:16
clave primaria que mencionamos siempre
00:04:18
La mayoría de los objetos, de los conceptos, de las cosas, es muy útil que tengan algo que los identifique de forma única para poder gestionarlos de forma fácil.
00:04:20
Si todos los objetos tienen algo que los identifica de forma única, los vamos a gestionar de manera mucho más fácil.
00:04:31
¿Vale? Esa es la idea de partida.
00:04:38
Entonces, esa propiedad que los identifica de forma única es lo que normalmente conocemos como clave, con el término clave, ¿verdad?
00:04:40
En informática, el término clave está asociado a identificador único.
00:04:48
Clave tiene como significado, en términos informáticos, identificador único.
00:04:55
Bueno, pues entonces, lo que hacen los mapas es guardar objetos con un identificador único asociado.
00:05:01
Pero ese identificador único asociado va fuera del objeto, no es una propiedad interna.
00:05:10
No es una propiedad interna.
00:05:16
Entonces tienes tu objeto ciudad, lo guardas en el mapa
00:05:17
y le asocias un identificador único que lo guardas por libre.
00:05:20
Entonces por eso los mapas se le llaman diccionarios.
00:05:25
¿Por qué un diccionario es eso?
00:05:27
La lista de palabras del diccionario serían las claves o identificadores únicos.
00:05:29
Todas las palabras de diccionario son distintas.
00:05:35
Todas son diferentes.
00:05:37
Todas.
00:05:38
Las 3.000 que haya.
00:05:38
Todas son distintas.
00:05:39
Y el significado sería el objeto en sí.
00:05:41
lo que se llama en el mapa el valor
00:05:44
entonces un mapa
00:05:46
o un diccionario que son
00:05:48
sinónimos, son sinónimos mapa
00:05:50
y diccionario, es un
00:05:52
conjunto de pares
00:05:54
que son clave, valor
00:05:55
clave, valor, clave, valor, es un conjunto
00:05:58
de pares y la clave
00:06:00
tiene que ser única
00:06:02
y el valor puede estar repetido
00:06:03
en diferentes pares, puede estar repetido
00:06:06
entonces es como un diccionario
00:06:08
un diccionario es una secuencia
00:06:10
de palabras donde las palabras serían
00:06:12
la clave, son todas distintas.
00:06:14
Y los significados
00:06:16
serían el valor.
00:06:17
Los significados sí que se pueden repetir.
00:06:20
¿No? Puede haber
00:06:23
dos palabras distintas
00:06:24
que tengan el mismo significado.
00:06:26
¿Verdad?
00:06:29
Bueno, pues ese es el concepto
00:06:30
de mapa o diccionario.
00:06:32
Un conjunto de pares
00:06:33
es un conjunto de pares
00:06:35
¿vale?
00:06:41
De esta forma, clave, valor.
00:06:44
eso es un diccionario, clave, valor
00:06:46
eso es un mapa, un conjunto de pares
00:06:51
clave, valor, clave, valor
00:06:59
lo que lo define
00:07:00
las claves tienen que ser
00:07:03
distintas, las claves tienen que ser
00:07:05
distintas para todos los elementos
00:07:07
del mapa
00:07:09
todos los elementos que forman un mapa
00:07:09
tienen que tener claves diferentes
00:07:12
la clave tiene que ser única
00:07:14
pero los valores
00:07:16
se pueden repetir
00:07:18
este sería un mapa válido
00:07:20
uno
00:07:23
por lo que fuera
00:07:24
¿vale? esto es un mapa válido
00:07:27
porque las claves son únicas
00:07:48
uno, dos, tres
00:07:50
no tienen por qué ser numéricas
00:07:52
no tienen por qué ser numéricas
00:07:54
la clave puede ser cualquier valor, cualquier tipo de dato
00:07:56
no tienen por qué ser numéricas
00:07:59
lo importante es que todos los pares
00:08:02
que forman el mapa
00:08:05
tengan diferentes valores en esta clave
00:08:06
sean números, sean letras
00:08:08
pero sean diferentes
00:08:11
pero el valor puede estar repetido
00:08:12
entonces este es un mapa válido
00:08:14
este también es un mapa válido
00:08:15
también es un mapa perfectamente válido
00:08:18
el valor de este y el valor de este son iguales
00:08:20
pero la clave no
00:08:22
que es lo que importa
00:08:24
este sin embargo no es un mapa válido
00:08:25
este no es un mapa válido porque
00:08:28
hay dos claves repetidas
00:08:29
bueno pues entonces
00:08:31
la interfaz map
00:08:35
lo que busca es una manera
00:08:36
lo que programa es una manera de guardar mapas
00:08:39
guardar conjuntos de pares
00:08:42
que funcionen así, es lo que guarda
00:08:43
es lo que, para lo que está hecha esa interfaz
00:08:45
map, para guardar conjuntos
00:08:47
de pares, y es muy útil
00:08:49
porque muchas veces a nuestros objetos
00:08:52
no tienen ellos
00:08:53
en sí una propiedad
00:08:55
interna, que podamos
00:08:58
asegurar que es única, no la tienen
00:08:59
es que eso es lo que hay que ver con
00:09:01
cualquier objeto que esté
00:09:03
almacenado en un set, yo supongo que tiene
00:09:07
una hash, y la hash es
00:09:11
un identificador también, sí
00:09:13
claro, pero esto
00:09:15
lo que te permite es
00:09:17
que sea visible para ti
00:09:18
claro, entonces lo que te permite
00:09:20
es otra forma de guardar las cosas
00:09:22
y localizar por ella
00:09:24
entonces es más fácil
00:09:27
porque si cada uno tiene un código
00:09:28
único, asociado, visible
00:09:31
para ti, que tú has decidido
00:09:32
pues puedes recuperar por él, por ejemplo
00:09:34
puedes decir, devuélveme
00:09:36
el objeto de clave 2, por ejemplo
00:09:38
entonces te optimiza a trabajar
00:09:41
con ello
00:09:43
de alguna manera es que hay
00:09:43
muchas situaciones
00:09:46
en las cuales hay objetos
00:09:48
que ya de por sí tienen asociado
00:09:50
un identificador que es único, que no tiene por qué
00:09:52
estar generado por una clave hash
00:09:54
sino el identificador que tú asocias, pues por ejemplo
00:09:56
yo tengo aquí un conjunto de alumnos
00:09:58
y cada uno de ellos tiene un DNI
00:10:00
claro, entonces
00:10:02
yo aquí tengo un conjunto de alumnos
00:10:04
entonces los alumnos están
00:10:07
caracterizados por nombre y nota
00:10:08
por ejemplo, pero yo sé
00:10:10
que además cada uno de ellos tiene un DNI que es único
00:10:12
entonces puedo decidir que mi forma de gestionarlo
00:10:14
sea un conjunto
00:10:17
de pares donde
00:10:19
la clave sea el DNI que elijo yo
00:10:21
cuál es la clave, no tiene por qué provenir de
00:10:23
aplicar una función hash, la clave
00:10:25
sea el DNI y el objeto
00:10:27
sea el objeto alumno, el valor
00:10:29
entonces es una opción más
00:10:31
y en este caso es interesante porque entonces yo
00:10:33
ya puedo recuperar por DNI
00:10:35
dame el par con DNI 3
00:10:37
por ejemplo, 3 tiene mucho más sentido
00:10:39
porque yo aquí elijo la clave que me da la gana
00:10:41
Con que sea única, no hace falta que sea una función de hash ni nada.
00:10:43
Entonces, en una situación que se da, que yo me di cuenta de que le pega esto,
00:10:49
que le pega, pues uso los mapas y son muy útiles por eso,
00:10:54
porque la clave ahora ya me sirve como elemento para decidir cuál borro, cuál recupero, etc.
00:10:58
En un set, yo no puedo recuperar por clave hash.
00:11:05
En un set yo lo que puedo hacer es iterar a ver lo que tengo.
00:11:09
o puedo borrar y le doy un objeto
00:11:12
y que me borre el igual a ese
00:11:14
pero no puedo hacer más que eso
00:11:15
¿vale? sin embargo en esta estructura
00:11:17
pues tengo más posibilidades
00:11:20
¿vale? pues entonces puede ocurrir
00:11:22
que yo ya he decidido que hay una situación
00:11:24
que se presta a eso, tengo objetos
00:11:26
y tengo además
00:11:28
algo
00:11:30
que los identifica de forma única
00:11:31
que no tiene por qué ser una propiedad del objeto
00:11:34
que esa es otra ventaja, no tiene por qué ser
00:11:36
a lo mejor mi objeto alumno tiene DNI dentro
00:11:38
y yo no se lo puedo poner
00:11:40
no se lo puedo poner porque no puedo modificar la clase
00:11:42
no puedo poner el DNI
00:11:44
pero yo sí sé que hay una propiedad
00:11:46
DNI, o sea que los abogados tienen un DNI único
00:11:49
pues digo, estupendo
00:11:51
me hago un map
00:11:52
que tenga por un lado el DNI
00:11:54
y por otro lado el propio objeto
00:11:56
y me permite hacer ya muchas cosas
00:11:58
con esta estructura
00:12:01
entonces como en otros casos
00:12:02
esta es una, un recurso más
00:12:05
es un recurso más para usar
00:12:07
un recurso más y uno selecciona
00:12:08
de todos los recursos que tiene el que ve que le pega
00:12:10
más con la situación que está estudiando
00:12:13
¿vale? bueno pues este
00:12:14
recurso en concreto vale para eso
00:12:16
para guardar pares
00:12:18
y en esos pares
00:12:20
el primer elemento que es el que
00:12:23
se llama clave, tiene que ser único
00:12:24
y normalmente elegiremos
00:12:27
algo que identifique de forma única
00:12:29
al objeto que viene después
00:12:31
que es lo que se llama valor
00:12:32
y el valor puede estar repetido, puede no estarlo
00:12:34
etc.
00:12:37
Entonces, es un mapa.
00:12:38
¿Vale?
00:12:41
Entonces, vamos a hacer unos pequeños ejemplos
00:12:41
de cómo se usan y poco más.
00:12:43
Ejemplo triset y ejemplo mapas.
00:12:48
Bueno, pues, por ejemplo,
00:13:20
vamos a hacer eso mismo que ha surgido.
00:13:21
¿Vale?
00:13:26
Pues, resulta que estamos trabajando con alumnos,
00:13:27
la clase alumno,
00:13:29
y la clase alumno, por la razón que sea,
00:13:30
solo tiene estas dos propiedades.
00:13:32
vamos a hacerle un constructor
00:13:33
con los dos parámetros
00:13:48
y get y set, pues bueno, ya por hábito
00:13:49
vale, y ahora ya
00:13:55
para trabajar con estos alumnos
00:14:04
habría millones de
00:14:06
posibilidades
00:14:08
en función de la aplicación con la que ya estoy trabajando
00:14:09
ahora ya, claro
00:14:12
hay millones de cosas que se puede hacer con esto
00:14:14
en función de la aplicación
00:14:16
entonces, pues bueno
00:14:17
resulta que ahora mi aplicación
00:14:19
vamos a meterla en la clase main
00:14:22
como siempre
00:14:24
mi aplicación es esta, la que está allá en el main
00:14:25
entonces mi aplicación
00:14:34
tiene que trabajar con alumnos
00:14:36
y hacer cosas con los alumnos
00:14:37
pues las medias, las notas
00:14:40
recuperar un alumno
00:14:43
lo que sea, lo que sea, tiene que hacer cosas
00:14:44
con alumnos, entonces ahora
00:14:46
aquí hay un montón de posibilidades
00:14:48
hay un montón de opciones sobre, vale, dónde guardar
00:14:50
los alumnos, en un set
00:14:52
en un list
00:14:54
aquí vendría lo de siempre
00:14:55
va a haber alumnos duplicados
00:14:57
que significa que los alumnos sean iguales
00:15:00
bueno, aquí hay un montón de opciones
00:15:02
que dependerán de
00:15:03
mi problema en concreto
00:15:06
que tendré que estudiar, tendré que hablar
00:15:07
con el secretario de un instituto que me diga
00:15:09
estos son los datos
00:15:12
que se pueden repetir, los que no, lo que sea
00:15:13
pero bueno, nosotros ahora
00:15:15
lo que sí que tenemos claro
00:15:18
es que vamos a trabajar con un montón de alumnos
00:15:20
¿dónde metemos ese montón de alumnos?
00:15:21
bueno, pues
00:15:24
en este caso podríamos decir, vale, además
00:15:24
tengo el dato del DNI del alumno
00:15:27
lo tengo
00:15:29
con la ventaja de que ese dato me identifica
00:15:30
al alumno de forma única
00:15:33
el DNI del alumno no está
00:15:35
dentro del objeto alumno
00:15:37
no está dentro
00:15:39
podría estar dentro
00:15:41
podría estar dentro
00:15:43
y entonces ya me hago un set
00:15:45
de los de toda la vida
00:15:47
con el equals y el hashcode con el nif
00:15:48
por ejemplo, y tendría un diseño
00:15:51
de aplicación, tendría un diseño
00:15:53
me meto el nif aquí dentro
00:15:55
me meto el nif aquí dentro
00:15:58
me hago el hascode y el equals
00:15:59
basado en el nif
00:16:02
porque el nif identifica de forma única
00:16:03
al alumno y trabajo
00:16:05
con un set de alumnos
00:16:07
o con un list si yo quiero que haya
00:16:09
duplicados, como me dé la gana
00:16:11
pues ya está, es una opción más de diseño
00:16:13
¿vale? pero vamos a hacer otra
00:16:14
para trabajar con el map
00:16:16
bueno, pues resulta que el nif no está dentro de esta clase
00:16:18
alumno por la razón que sea
00:16:21
pero el dato del NIF
00:16:23
yo sí que lo voy a conocer
00:16:26
tengo disposición de él, tengo ese dato
00:16:27
es una información que tengo del alumno
00:16:29
vale, pues entonces
00:16:31
el diseño que me puedo hacer
00:16:33
que es un diseño que me va a facilitar muchísimo
00:16:34
la vida es, vale, pues voy a
00:16:37
guardar a mis alumnos
00:16:39
en un mapa, que es un conjunto
00:16:40
de pares, donde la clave
00:16:43
va a ser el NIF
00:16:45
y el valor va a ser ya el objeto
00:16:46
alumno concreto asociado a ese NIF
00:16:49
el objeto alumno concreto
00:16:51
Entonces me he hecho otro diseño distinto
00:16:52
Un diseño basado en un mapa
00:16:55
Y ese diseño es muy útil
00:16:57
Bueno, pues entonces
00:17:00
¿Cómo declaro yo un objeto map?
00:17:03
Vale
00:17:08
Pues de nuevo es un objeto genérico
00:17:09
Es una clase genérica, perdón
00:17:11
Y en este caso depende
00:17:14
De dos tipos
00:17:15
De datos
00:17:17
De hecho, si nos vamos aquí a
00:17:19
Espera, voy a ver si
00:17:20
Open implement
00:17:24
A esta, quería yo, vale
00:17:29
Si nos vamos a la implementada
00:17:31
No, esta no quiero
00:17:34
Quiero la de útil
00:17:35
Esta
00:17:42
Joder, ¿por qué no me abre la de útil?
00:17:43
Open map
00:17:52
A esta quería yo, vale
00:17:53
De hecho, si nos vamos a interfaz map
00:17:55
Vemos que es genérica
00:17:57
Y en este caso depende de dos tipos de datos
00:17:59
depende de dos tipos de datos
00:18:01
la lista dependía de uno
00:18:04
los set dependían de uno
00:18:06
que era el tipo de dato al que pertenecían los objetos
00:18:08
que iban dentro
00:18:10
pues el map es una clase genérica
00:18:11
interfaz genérica que depende de dos
00:18:14
tipos de datos
00:18:16
y esos dos tipos de datos ¿cuáles son?
00:18:17
el tipo de dato al que pertenece
00:18:21
la clave y el tipo de dato
00:18:23
al que pertenece el valor que yo los puedo elegir
00:18:24
¿vale?
00:18:27
este es el tipo de dato al que van a pertenecer
00:18:28
las claves de los pares
00:18:30
y este es el tipo de dato
00:18:31
al que van a pertenecer
00:18:34
los valores de los pares
00:18:35
y yo elijo
00:18:36
los que me interesen
00:18:37
según mi aplicación
00:18:38
bueno pues en mi caso
00:18:39
la clave
00:18:42
es
00:18:44
el NIF
00:18:46
el NIF
00:18:47
¿en qué lo guardamos?
00:18:48
pues en string
00:18:49
por ejemplo
00:18:50
pues entonces aquí coloco
00:18:51
string
00:18:53
la cosa es que entonces
00:18:54
la clave tiene su número entero
00:18:58
entonces el nif lo unió que no podía tener la letra
00:18:59
pero vamos
00:19:02
que aquí lo que importa es que
00:19:04
pongas el tipo de dato al que pertenece tu clave
00:19:06
si tu clave es un número entero
00:19:08
pones integer efectivamente
00:19:10
si tu clave es un número decimal
00:19:11
pones double, tu clave puede ser cualquier tipo de dato
00:19:14
eso sí
00:19:16
tiene que ser un tipo de dato
00:19:18
de tipo objeto
00:19:19
efectivamente si fuera un número
00:19:21
aquí nunca podríamos poner int
00:19:23
pero esto es lo mismo que en las listas
00:19:25
esto ya nos ha pasado
00:19:27
aquí no podríamos poner esto
00:19:28
ya lo sabemos, pero para eso podríamos
00:19:30
la envolvente
00:19:32
¿verdad? que es lo mismo, ya lo sabemos
00:19:34
bueno, pues en nuestro caso
00:19:36
si yo he decidido
00:19:37
que mi DNI se guarde en string
00:19:39
pues aquí pondría el tipo string
00:19:42
porque las claves son nil que va en string
00:19:44
ahora, el valor
00:19:46
el valor de cada par, ¿cuál va a ser?
00:19:47
el objeto alumno en concreto
00:19:50
el objeto alumno, pues entonces aquí
00:19:51
pongo alumno
00:19:54
pues aquí tengo ya
00:19:55
mi la declaración
00:20:01
lo que pasa es que a la instancia
00:20:04
a la hora de instanciar
00:20:06
tengo que elegir una implementación
00:20:08
concreta, recordad que
00:20:10
la variable se puede declarar
00:20:12
de la superclase, pero luego
00:20:14
no instancia ya una implementación
00:20:16
obviamente
00:20:18
tres implementaciones, hashMap, linkedHashMap
00:20:19
trimap, vamos a coger la primera
00:20:22
de ellas, vale
00:20:24
pues ya tenemos nuestra estructura de datos
00:20:45
vale, es otra
00:20:47
variante, en lugar de meter todos los
00:20:49
alumnos en un set
00:20:51
y ya sabemos lo que podemos hacer con eso
00:20:52
pues hemos metido los alumnos
00:20:56
en un mapa
00:20:58
donde además van acompañados de su DNI
00:20:59
que es su clave
00:21:02
entonces ahora, ¿qué podemos hacer con una colección?
00:21:04
como esta, con un mapa
00:21:07
lo mismo que con todas, meter pares
00:21:08
recuperar pares
00:21:11
en este caso, recuperar por clave
00:21:13
que esa es la principal ventaja
00:21:15
borrar por clave, podemos hacer mil cosas
00:21:16
por ejemplo, vamos a meter
00:21:19
pues un alumno, pues nada
00:21:20
alumnos, uno ya puede
00:21:22
mirar aquí todos los métodos que hay
00:21:24
en los mapas
00:21:26
¿vale? que hay pues
00:21:28
pues unos cuantos
00:21:32
métodos
00:21:38
de map
00:21:39
algunos por su propio
00:21:41
nombre, pues ya podemos deducir lo que hacen
00:21:44
pues este obviamente eliminará todos los pares
00:21:46
de la colección
00:21:48
¿vale? no hay muchos
00:21:49
porque lo único que es meter pares, borrar
00:21:54
pares, no hay ningún at
00:21:57
no hay ningún at porque aquí
00:21:59
no se llama at, se llama put
00:22:01
simplemente, porque ha cambiado el nombre
00:22:02
aquí se llama put
00:22:04
vale, el at aquí se llama put
00:22:06
bueno, pues en nuestro caso
00:22:08
que queremos meter un nuevo alumno
00:22:10
que queremos meter un nuevo
00:22:13
alumno, pues tenemos que meter el par entero
00:22:20
clave, pues venga, alumno con dni
00:22:22
este, y aquí tenemos que
00:22:24
meter un alumno, pues venga, new
00:22:28
alumno, pues el alumno
00:22:30
que sea, que era nombre y nota
00:22:38
con esta cacholetraza no me
00:22:40
no me aclaro, vale
00:22:54
pues ya hemos metido un par, entonces aquí
00:22:57
va todo por pares
00:22:59
vale, entonces después de meter aquí
00:23:00
esto vamos a ejecutarlo
00:23:25
solamente para verificar que no nos sale
00:23:29
ningún error de ejecución ni nada
00:23:31
no vayamos a haber escrito algo mal, pero no vamos a ver nada
00:23:32
no vamos a ver nada porque
00:23:35
no he hecho nada, solamente meter
00:23:37
dos pares y ya está
00:23:39
vale
00:23:40
vale, pues esos dos pares ya están aquí
00:23:41
entonces vamos a ver, tendrá un size
00:23:44
para ver cuántos hemos metido
00:23:47
vamos a
00:23:49
que está aquí
00:23:50
vale, entonces efectivamente si ejecutamos
00:23:55
esto, veremos, se supone que dos
00:23:58
veremos dos
00:23:59
lo ejecutamos y sí, hemos metido dos pares
00:24:01
vale
00:24:04
entonces, insertar pares, ninguna complicación
00:24:06
con put se van insertando
00:24:09
que queremos insertar un montón de pares
00:24:11
a la vez, tiene un put all
00:24:14
también
00:24:16
entonces al put all le pasamos
00:24:16
a su vez dentro otro mapa
00:24:19
y todos los pares del mapa
00:24:21
los mete en ese
00:24:24
igual que en la lista
00:24:24
o el set tenía también un add all
00:24:28
que le pasábamos una colección
00:24:29
y te metía todos los elementos de esa colección
00:24:31
en la lista
00:24:34
pues este tiene un put all donde le metes
00:24:35
un mapa y todos los del mapa se van
00:24:37
Pero bueno, no tiene mayor. Aquí lo único es que, lógicamente, si yo repito a un alumno con la misma clave, no lo va a meter. Es decir, yo meto a otro alumno distinto, que es el Carlos II este, otro distinto, pero para la misma clave.
00:24:39
¿Vale?
00:25:02
Meto otro alumno distinto
00:25:07
Y sigue teniendo dos
00:25:08
¿Por qué? Porque este lo ha ignorado
00:25:12
Es como al set
00:25:15
Cuando al set le intentábamos meter
00:25:16
La clave siempre va a ser
00:25:18
El primer parámetro
00:25:20
Siempre, va en ese orden
00:25:21
Clave, valor
00:25:24
Siempre va a ser el primero
00:25:25
Tiene que ser el primero
00:25:27
Entonces, este lo ha ignorado
00:25:28
Pues el segundo no lo ha metido
00:25:31
Como cuando en un set intentas meter un objeto duplicado
00:25:32
Pues no lo ha metido
00:25:35
vale
00:25:37
entonces, vamos a hacer
00:25:38
otro cambio
00:25:49
vamos a hacer ahora un cambio en el cual
00:25:50
imaginaos que ahora
00:25:54
queremos
00:25:55
trabajar con alumnos
00:25:57
y a cada alumno asociarle
00:26:00
un aula
00:26:02
es una cosa un poco retorcida, pero bueno, un aula
00:26:03
que va a ser el nombre de aula en stream
00:26:05
entonces yo decido
00:26:07
que mi estructura de datos
00:26:09
entonces sea un mapa
00:26:11
donde la clave en este caso sea
00:26:12
el alumno, el objeto alumno
00:26:15
y el valor el aula
00:26:17
entonces en ese mapa
00:26:18
todos los objetos alumnos son distintos
00:26:19
por eso me he funcionado como clave
00:26:22
y el valor es la clase
00:26:24
en la que está, el valor se puede repetir
00:26:27
puede haber dos alumnos en la misma aula
00:26:28
entonces imaginaos que yo decido ahora
00:26:30
porque me interesa para mi aplicación
00:26:32
una estructura de datos que sea así
00:26:34
un conjunto de pares que son
00:26:36
objeto alumno, clase en la que está
00:26:38
objeto alumno, clase en la que está
00:26:41
por ejemplo, me apetece a mí
00:26:43
hacer un mapa de esos
00:26:44
porque resulta que luego
00:26:45
me va a ser útil
00:26:46
para las operaciones
00:26:47
que voy a hacer.
00:26:48
Pues venga,
00:26:50
vamos a hacernos ahora
00:26:50
ese otro mapa.
00:26:51
Este está entendido, ¿no?
00:26:52
Es un mapa normal y corriente
00:26:53
donde yo meto
00:26:54
nif, objeto,
00:26:55
nif, objeto.
00:26:56
Vale, pues ahora resulta
00:26:58
que me interesa a mí
00:26:59
hacer un mapa
00:27:00
asignaciones
00:27:01
que es alumno, aula,
00:27:02
en la que está,
00:27:03
alumno, aula,
00:27:04
en la que está.
00:27:04
Pues entonces,
00:27:05
me hago yo mi mapa.
00:27:06
En este caso,
00:27:07
mi mapa,
00:27:10
los tipos de datos serían
00:27:12
alumno,
00:27:13
el primero de todos,
00:27:14
Porque el tipo de dato al que pertenece la clave es alumno, la clave será el objeto alumno, distinto para cada entrada del mapa. Cada elemento de un mapa se les llama la entrada, normalmente la entrada del mapa para cada entrada.
00:27:16
y ahora el valor, el nombre
00:27:30
del aula, le ponemos un string
00:27:32
pues entonces aquí ponemos un string
00:27:34
vale, pues bueno, imagínate
00:27:36
a este mapa
00:27:39
se llama asignación sin más
00:27:42
y ahora ya lo
00:27:44
lo instanciamos como hash map
00:27:46
vale, pues venga
00:27:48
vamos a colocar al primer alumno en un aula
00:27:57
pues asignación
00:27:59
put, vamos a
00:28:03
poner al alumno
00:28:07
este que tiene nota 4, a este alumno
00:28:08
Lo vamos a poner en el aula
00:28:20
Esta de aquí
00:28:22
Ahí se queda
00:28:23
Vamos a poner aquí
00:28:30
Unos asteriscos para cuando lo ejecutemos
00:28:32
Sepamos
00:28:35
Que es lo que estamos viendo
00:28:37
Vale, pues ya hemos metido la primera asignación
00:28:38
Y ahora
00:28:47
No me falta un paréntesis
00:28:48
Si me falta un paréntesis
00:28:52
Ah no, no me falta
00:28:53
Entonces vamos a meter a otro
00:28:54
Entonces según lo que yo he dicho
00:28:59
Si vuelvo a meter al mismo alumno
00:29:03
Y me equivoco
00:29:06
Vuelvo a por alumno carlos4
00:29:07
Le pongo en dos dam
00:29:10
Según lo que yo he dicho
00:29:12
Como he metido dos veces la misma clave
00:29:15
No me lo va a meter
00:29:18
La segunda asignación no lo va a meter
00:29:21
Vamos a verlo
00:29:23
Asignación
00:29:25
Punto 6
00:29:28
Vale, hemos dicho que la clave tiene que ser única
00:29:29
He metido dos veces
00:29:36
el mismo objeto, igual que aquí he metido
00:29:37
dos veces este mismo
00:29:40
objeto y efectivamente he comprobado que el
00:29:42
segundo lo ha ignorado, pues aquí he metido
00:29:44
dos veces el mismo objeto
00:29:46
vamos a ver
00:29:47
qué es lo que
00:29:49
me hace
00:29:52
y sin embargo aquí sí que
00:29:53
me lo ha metido, aquí sí
00:29:56
claro
00:29:59
pero seguro que podéis contestarme
00:30:01
¿por qué para el HashMap
00:30:03
este y este no son el mismo?
00:30:05
¿por qué no son el mismo?
00:30:07
a ver, esto y esto es igual
00:30:11
es clavado, pero para el HashMap
00:30:17
esto y esto
00:30:19
es distinto, ¿por qué es distinto?
00:30:21
¿por qué estos objetos
00:30:24
son distintos?
00:30:25
porque tienen otro valor distinto
00:30:27
¿o no se acuerdan?
00:30:29
no, no, no
00:30:30
sí, pero no es por eso
00:30:31
es que antes de
00:30:34
mirar el valor
00:30:37
claro, o sea, antes de mirar el valor
00:30:37
él cuando, él ha metido esto
00:30:40
ahora tú le pasas esto, y dice, a ver, clave
00:30:42
¿esta clave existe ya?
00:30:45
sí existe, entonces lo ignoro
00:30:47
que es lo que nos ha hecho antes
00:30:48
¿esta clave no existe? es que ya ni mira el valor
00:30:50
entonces él ha llegado a la conclusión
00:30:52
de que este objeto no existía previamente
00:30:54
porque lo ha vuelto a meter
00:30:57
¿por qué
00:30:58
no ha encontrado
00:30:59
no se ha dado cuenta de que este objeto es igual que el anterior?
00:31:01
no sabemos si está guardando
00:31:05
¿eh?
00:31:07
si está guardando el objeto
00:31:08
¿cómo que no se está guardando?
00:31:09
pero
00:31:13
exactamente
00:31:13
es que no son iguales
00:31:17
porque la clase alumno
00:31:20
no tiene su hashcode ni su equals
00:31:21
con lo cual el que usa
00:31:24
es la de object
00:31:26
y object como siempre
00:31:27
la implementación de equals de object
00:31:29
es dos objetos son iguales
00:31:32
si está en la misma dirección de memoria
00:31:35
si no, no
00:31:36
entonces este objeto
00:31:37
se ha creado en la dirección de memoria
00:31:39
y este otro se ha creado en otra
00:31:41
los valores son los mismos
00:31:44
pero son dos objetos en diferentes direcciones de memoria
00:31:45
es el problema de siempre
00:31:48
que se manifiesta en todas las situaciones
00:31:50
que yo no he hecho ningún
00:31:52
equals en alumno
00:31:54
entonces al no haber hecho ningún equals
00:31:56
esos objetos son distintos
00:31:58
entonces yo ahora es cuando tengo que decidir
00:31:59
ah no, perdona, es que para mí
00:32:01
la igualdad se basa en esto
00:32:03
pues tengo que programarla para que el resto lo entienda
00:32:06
yo no puedo esperar
00:32:08
es que el string
00:32:10
sí que tiene el equals
00:32:13
porque la clase string ya está hecha
00:32:13
esta es la clase string
00:32:16
y la clase string
00:32:18
es una clase que ya está hecha
00:32:19
y tiene su propia implementación de equals
00:32:22
que está hecha en función de que los caracteres
00:32:24
sean iguales
00:32:26
entonces dos string
00:32:27
no, alumno lo acabo de hacer yo
00:32:28
y no tiene ninguna implementación de equals
00:32:33
alumno es esta
00:32:34
claro
00:32:35
pero coge el equals de object
00:32:38
y el de object está basado en dirección de memoria
00:32:41
entonces
00:32:43
el equals de string
00:32:45
ya ha sobrescrito el de object
00:32:47
basado en que los caracteres sean iguales
00:32:49
pero alguno no lo ha sobrescrito
00:32:52
es el problema con el que nos hemos
00:32:53
encontrado en un montón de situaciones
00:32:55
pues aquí con el mapa
00:32:58
exactamente igual
00:33:00
entonces para el map este objeto
00:33:01
y este objeto son distintos
00:33:04
porque yo no les he dado
00:33:05
un criterio de igualdad
00:33:07
vale, pues ahora viene lo importante
00:33:08
y es, para el map
00:33:10
¿cuál es el criterio de igualdad?
00:33:12
pues depende de si es hash map
00:33:14
linked hash map o tree map
00:33:16
para el hash map
00:33:17
el criterio de igualdad es el mismo
00:33:20
que para el hash set
00:33:22
que es hash code equals
00:33:23
con lo cual, en la clase
00:33:26
a la que pertenezcan las claves
00:33:28
y solo las claves
00:33:29
hay que implementar
00:33:31
hay que implementar hash code equals
00:33:33
porque ahí es donde importa, él es donde mira la igualdad
00:33:35
entonces el hashMap, por eso se llama así
00:33:37
internamente guarda las claves en un hashSet
00:33:40
las claves las guarda en un hashSet, internamente
00:33:43
y por tanto necesita que haya hashCodeEquals
00:33:45
en esta clase para poder
00:33:49
comprobar si son iguales o no
00:33:52
igual que el hashSet necesitaba hashCodeEquals en la clase
00:33:54
para ver si dos eran iguales o no
00:33:58
pues como en el hashMap las claves se guardan en un hashSet
00:34:00
pues aquí tiene que haber
00:34:04
jasco de equals, si no hay jasco de equals
00:34:06
para él esto es distinto
00:34:08
vale, pues entonces será bien
00:34:09
bueno, y nosotros
00:34:12
que hace que los alumnos sean
00:34:13
iguales, en este
00:34:16
caso, el nombre, tiene que haber un criterio
00:34:18
de igualdad, porque es que si lo estoy usando como clave
00:34:20
si los uso como
00:34:22
clave, tiene que haber un criterio de igualdad en ellos mismos
00:34:24
aquí no hay nada
00:34:26
es que son ellos la clave
00:34:28
pues tengo que dar un criterio de igualdad
00:34:29
para ellos, pues mi criterio de igualdad
00:34:32
¿cuál decido? pues por nombre
00:34:34
decido que por nombre, porque puede haber alumnos
00:34:35
distintos con la misma nota
00:34:38
pues nada, me hago el jasco de
00:34:39
equals, por nombre
00:34:42
solamente, por nota no
00:34:46
por nombre
00:34:48
ala, ya tengo el jasco
00:34:49
de equals por nombre
00:34:52
pues estupendo, ahora ya
00:34:53
sí, ahora ya
00:34:56
si yo repito esta aplicación
00:34:58
el hashmap ya va a ver
00:35:00
que carlos4 es igual que el carlos4
00:35:02
como si pusiera carlos5
00:35:04
porque para él
00:35:06
la igualdad viene por nombre
00:35:09
entonces ahora si ejecutamos esto
00:35:10
efectivamente el segundo
00:35:13
no lo va a haber metido
00:35:15
¿vale? el segundo ahora ya
00:35:17
no lo ha metido
00:35:21
¿vale?
00:35:22
entonces de nuevo, si usamos
00:35:26
hasMap o linked hasMap
00:35:29
tenemos que tener en cuenta que la clase
00:35:30
a la que pertenecen las claves
00:35:33
tiene que tener el hasCode equals
00:35:34
tiene que tenerlo porque si no va a funcionar
00:35:36
con coherencia
00:35:39
la diferencia entre HashMap y LinkedHashMap
00:35:40
la misma que entre HashSet y LinkedHashSet
00:35:48
que si ahora iteramos
00:35:50
por el map, iteramos
00:35:52
en el HashMap
00:35:54
me va a iterar en el orden que
00:35:55
dé el dedo a entender y en el LinkedHashMap
00:35:57
me va a iterar
00:36:00
en el mismo orden en el que inserté
00:36:01
es la única diferencia
00:36:03
¿vale?
00:36:05
bueno pues
00:36:11
ventaja de usar un map, pues efectivamente
00:36:12
que recuperar
00:36:15
para recuperar, consultar
00:36:18
es más fácil porque lo puedo hacer por clave
00:36:20
directamente, por ejemplo
00:36:24
que ahora yo quiero en mis alumnos
00:36:26
borrar el que tenga un DNI
00:36:28
pues bueno, tengo mi método
00:36:32
remove, al que yo le paso la clave
00:36:38
entonces la ventaja de los mapas es que yo puedo
00:36:40
hacer operaciones basadas en la clave
00:36:45
operaciones basadas en la clave
00:36:48
cuando tengo set y list
00:36:50
no puedo trabajar con clave, no hay clave
00:36:52
yo tengo que pasar al remove el objeto
00:36:54
entero y me borra uno
00:36:56
igual que ese objeto, es un poco
00:36:58
más farragoso y más complicado
00:37:00
con un mapa le paso la clave
00:37:02
y él me borra por clave
00:37:04
pues este me va a
00:37:06
borrar el alumno cuya clave sea esta
00:37:08
por ejemplo
00:37:10
entonces esa es la ventaja que tiene
00:37:12
que es muy práctico para eso
00:37:14
cuando yo tengo muy claro
00:37:16
que mis objetos de mi aplicación
00:37:18
tienen una clave asociada
00:37:21
pues me va a ser mucho más fácil
00:37:22
meter esos objetos en un mapa
00:37:24
con la clave, porque luego ya borro
00:37:26
por clave, recupero por clave, hago por clave
00:37:29
lo que quiera, y es mucho más sencillo
00:37:31
¿qué quiero recuperar
00:37:33
por clave? pues ya está
00:37:37
tendré el método
00:37:38
get por ahí
00:37:40
le paso la clave y me dice cuál es el que tiene
00:37:42
esa clave, bueno pues
00:37:45
queda mucho más bonito
00:38:07
hacer accesos por clave
00:38:08
queda más bonito que para borrar
00:38:10
tener que dar un objeto entero
00:38:13
y decir, bórrame uno igual a este, eso es mucho más feo
00:38:14
digo, bórrame el que tiene este DNI y ya está
00:38:17
es mucho mejor
00:38:19
pero para eso tengo que haberlo guardado en un mapa
00:38:20
tengo que haberlo guardado en un mapa
00:38:22
entonces es la ventaja que tiene
00:38:24
los accesos por clave y ya está
00:38:29
recorrer el map
00:38:31
recorrer el map es un poquito
00:38:34
más pesado
00:38:36
es un poquito más pesado porque estos son pares
00:38:37
entonces tengo que transformarlo
00:38:39
primero
00:38:42
puedo recorrer de muchas maneras
00:38:43
un mapa en realidad
00:38:46
pero una de las más sencillas
00:38:46
tengo un método para transformarlo
00:38:49
a un conjunto
00:38:52
y luego ya iterar por ese conjunto
00:38:53
como hemos iterado de toda la vida
00:38:56
queda muy largo
00:38:58
escrito porque el nombre de las clases es largo
00:39:00
pero luego es una tontería
00:39:02
entonces vamos a ver
00:39:03
si volvemos a ver
00:39:06
los métodos de
00:39:09
¿vale? lo que vamos a hacer ahora es
00:39:10
recorrer el map
00:39:15
¿cómo recorrería uno un map para ver lo que tiene?
00:39:16
para ver lo que tiene simplemente
00:39:22
vale, pues bueno, si uno ve
00:39:23
los métodos que tiene
00:39:27
¿veis? hay un
00:39:28
contents key que también es muy práctico
00:39:31
que te dice si hay algún par
00:39:33
que tenga esa clave
00:39:35
tiene un contents value que te dice si hay
00:39:36
algún par que tenga ese valor
00:39:39
que puede ser más de uno
00:39:41
en este caso solo va a ser uno
00:39:42
en caso de existir, en este caso puede ser más de uno
00:39:45
entonces tiene una serie de métodos
00:39:47
que bueno, te dice si está vacío
00:39:48
¿vale?
00:39:50
y
00:39:54
este método
00:39:54
por ejemplo, el key set
00:39:58
te devuelve un conjunto
00:39:59
con las claves
00:40:02
el key set devuelve un conjunto con las claves
00:40:03
entonces
00:40:06
este lo podemos usar
00:40:08
para recorrer
00:40:10
por ejemplo, si queremos, ¿vale?
00:40:12
Xset te devuelve un set que tiene
00:40:13
las claves, solamente.
00:40:15
Solo las claves, los valores los ha quitado.
00:40:17
Entonces, imaginaos que
00:40:19
a ver,
00:40:20
pues me voy a quedar yo con las
00:40:28
claves
00:40:29
de mis alumnos, que eran
00:40:30
DNI, lo van en string,
00:40:33
pues por ejemplo,
00:40:38
estas serían
00:40:45
solamente las claves, un conjunto
00:40:45
con las claves.
00:40:49
Y ahora ya, pues por ejemplo,
00:40:51
puedo hacer esto, por ejemplo,
00:40:53
Recorrer este conjunto
00:40:54
Para cada clave
00:40:56
En mi conjunto de claves
00:40:58
¿Vale? Pues puedo hacer esto
00:41:01
Mostrar esa clave
00:41:04
Y el valor que hay en el mapa asociado a esa clave
00:41:07
Por ejemplo, voy a poner aquí abajo
00:41:18
Eh...
00:41:20
Alumno
00:41:25
Y ahora cojo del mapa de alumnos
00:41:30
El alumno asociado a esa clave
00:41:33
Por ejemplo
00:41:36
voy recorriendo todas las claves
00:41:44
que están en este set
00:41:47
y ahora muestro la clave
00:41:48
y el objeto alumno que está asociado a esa clave
00:41:50
recordad que get es el método para
00:41:53
recuperar por clave
00:41:55
aquí lo que pasa es que como lo he metido en un
00:41:56
system.out.println
00:41:59
el alumno como no tiene
00:42:00
un toString me lo va a mostrar raro
00:42:03
pues vamos a ponerle un toString alumno
00:42:05
para que me muestre el objeto alumno más bonito
00:42:07
le vamos a poner un toString
00:42:09
vale, ya tiene un toString
00:42:11
en el alumno. Entonces, si ejecutamos esto, voy a quitar el remove porque si no solamente
00:42:21
va a mostrar un alumno. Vamos a, pues aquí están los dos alumnos, ¿vale? Este es el
00:42:29
recorrido, el resultado de mi recorrido. DNI el alumno. Bueno, pues esta es una posibilidad
00:42:49
para recorrer el mapa. Y bueno, hay otra que mencionamos ahora. Paramos un momentito y
00:42:57
la mencionamos.
00:43:02
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 14
- Fecha:
- 3 de abril de 2024 - 18:43
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 43′ 05″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 194.32 MBytes