20250204 HashSet_2 - 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:
silencio
00:00:00
antes de que Ana baje la pantalla
00:00:02
venga, ahí nos de mucho miedo
00:00:04
bueno, pues la función de hash
00:00:06
ha hecho la que le ha salido de ahí
00:00:08
y nos la creemos porque es que no sabemos
00:00:10
hacer funciones de hash optimizadas
00:00:12
a los requisitos de nuestra aplicación
00:00:14
ahora ya sí
00:00:16
ahora volvemos a ejecutar esto
00:00:18
y ahora ya
00:00:20
sí que no me ha dejado meter el duplicado
00:00:22
y no me ha dicho nada
00:00:24
yo he hecho dos add
00:00:26
no me ha dicho nada
00:00:28
¿vale? pero ad
00:00:29
si yo quiero comprobar si la inserción
00:00:34
ha sido efectiva o no
00:00:36
veréis que ad devuelve un boolean
00:00:37
lo sabemos, lo vimos ayer
00:00:40
ah, vale, vale, vale
00:00:42
te devuelve un boolean para ver
00:00:44
si la inserción ha sido efectiva o no
00:00:46
¿vale? en el caso de la lista
00:00:48
los ad van a ser
00:00:50
efectivos siempre, salvo
00:00:52
casos muy
00:00:54
pero en el que haya un error
00:00:55
de excepción, de lo que sea
00:00:58
pero en el caso de los set
00:01:00
aquí sí importa
00:01:01
controlar el boolean
00:01:02
porque tú aquí crees
00:01:03
que estás metiendo
00:01:05
un montón de alumnos
00:01:05
y han metido el primero
00:01:06
porque te hace
00:01:07
que estás repitiendo
00:01:08
los nips
00:01:08
sin darte cuenta
00:01:09
lo que sea
00:01:10
¿te devuelve
00:01:10
si es repetido?
00:01:11
claro
00:01:13
claro
00:01:14
vamos a meter esto
00:01:14
o sea yo puedo meter esto
00:01:15
en un siso
00:01:16
para controlar
00:01:17
meto en un siso
00:01:18
el primer add
00:01:20
pero yo lo ejecuté
00:01:20
y me salieron
00:01:25
los dos alumnos
00:01:25
entonces que se repiten
00:01:26
primero
00:01:27
pero has puesto
00:01:28
el hashcode
00:01:28
y el equals
00:01:29
Claro, es que te has saltado
00:01:29
No, no, es que lo hice antes
00:01:33
Ah
00:01:35
Ah, bueno, vale
00:01:36
Vale, ¿qué iba a hacer yo?
00:01:38
Y ponemos este SISO también aquí
00:01:41
Vale, entonces
00:01:43
Efectivamente
00:01:53
La segunda inserción no se hizo
00:01:55
No es que haya habido un problema
00:01:56
Sino simplemente que tú has intentado meter un duplicado
00:01:58
Entonces puedes llevar el control
00:02:01
Si quieres, de las inserciones efectivas
00:02:03
Que hay
00:02:05
¿Vale?
00:02:06
Entonces
00:02:10
Vamos a meter por ejemplo
00:02:11
Un alumno
00:02:22
De NIF 0
00:02:24
Ahora si meto un alumno
00:02:25
De NIF 0
00:02:30
A ver que me distraes
00:02:30
Ahora si metía un alumno de NIF 0
00:02:33
Aunque sea este
00:02:35
Si me lo va a meter
00:02:37
¿Vale? Sí, hasta el fondo
00:02:38
Y lo que pasa es que
00:02:41
Estaba buscando forzar
00:02:43
Que vierais que el orden
00:02:44
De iteración
00:02:47
No es el que yo inserté, aquí se ha coincidido
00:02:48
Pero si yo, no tiene
00:02:52
Por qué, tú vas metiendo
00:02:53
Alumnos, claro, y cuando
00:02:55
Tú vas metiendo, tú vas iterando
00:02:57
Te van saliendo, vas sacando
00:02:59
De la caja en un orden que no tiene nada que ver
00:03:01
¿Vale?
00:03:03
ahí sí que viene la única
00:03:04
diferencia entre el hash set
00:03:07
y el linked hash set
00:03:10
hay dos implementaciones de
00:03:11
bueno, hay tres de set
00:03:13
recordad que he escrito al principio
00:03:14
hash set y linked hash set
00:03:17
las dos se implementan por abajo con una tabla
00:03:19
hash, en las dos hay que hacer el hash code
00:03:22
y el equals, las dos son iguales
00:03:23
pero el linked hash set
00:03:25
te mete algo más
00:03:27
para que el orden de iteración
00:03:29
sea el mismo que el de inserción
00:03:31
es la única diferencia
00:03:33
entonces si a ti te importa en la aplicación que sea
00:03:35
porque tienes una interfaz gráfica
00:03:38
que cuando tú vas a mostrar en un desplegable
00:03:39
los alumnos, lo vas a hacer
00:03:42
recogiendo del set y quieres que se muestre
00:03:44
en el orden en el que los insertaste
00:03:46
si te importa
00:03:47
que en el orden de iteración
00:03:48
sea el mismo que el orden en el que tú metiste
00:03:52
si te importa, pues haz un link
00:03:53
en hashet, si no te importa
00:03:55
haz un hashet y ya está
00:03:58
¿vale?
00:03:59
entonces lo vamos a escribir aquí
00:04:01
el orden en el que
00:04:02
aparecen
00:04:15
¿vale?
00:04:53
pues en realidad nos quedamos
00:04:54
iteración
00:04:56
con que esa es la única diferencia
00:04:58
conclusión
00:04:59
del link de haset pues ya pasamos
00:05:01
no vamos a mencionar nada más de él porque es igual que el haset
00:05:04
salvo que cuando iteramos por él
00:05:06
se conserva el orden, ya está
00:05:08
entonces cuidadín
00:05:10
porque si
00:05:12
si viniéramos de una clase que alguien nos ha dado
00:05:14
por ahí que la estuvo usando en listas
00:05:16
y que esto no lo tenía
00:05:18
porque el hasco no lo tenía aunque tuviera
00:05:19
el equals
00:05:22
esto va a seguir
00:05:23
sin distinguir
00:05:25
la igualdad correctamente
00:05:27
luego el hash set usa los dos
00:05:28
primero el hash code
00:05:31
y luego el equals, el hash code para
00:05:33
la posición del array
00:05:35
y el equals para la posición en la lista
00:05:37
entonces necesitamos los dos
00:05:39
si uno me falta, esto otra vez va a volver
00:05:41
a no hacérmelo
00:05:43
por ejemplo vamos a meter dos con
00:05:45
nif1, vamos a meter dos con
00:05:47
nif1 y yo el hash code no lo he hecho
00:05:49
Porque es de una trampa pelada
00:05:51
O viene de otro sitio, lo que sea
00:05:52
Pues como veis he metido los dos
00:05:54
Porque no he detectado que son duplicados
00:05:56
Aunque el equals, sí
00:05:58
Pero el hashcode del equals solo no le vale
00:06:00
Hace primero el hashcode y luego el equals
00:06:02
Y lo mismo, si yo tengo solo el hashcode
00:06:04
Y el equals no
00:06:07
Puedes usar una función del alumno con
00:06:07
Nib1
00:06:10
Por ejemplo, crear una función en cualquiera
00:06:11
Esta
00:06:14
Uy, perdón
00:06:16
Quiero que uses una función
00:06:17
desde un alumno que está dentro de esa
00:06:20
no te refieres
00:06:23
a que implemente yo esto, otra cosa
00:06:25
que accedas a ese alumno
00:06:26
y usas una función de ese alumno
00:06:29
del alumno probablemente
00:06:30
cualquier función
00:06:32
crea una función cualquiera
00:06:34
un método en alumno, te refieres a un método cualquiera
00:06:36
pues como por ejemplo
00:06:39
un método cualquiera que me devuelva
00:06:41
Vuelva y que me haga, uy, soy este de aquí.
00:06:43
Vale.
00:07:04
Entonces.
00:07:06
El alumno con dos NIF distintos.
00:07:07
Vale, agrego el alumno de NIF 1 y el alumno de NIF 2.
00:07:11
Y ahora usa el método de alumno de NIF 2.
00:07:15
Vale, tengo que iterar.
00:07:18
Ese es el asunto, que tengo que iterar.
00:07:20
No puedo decir, dame el alumno de NIF 2.
00:07:21
Eso es.
00:07:24
¿Vale? Tengo que iterar
00:07:25
¿Pero creas un alumno apuntando a null
00:07:27
y luego guardas ese alumno?
00:07:29
No, haría esto
00:07:31
si
00:07:32
a equals
00:07:33
efectivamente
00:07:36
me haría yo aquí
00:07:39
ahora
00:07:40
o bueno, no hace falta
00:07:41
puedo hacerlo más sencillo
00:07:44
Claro, si a
00:07:46
punto getNif
00:07:48
punto equals
00:07:51
el NIF que te han dado
00:07:54
el que sea, imagina el de 2
00:07:55
pues ya está
00:07:58
pues entonces apunto, saluda
00:07:59
¿vale?
00:08:02
esta es la manera en la que lo podrías hacer
00:08:04
¿vale?
00:08:06
no hace falta que te hagas un alumno
00:08:08
y que apliques él
00:08:09
entonces si tú haces esto, pues te va a saludar
00:08:11
el segundo que hemos metido
00:08:14
efectivamente
00:08:16
para modificarlo
00:08:18
efectivamente tienes que iterar
00:08:20
esa es la desventaja del set
00:08:22
iterar desde for each y poner a.set
00:08:23
nombre y le modifica
00:08:26
efectivamente
00:08:27
el problema del set es que para localizar
00:08:29
a uno concreto, como están todos a mogollón
00:08:32
tienes que iterar dentro
00:08:33
y buscarle
00:08:35
bien con el equal si te has creado un igual a él
00:08:37
bien con el nif, entonces precisamente
00:08:40
para localizar
00:08:42
de forma más fácil
00:08:44
porque claro, la pega que tiene el hash set es estupenda
00:08:45
porque están todos a mogollón, no tengo que llevar un registro
00:08:48
de la posición, eso es más cómodo
00:08:50
la estructura de una tabla has
00:08:52
con enlaces es óptima
00:08:54
vale, pero esta es la pega
00:08:55
que para localizar yo a uno
00:08:58
y sacarlo, tengo que mirarlos todos
00:08:59
y es un rollo
00:09:02
entonces, para
00:09:03
optimizar esto
00:09:05
es para lo que se hacen los
00:09:07
mapas
00:09:09
que los mapas son, yo tengo mi caja
00:09:10
pero
00:09:13
a cada objeto que está en mi caja
00:09:15
con todas las ventajas de la
00:09:17
caja, de que es una tabla has, todo eso
00:09:20
les asocio una clave
00:09:21
y que en este caso sería el nid
00:09:24
y ahora le digo
00:09:28
sácame el objeto de clave tal
00:09:30
y no tienes que iterar
00:09:32
pues por eso están geniales los mapas
00:09:33
¿vale?
00:09:36
muy rápidamente
00:09:38
cuando tengamos esto un poco más suelto
00:09:40
¿vale?
00:09:42
¿tú quieres?
00:09:43
dime
00:09:46
oye, John, sé más educado
00:09:46
de verdad, no me extraña que no quieran
00:09:50
contratar, dime
00:09:54
en un linked list
00:09:56
tú puedes recuperar por posición
00:10:00
el 3
00:10:01
pero si quieres encontrar el que cumple
00:10:03
una condición como Sunit, tienes que tirar también
00:10:06
claro, lo que pasa es que te aporta
00:10:08
el recuperar el primero
00:10:12
o el tercero, o el quinto
00:10:14
pero si quieres recuperar
00:10:15
dame el primero, dame el quinto
00:10:17
porque tiene una posición, pero si quieres
00:10:20
recuperar por contenido
00:10:22
tienes que iterar igual, iteras
00:10:23
a ver cuando encuentras aquel cuyo contenido
00:10:26
es el que te interesa
00:10:28
¿vale? si tú quieres localizar
00:10:29
por contenido tienes que iterar
00:10:32
me da igual que sea un set que un list
00:10:34
si fuera un mapa no, porque dices
00:10:35
dame el de la clave tal
00:10:38
que la clave ya tiene parte del contenido
00:10:39
¿vale?
00:10:42
lo único que el list, eso, el list te permite
00:10:44
sacar por posición
00:10:46
sin tener que iterar
00:10:48
dame el cuarto, por ejemplo, si tú sabes que el cuarto
00:10:50
es el que quieres, claro
00:10:52
get y la posición
00:10:53
pero claro, tienes que saber las posiciones
00:10:56
claro, claro
00:10:57
este no tiene, yo aquí no podría iterar
00:11:00
no podría, si yo aquí hago
00:11:02
alumnos
00:11:04
trato de hacer el primero
00:11:06
que metí, get 0, me dice
00:11:08
pero ¿qué me estás contando? el método get
00:11:10
no existe en hashed
00:11:12
¿vale? entonces
00:11:13
por ejemplo
00:11:16
yo quiero
00:11:17
eliminar
00:11:19
vamos a eliminar, vale, esto de la
00:11:21
iteración y la necesidad del jasco de
00:11:24
equals está claro, ¿no? Vamos a hacer
00:11:26
ahora
00:11:28
eliminar el alumno
00:11:28
de mif
00:11:32
el que sea, uno
00:11:33
por ejemplo, o uno que me han pasado por parámetro
00:11:35
el que sea, vamos a eliminarlo
00:11:38
vale, pues ¿cómo elimino yo
00:11:39
de un set?
00:11:41
pues si miramos los métodos que me
00:11:43
ofrece set, pues tiene
00:11:46
el método remove
00:11:47
y a remove
00:11:48
que hay que pasarle
00:11:51
hay que pasarle un objeto
00:11:52
alumno que sea
00:11:56
igual que el que quiero
00:11:58
eliminar
00:12:00
¿vale?
00:12:01
justo
00:12:05
eso
00:12:05
porque así funciona remove
00:12:08
le pasas un objeto, entonces
00:12:15
oye, pues como mi jasco de equals
00:12:17
que aquí importantísimo
00:12:20
como es un haset, jasco de i
00:12:21
pues van los dos de la mano
00:12:23
tira solo de nif
00:12:25
pues yo le paso esto
00:12:26
ah vale
00:12:29
vale, ni olivia, aquí le paso lo que me dé la gana
00:12:33
es que me da igual
00:12:35
vale
00:12:36
vale
00:12:38
pues que te hace remove
00:12:41
remove
00:12:42
busca dentro de la caja
00:12:44
un objeto
00:12:47
igual que este
00:12:49
que significa igual
00:12:50
que la sucesión de Hasco de Equal
00:12:52
es de True
00:12:55
pero como Hasco de Equal
00:12:56
tiran solo de NIF
00:12:59
porque Hasco de Equal tienen que estar coordinados
00:13:00
los dos, si Hasco tira de NIF
00:13:03
justo, como tira solo de NIF
00:13:04
yo aquí pongo lo que me dé la gana
00:13:07
vale
00:13:09
pongo lo que me dé la gana
00:13:10
si un segundinín como si pongo NULL
00:13:13
un segundito
00:13:15
el remove
00:13:17
te devuelve, supongo que sí
00:13:22
te devuelve un boolean
00:13:24
que te dirá true si ha hecho un borrado efectivo
00:13:26
o no
00:13:29
entonces
00:13:29
claro, esto es mucho mejor que los arrays
00:13:32
lógicamente
00:13:36
muchísimo mejor
00:13:37
¿qué ibas a decir?
00:13:41
A ver, lo comenté para que comprobáramos que si solo está uno de los dos y no están los dos,
00:13:43
el hash set no es capaz de identificar la igualdad, no funciona.
00:13:55
Entonces, si el hash code no está y yo le pasara dos objetos del mismo NIF, para él no son iguales,
00:13:59
porque él solo es capaz de identificar la igualdad si están los dos, hash code de igual.
00:14:07
El list no
00:14:11
El list con que esté el equals
00:14:13
Ya le vale para la igualdad
00:14:15
Pero ese es el casco de equals
00:14:17
Vale
00:14:19
Y set tiene un montón de métodos
00:14:20
Que son para mil cosas
00:14:23
Para ver si la colección contiene uno igual a otro
00:14:24
El contains
00:14:27
Para mil rollos, vale
00:14:28
Que iremos explorando las diferentes aplicaciones
00:14:30
Vale
00:14:32
- 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:
- 8
- Fecha:
- 4 de febrero de 2025 - 17:23
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 14′ 39″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 62.10 MBytes