Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 19-03-24 - 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:
Bueno, pues recordáis que estábamos en colecciones. Las colecciones son clases que me permiten tener un montón de objetos de un tipo alojados dentro de una única referencia.
00:00:00
Yo tengo una lista de alumnos, pues a partir de esa lista de alumnos tengo un montón. Tengo un set de jugadores, pues a partir de ese objeto set, de ese único objeto set, tengo dentro un montón de cosas sobre las que iterar, etc.
00:00:15
Esas eran las colecciones. Había dos tipos, listas y conjuntos, de las que entendemos las diferencias. En las listas cuenta el orden, en los conjuntos no hay orden que valga. Esa es la diferencia fundamental.
00:00:30
y luego ya dentro de las listas y los conjuntos
00:00:45
hay varias versiones
00:00:49
listas pues ArrayList, LinkedList
00:00:51
más o menos de ellas ya contamos mucho
00:00:52
y luego en conjuntos las basadas
00:00:54
en tabla hash como el hashSet
00:00:57
y el LinkedHashSet
00:00:59
y las basadas en árbol
00:01:00
que no tienen nada que ver con la tabla hash
00:01:02
las basadas en hash
00:01:04
ya vimos lo que era la tabla hash
00:01:07
por dentro como estaba
00:01:08
como funcionaba el hashSet
00:01:11
que primero hacía el código hash para irse a la posición
00:01:14
de la tabla hash y luego a partir de ahí navegaba
00:01:17
por la lista con el equals hasta encontrar el objeto
00:01:20
bueno, todo eso ya lo contamos
00:01:23
bueno, pues la versión que nos queda de los conjuntos
00:01:26
es el triset que está pensada
00:01:30
para optimizar las búsquedas
00:01:33
ya el hash set optimiza mucho porque a través
00:01:36
del código hash ya pum, ya te sitúa
00:01:38
ya se elimina muchos y ya te sitúa
00:01:42
solamente en una porción de ellos
00:01:43
ya con la tabla H se hacen las búsquedas eficientes
00:01:45
pero con el trisel se hacen todavía más
00:01:48
bueno, pues
00:01:50
esos que piensan y dicen
00:01:51
a ver, ¿cómo programamos estructuras
00:01:53
por dentro
00:01:56
útiles? pues el que pensó
00:01:57
la lista enlazada, que es así que la programamos
00:02:00
aquí, todo eso
00:02:02
pues ¿qué otra cosa se le ocurrió?
00:02:03
pues se le ocurrió
00:02:06
organizar los objetos
00:02:07
en un árbol
00:02:10
Organizar los objetos en un árbol
00:02:10
Entonces
00:02:13
Mis objetos
00:02:14
Qué pein más raro
00:02:19
¿Qué es esto?
00:02:24
¿Dónde tengo aquí el cuadrado de toda la vida?
00:02:28
¿Eh? ¿Qué?
00:02:31
Ya, ya, ya, pero yo quiero el cuadradito
00:02:36
Ah, formas, joder, parezco tonta
00:02:38
Vale, pues entonces
00:02:40
Ya está
00:02:42
Vale, pues este es un objeto
00:02:44
Este es otro objeto
00:02:48
Este es otro objeto
00:02:50
Este es otro, este es otro
00:02:51
Este es otro
00:02:54
Estos son mi mogollón de objetos
00:02:55
Que yo quiero gestionar
00:02:58
Fácilmente
00:03:00
Entonces ya sabéis que la opción
00:03:01
Básica es
00:03:04
Ah, la tosa una raíz, venga, tosa una raíz
00:03:06
Papapapa, tosa una raíz
00:03:08
Pero ya sabemos por qué los a raíz
00:03:09
Nos son a veces costosos
00:03:12
Y por eso se hacen las colecciones
00:03:13
Bueno, pues que otra opción tenemos
00:03:15
Pues que
00:03:17
A cada nodo de estos
00:03:19
a cada objeto de estos, además de su dato en sí, le acompañe la dirección del nodo de la izquierda y la dirección del nodo de la derecha.
00:03:21
luego este objeto tiene el dato en sí
00:03:52
el alumno, el jugador, lo que sea
00:03:55
y luego además tiene la dirección del objeto de la izquierda
00:03:57
y la dirección del objeto de la derecha
00:04:00
es igual que una lista enlazada
00:04:01
que al dato en sí le acompañaba la dirección del siguiente
00:04:03
pues aquí al dato en sí le acompañan dos direcciones ahora
00:04:06
le acompaña la dirección del de la derecha y la dirección de la izquierda
00:04:10
ahora este objeto tendrá el nodo en sí
00:04:13
o sea el dato en sí, el jugador, el alumno, lo que sea
00:04:17
y además le acompaña la dirección del objeto de la izquierda
00:04:19
y la dirección del objeto de la derecha.
00:04:25
Y así se construye un árbol binario
00:04:28
que optimiza la iteración, optimiza la consulta.
00:04:30
¿Por qué? ¿Qué se hace? Se le ordena.
00:04:39
Esto podría hacerse aleatoriamente.
00:04:42
Estar ahí, pues no, se le ordena.
00:04:44
Todos los elementos mayores que este
00:04:46
van a su izquierda
00:04:49
todos los mayores que este van a su izquierda
00:04:51
todos los menores van a su derecha
00:04:53
todos los menores van a su derecha
00:04:55
entonces cuando hay que hacer una consulta
00:04:56
pues se van comparando con el mayor que, menor que
00:04:58
se van comparando
00:05:00
es mayor que, ah pues está aquí
00:05:01
y todos estos ya no tengo que recoger
00:05:03
en una lista tienes que pasar por todos
00:05:05
en una lista para llegar a uno
00:05:08
es obligatorio pasar por todos
00:05:10
no hay tutía
00:05:12
cuando tienes una lista enlazada quieres llegar a este
00:05:13
tienes que empezar en el primero
00:05:15
eso es lo que hace el linked list por dentro
00:05:17
para nosotros
00:05:20
es transparente, nosotros llamamos a los métodos
00:05:21
a remove, lo que sea
00:05:24
y nos olvidamos, pero lo que hace
00:05:26
él por dentro es colocarse
00:05:28
en el primero e ir avanzando por todos
00:05:30
es lo que hace por dentro, es un rollo
00:05:32
pues este
00:05:33
lo que hace por dentro es un poco
00:05:35
más sencillo, porque no tiene que pasar por todos
00:05:38
para llegar a este
00:05:40
pasa por este y se acabó, no pasa por ninguno más
00:05:41
todos los demás no tiene por qué pasar
00:05:44
en una lista enlazada, como estarían todos en fila
00:05:46
para llegar a uno, hay que pasar
00:05:48
por todos, entonces es
00:05:50
mucho más eficiente los recorridos
00:05:52
en el árbol, porque
00:05:54
llegas antes al nodo objetivo
00:05:56
que en una lista, que están todos en fila
00:05:58
entonces la idea, pues está bien
00:06:00
la idea es buena
00:06:02
lo que pasa es que luego hay que programarla
00:06:03
y claro, no la vamos a programar nosotros
00:06:06
porque ya está hecha, pero podríamos
00:06:08
no es tan complicada, tendríamos que hacer
00:06:10
una clase nodo, como hacíamos en la lista enlazada
00:06:12
que la clase nodo tenía
00:06:14
la propiedad valor
00:06:16
y luego la propiedad siguiente nodo
00:06:17
queda la misma y siguiente, pues aquí tendrá
00:06:21
la propiedad valor
00:06:23
nodo izquierda y nodo derecha
00:06:24
y a partir de ahí lo podríamos
00:06:26
programar esta estructura como hicimos
00:06:28
la lista enlazada, igual, pero bueno
00:06:30
no tiene sentido perder tiempo
00:06:32
en eso porque ya lo está
00:06:34
¿esto está programado? sí, está programado
00:06:36
el objeto triset
00:06:38
bueno, pero ¿qué tenemos
00:06:39
que saber para usarlo bien?
00:06:44
yo he dicho muy alegremente antes
00:06:46
sin pararme
00:06:49
que todos los inferiores a este
00:06:49
van a su izquierda y todos los superiores van a su derecha
00:06:52
y aquí igual, todos los inferiores van a su izquierda
00:06:54
y todos los superiores van a su derecha
00:06:57
pero claro, inferior, superior
00:06:57
da igual
00:06:59
da lo mismo
00:07:01
porque es como
00:07:04
es como este hecho por dentro
00:07:05
supongo que estará hecho
00:07:10
si esto es un grafo, de teoría de grafos
00:07:14
entiendo que
00:07:16
es que no hay
00:07:18
izquierda o derecha, es que no hay un plano
00:07:20
me refiero, es que yo lo dibujo en un plano
00:07:22
pero no es que exista izquierda o derecha
00:07:24
eso lo que hay es un nodo
00:07:26
tiene nodo izquierda y nodo derecha
00:07:28
y cada nodo, o sea, hay dos direcciones
00:07:30
de memoria, cuando tú las dibujas
00:07:32
me da igual donde las dibujo
00:07:34
físicamente es que no hay un nodo izquierda y un nodo derecha
00:07:35
o sea, lo que hay es
00:07:38
nodo para un lado y nodo para el otro
00:07:40
¿vale? no hay izquierda y derecha
00:07:42
físicamente
00:07:44
es como decir si hay arriba y abajo en el universo
00:07:45
tú lo puedes dibujar, pero no lo hay
00:07:47
pues aquí lo que hay es nodos y dos direcciones
00:07:49
una
00:07:52
te lleva hacia los mayores
00:07:53
y otra hacia los menores
00:07:56
¿vale? entonces cada nodo tiene
00:07:57
su valor y dos direcciones
00:07:59
la dirección que te lleva a los que son mayores que él
00:08:01
y la dirección que te lleva a los que son menores que él
00:08:04
si tú quieres hacer un dibujo
00:08:06
de eso, pues
00:08:08
dibújalo como quieras
00:08:10
pero vamos que en sí
00:08:11
no es que no esté predefinido
00:08:12
es que no es un concepto
00:08:17
que exista
00:08:19
no es un concepto que tenga sentido
00:08:20
lo que hay físicamente
00:08:21
lo que está programado es
00:08:24
ese objeto nodo
00:08:25
que tiene luego dos direcciones
00:08:26
y una dirección es
00:08:28
la dirección que me llevan los objetos
00:08:30
que son mayores que yo
00:08:31
pero no es que haya un espacio
00:08:32
no sé si me explico
00:08:35
no hay un dibujo ahí
00:08:38
Esa sí es la pregunta.
00:08:39
Esa sí, claro.
00:08:42
Entonces, eso era justo lo que estaba diciendo.
00:08:44
Yo he dicho antes,
00:08:46
cada nodo te apunta
00:08:49
a
00:08:50
los que son mayores que tú
00:08:51
hacia este lado, a través de esta dirección.
00:08:53
Los que son mayores que tú hacia otro. Y lo he dicho así alegremente,
00:08:55
pero claro, ahora la pregunta sería
00:08:58
¿y qué significa ser mayor
00:08:59
o ser menor?
00:09:01
Pues otra vez tenemos, volvemos a lo mismo.
00:09:03
Hay clases en Java en los cuales
00:09:06
el orden está definido y ya es natural
00:09:08
que es la de los números
00:09:10
y la de los char
00:09:12
ya está, los números y los char
00:09:13
tienen su orden natural, al que podemos
00:09:16
acceder con el menor que y mayor que
00:09:18
entonces
00:09:20
eso está claro, pero ¿y el resto de los
00:09:22
objetos? pues al resto
00:09:24
de los objetos hay que darles desde arriba
00:09:26
el orden
00:09:28
¿cómo? implementando el comparable y el
00:09:29
comparétum, pues aquí
00:09:32
es obligatorio que
00:09:34
todas las clases que vayan a formar
00:09:36
parte de un triset, aquí ya sí que sí
00:09:38
es obligatorio que implementen
00:09:40
comparable, porque el triset
00:09:42
por dentro, necesita
00:09:44
comparar unos con otros para
00:09:46
decidir si yo te llevo a colgar
00:09:48
del nodo de los mayores
00:09:50
o te llevo a colgar del nodo de los menores
00:09:51
entonces si yo uso un triset
00:09:53
es obligatorio que la clase
00:09:55
a la que pertenecen los objetos
00:09:58
del triset, implemente comparable
00:10:00
¿vale?
00:10:01
porque es lo que usa el triset
00:10:03
Bueno, pues entonces, por ejemplo, aquí, pues nada, vamos a meter, ¿vale? Vamos a meter, por ejemplo, pues, ¿qué metemos en el triset? ¿Qué entidad? ¿Qué metemos? Que no sean alumnos, ni clientes, ni facturas, ni...
00:10:05
Venga, vamos a meter ciudades
00:10:26
Ala
00:10:31
Tengo mi clase ciudad
00:10:32
Y la clase ciudad
00:10:35
Pues tiene el nombre
00:10:38
Y tiene el número de habitantes
00:10:39
Vale, y ahora vamos a trabajar con conjuntos de ciudades
00:10:42
Pues para ver que ciudades
00:10:50
Tienen más habitantes que otras
00:10:51
Etcétera
00:10:53
Aquí tenemos el constructor
00:10:54
Y Getty Set
00:11:04
Vale, pues ya está
00:11:10
Esta es nuestra ciudad
00:11:17
ahora
00:11:18
queremos una aplicación para gestionar ciudades
00:11:19
para gestionar
00:11:23
para ordenar
00:11:24
para, bueno
00:11:28
pocas cosas se pueden hacer si solamente tenemos el nombre
00:11:29
y la cantidad de habitantes, pero bueno
00:11:32
pues venga
00:11:34
hacemos ya ahora el main
00:11:36
entonces vamos a gestionar un montón de ciudades
00:11:37
de nuevo, lo de siempre
00:11:49
las meto en un array, vaya rollo meterlas en un array
00:11:51
venga, no, una colección
00:11:53
¿qué colección?
00:11:54
Venga, pues vamos a usar un tríceps
00:11:57
Pues entonces
00:11:58
¡Hala! Pues ahí se queda
00:12:00
Efectivamente
00:12:21
Vale
00:12:36
Vale, pues yo he elegido tríceps
00:12:50
Porque me han dicho que es muy eficiente
00:12:58
Que está muy bien
00:12:59
Bueno, y ya puedo trabajar
00:13:00
Igual que trabajo con cualquier conjunto
00:13:04
Igual que trabajo con cualquier conjunto
00:13:06
Sabiendo lo que sabemos de los conjuntos
00:13:08
Y es que no admiten duplicados
00:13:12
Que no admiten duplicados
00:13:14
entonces, pues venga, yo no voy a meter ciudades repetidas
00:13:15
pues yo voy a empezar a meter ciudades
00:13:19
así a lo bestia, a ver qué pasa
00:13:20
y ya sabemos los métodos
00:13:22
para las colecciones, el add para añadir
00:13:24
el remove para borrar un elemento
00:13:26
el contains para ver si lo tiene
00:13:28
add all para añadir
00:13:31
muchos de golpe, remove all para añadir
00:13:32
muchos de golpe, ya sabemos los métodos
00:13:34
si no lo sabemos ya de memoria
00:13:36
bueno, pues aquí mismo también podemos usar esos métodos
00:13:37
por ejemplo, vamos a
00:13:40
añadir una ciudad
00:13:42
¿Vale? Todavía no he hecho el comparable
00:13:43
Porque vamos a ver efectivamente el problema que nos da
00:13:48
Venga
00:13:50
A la Madrid
00:13:51
Tenemos esta ciudad
00:13:55
Vale, entonces sabemos recorrer
00:13:59
Un set
00:14:26
Sabemos que con un for de índice no
00:14:27
Porque no hay posiciones
00:14:30
Pero podemos recorrer con un iterador o un for each
00:14:31
Si solamente vamos a consultar
00:14:33
Pues bueno, un for each
00:14:35
No es grave
00:14:37
Pues venga, vamos a ver cada ciudad
00:14:38
Vale, vamos a poner un toString
00:14:42
en ciudad
00:14:53
y así le paso directamente el objeto al system.println
00:14:54
o ponemos un toString
00:14:57
que no nos cuesta nada
00:14:59
vale, y el compilador
00:15:02
pues está encantado
00:15:07
porque
00:15:09
hemos usado el set correctamente
00:15:11
pero a mí se me ha olvidado poner aquí
00:15:14
esto, vale
00:15:15
hemos usado el set correctamente
00:15:17
hemos añadido que es un método
00:15:20
de set, hemos recorrido
00:15:22
lo hemos usado muy bien
00:15:24
Porque todos los conjuntos se usan igual
00:15:24
Se añade, se borra, se recorre
00:15:29
Todos iguales
00:15:31
Pues venga, ahora vamos a ejecutar esto
00:15:32
A ver qué pasa
00:15:36
Lo ejecutamos y efectivamente
00:15:37
Me dice, oye
00:15:41
Si leemos que esto es fundamental
00:15:42
Me dice, espérate tú
00:15:49
La ciudad esta
00:15:51
Yo no puedo
00:15:54
Hacerle un casting a comparable
00:15:57
No puedo
00:15:59
traducido al lenguaje natural
00:16:01
es que yo no sé
00:16:04
traducido al lenguaje natural
00:16:06
es
00:16:10
oye, yo soy el triset
00:16:11
yo soy el triset
00:16:13
y he intentado
00:16:15
cuando me he cogido cada nodo decir
00:16:17
tú eres mayor que este o menor, a ver de dónde te hago colgar
00:16:19
y no he sabido
00:16:21
no he sabido quién es mayor y quién es menor
00:16:23
entonces como no he sabido quién es mayor y quién es menor
00:16:25
no puedo meter en el triset
00:16:27
y ahí se ha quejado
00:16:29
claro, porque efectivamente
00:16:30
un triset para gestionar
00:16:32
sus objetos por dentro
00:16:34
para gestionarlos, necesita saber
00:16:36
cuál es mayor y cuál es menor
00:16:39
compararlos entre sí
00:16:40
y las ciudades
00:16:41
no tienen un criterio de comparación natural
00:16:43
si yo no se lo doy, no son como los números
00:16:46
entonces, ¿cómo dábamos criterios
00:16:48
de comparación
00:16:50
a los objetos que no eran
00:16:51
números ni char?
00:16:54
pues haciéndoles implementar
00:16:56
la interfaz, de esta manera
00:16:58
¿verdad?
00:17:03
si le hacíamos implementar
00:17:06
implementamos la interfaz
00:17:07
comparable del objeto en particular
00:17:10
y ahora ya al implementar
00:17:12
comparable pues tenemos que
00:17:14
añadir
00:17:16
el método que
00:17:18
falta
00:17:20
y aquí
00:17:20
es donde ponemos ya nuestro criterio de ordenación
00:17:23
y aquí lo tenemos que
00:17:26
decidir
00:17:28
aquí tenemos que decidir
00:17:29
esto pasa
00:17:31
por decidir primero qué propiedad es la que identifica a mi clase de forma única.
00:17:32
Lo normal para que un diseño esté bien hecho, lo natural,
00:17:41
es que haya una única propiedad que me sirva como clave primaria.
00:17:44
Pero como haya claves primarias múltiples ya se complica un montón.
00:17:49
Por eso en las claves, yo no sé más o menos en bases de datos, en diseño,
00:17:53
en qué estáis haciendo en general.
00:17:57
pero normalmente veréis que en las tablas
00:17:59
cuando no hay una clave primaria natural
00:18:03
o sea, tenéis un alumno, nombre, apellido, edad, no sé qué
00:18:06
y a veces se crea siempre un campo id
00:18:09
que además se le pone que es autoincrement
00:18:13
y además haciéndole autoincrement
00:18:16
uno tiene la seguridad de que va a ser único
00:18:19
distinto para cada campo
00:18:21
y así tenemos además una clave primaria
00:18:23
en un solo valor
00:18:26
¿habéis trabajado con tablas
00:18:28
con claves primarias múltiples?
00:18:31
¿o la clave primaria siempre ha sido un campo?
00:18:34
pues es una clave primaria múltiple
00:18:41
que son dos campos
00:18:43
en general es recomendable
00:18:45
que las claves primarias
00:18:49
se puedan recoger en un solo campo
00:18:52
porque facilita muchísimo el trabajo con esos datos
00:18:54
y por eso cuando hay una tabla
00:18:58
que tiene una clave
00:19:02
que tiene claves primarias dobles
00:19:03
se suele generar un campo extra
00:19:04
de tipo autoincrement
00:19:08
y de que pueda hacer
00:19:10
de clave primaria
00:19:12
a ver, para qué quiero decir yo este rollo
00:19:12
pues que en un buen diseño de clases
00:19:15
también suele ocurrir lo mismo
00:19:17
lo natural es que, y en el trícel sobre todo es fundamental
00:19:18
para fitar el orden
00:19:21
que haya un único campo
00:19:22
que sea el campo que permita distinguir de forma única
00:19:24
En este caso estaría claro
00:19:26
¿Qué distingue de forma única una ciudad de otro?
00:19:29
El nombre
00:19:32
Porque pueden tener dos ciudades los mismos habitantes
00:19:33
El nombre
00:19:35
Pues entonces tenemos una clave primaria
00:19:35
Vale, pues entonces ahora ya
00:19:38
Establecemos el orden
00:19:40
En función de ese campo
00:19:42
Tenemos que establecer el orden en función de ese campo
00:19:44
Bueno, pues aquí como el campo
00:19:46
Primario es
00:19:49
Un string
00:19:50
Aquí lo natural es que el orden que fijemos
00:19:51
Sea el alfabético
00:19:55
entonces uno decide, tiene que decidir un orden
00:19:55
si quiere que esto
00:19:59
forme parte de un tríceps, tiene que decidir un orden
00:20:01
eso es incuestionable
00:20:03
tiene que decidir un orden
00:20:05
¿cómo decide ese orden? ¿como le dé la gana?
00:20:06
pues no, lo normal es que se vaya
00:20:08
al campo que está funcionando
00:20:11
como clave primaria
00:20:13
al que distingue de forma única a los objetos
00:20:14
en nuestro caso
00:20:17
es esta propiedad
00:20:19
y ahora ya en esa propiedad decide el orden
00:20:20
pues si es un string
00:20:23
El alfabético es el natural. Si es un número, pues el orden natural de los numeritos. Bueno, pues en nuestro caso el orden que tendría sentido decidir aquí para las ciudades es que se ordenen por orden alfabético de nombre.
00:20:25
Bueno, pues una vez que ya tenemos claro que el orden que nos pega y que viene bien ahí es el orden alfabético por nombre, desde luego no tendría sentido ordenarlos por número de habitantes.
00:20:38
porque ¿qué pasa con dos ciudades con el mismo
00:20:49
número de habitantes? son dos ciudades
00:20:51
distintas
00:20:53
no tendría sentido ordenarlos así, tiene sentido ordenarlos por nombre
00:20:54
que es lo que lo distingue
00:20:57
pues una vez que hemos identificado que eso es el criterio que queremos
00:20:58
nos vamos ya
00:21:01
a programar el método
00:21:03
y esto ya lo hemos hecho otras veces
00:21:05
pues la clase string
00:21:08
tiene el compareTo
00:21:10
para comparar alfabéticamente
00:21:11
entonces podríamos hacer
00:21:13
esto
00:21:16
y ya lo tenemos
00:21:17
nombre es el nombre de la ciudad que llama el método
00:21:21
o punto nombre es el nombre de la ciudad parámetro
00:21:25
esto es ya el compare to de la clase string
00:21:29
que ya me devuelve negativo si este alfabéticamente está antes
00:21:33
cero si alfabéticamente son el mismo
00:21:38
y positivo si este alfabéticamente está después
00:21:41
pues es justo lo que queremos
00:21:44
en mi compare to de ciudad
00:21:46
ordenar
00:21:48
vale, bueno esto ya lo hemos hecho
00:21:49
muchas otras veces
00:21:52
para usar el método sort de las listas
00:21:53
o el de
00:21:57
arrays, ya hemos hecho esto
00:21:59
vale, pues ya le hemos
00:22:00
dado al triset lo que necesita
00:22:03
que es
00:22:04
poder comparar ciudades entre sí
00:22:06
poder comparar ciudades entre sí
00:22:09
vale
00:22:10
entonces ahora ya este mismo código
00:22:14
este mismo código sin haberle cambiado
00:22:17
nada, cuando ahora
00:22:19
ejecutemos, ya está
00:22:21
he puesto una O porque este se llama O
00:22:24
claro, este, este
00:22:28
vale, entonces hará esto mismo
00:22:32
este mismo código sin cambiarlo, si lo ejecutamos
00:22:38
ahora ya sí, ya no tendrá
00:22:41
problema, vale
00:22:42
y además el triset nos da
00:22:44
otras prestaciones, otras comodidades
00:22:50
que como el árbol está ordenado
00:22:51
a la hora de iterar
00:22:53
él itera según el orden
00:22:55
que le hemos dicho, veis, Cádiz va antes que
00:22:57
Madrid y va antes que Sevilla. Entonces, el orden
00:22:59
de iteración en un tríceps es el
00:23:01
orden de los objetos. Es ese.
00:23:03
Entonces, cuando nos
00:23:07
interesa
00:23:07
que los objetos estén
00:23:08
ordenados
00:23:11
según el criterio de orden que
00:23:12
yo he fijado, pues un tríceps es
00:23:15
estupendo porque es que me los va colocando
00:23:17
ordenaditos y cuando yo itero por él
00:23:19
ya están ordenados según ese orden.
00:23:21
No según el orden al que lo metí.
00:23:24
No según ese orden al que lo metí, sino según
00:23:26
el orden que yo he dicho.
00:23:27
y si le meto aquí
00:23:29
una ciudad
00:23:31
le voy a añadir ahora otra
00:23:33
pues si alfabéticamente
00:23:36
es la primera, me la va a poner la primera
00:23:38
bueno, aunque la
00:23:40
voy a quitar la tilde porque no sé dónde está
00:23:52
en la tabla
00:23:55
vale, pues yo ahora cuando itere, veré que
00:23:56
Alaba la ha colocado la primera, porque el triset
00:24:03
va metiendo por orden y si yo itero
00:24:05
va iterando por el orden
00:24:07
del comparable
00:24:08
entonces efectivamente pues
00:24:10
conserva el orden que yo haya dicho
00:24:16
que puede ser útil
00:24:18
o puede no ser útil, nos puede dar igual o no
00:24:21
pero bueno, pues
00:24:22
es esa prestación que tiene
00:24:24
conserva el orden a la hora de iterar
00:24:26
¿y ahora qué ocurre?
00:24:29
en el set hemos dicho
00:24:32
en el set en general, en cualquier set
00:24:33
hemos dicho que el set no admite duplicados
00:24:35
yo no puedo meter el mismo objeto
00:24:37
una segunda vez, y aquí me podéis decir
00:24:39
¿y qué entiende por duplicados?
00:24:42
porque aquí no has hecho
00:24:44
un equal, si han hecho nada, un duplicado
00:24:45
según el equals de object, no
00:24:47
para el preset
00:24:48
los duplicados
00:24:50
son los que
00:24:53
el compare to da 0
00:24:55
ni equals ni nada
00:24:57
este es el único método que a él le importa
00:24:59
el único
00:25:01
entonces si yo ahora meto aquí
00:25:02
voy a intentar meter
00:25:04
otra vez a esta
00:25:06
voy a intentar meterla otra vez
00:25:12
y voy a volver a recorrer
00:25:20
¿vale?
00:25:22
tengo estas 4, las muestro, vuelvo a meter
00:25:30
esta con otros habitantes
00:25:32
otros, vuelvo
00:25:34
a meter esta y vuelvo a recorrer
00:25:36
vale
00:25:39
ejecuto esto
00:25:40
vale
00:25:43
y veis, esta es
00:25:44
la primera iteración
00:25:47
y esta es la segunda
00:25:49
no ha metido álava por segunda vez
00:25:50
no lo ha metido
00:25:52
y diréis, pero si no hay ningún equals aquí
00:25:53
¿cómo ha podido saber
00:25:56
que no hay ningún equals basado en nombre?
00:25:59
está el igual de obvio, el igual de obvio es proyección de memoria
00:26:00
¿por qué para él son iguales?
00:26:03
si solo tienen igual el nombre
00:26:05
porque para el triset la igualdad la da
00:26:06
este método
00:26:09
este
00:26:10
la da ese
00:26:11
entonces, este método dice
00:26:14
que la álaba
00:26:17
esta de aquí, de 4.000 habitantes
00:26:19
y la álaba que yo he metido después
00:26:21
de 10.000, según el compare
00:26:23
tú, me está devolviendo 0
00:26:25
luego son el mismo
00:26:27
no se niega a meterlo
00:26:28
porque en un set no se pueden meter duplicados
00:26:30
bueno, pues estas son
00:26:32
todas las particulares del tricer
00:26:36
y ya está
00:26:38
que necesita que haya un criterio
00:26:39
de orden en las clases
00:26:42
a las que
00:26:44
pertenecen los objetos
00:26:46
que van a formar parte del set
00:26:47
que los va metiendo ordenados
00:26:49
con lo cual cuando yo itere
00:26:52
voy a ver ese orden
00:26:53
que puede serme útil o no
00:26:55
aquí no hace falta que haya un sort, por ejemplo
00:26:57
aquí no hay que hacer un sort, es que ya
00:26:59
van entrando ordenados
00:27:01
y que los duplicados
00:27:02
para él
00:27:06
son los que devuelve
00:27:06
este método, para él el equals lo ignora
00:27:10
cuando yo
00:27:12
haga aquí un remove
00:27:14
por ejemplo, imaginaos que ahora queremos borrar
00:27:15
vamos a borrar de ciudades
00:27:17
quiero borrar Madrid
00:27:20
pues con hacer esto
00:27:24
es suficiente
00:27:26
poniendo aquí cualquier cosa, me da igual
00:27:26
vale, porque el remove que hace
00:27:35
recordad que lo que hace es
00:27:40
coge este objeto
00:27:41
y busca en la colección
00:27:44
el que sea igual a ese
00:27:46
y cuando lo encuentra
00:27:48
fuera
00:27:50
pero aquí que significa igual para el remove
00:27:51
aquí para el remove igual no significa
00:27:54
llamar al equals
00:27:56
aquí para el remove del triset
00:27:56
igual va a significar
00:28:00
el compare to
00:28:02
con lo cual, aunque no hay
00:28:03
ningún equals basado en el nombre
00:28:06
si me va a eliminar esa ciudad
00:28:07
me la va a eliminar porque cuando le aplique
00:28:10
el compare to verá que me da cero
00:28:12
con esta otra, luego es el mismo
00:28:14
vale, vamos a comprobarlo
00:28:15
porque yo no me fío nada de lo que digo
00:28:18
espera, vamos a ponerle
00:28:20
vale
00:28:27
pues si ejecutamos esto
00:28:45
los cuatro primeros
00:28:47
el segundo alabato no lo ha metido
00:28:51
y ha eliminado Madrid
00:28:53
el remove, pues me ha eliminado Madrid
00:28:55
me lo ha eliminado
00:28:57
porque el remove en este caso
00:28:59
no está tirando de equal, está tirando
00:29:01
del compare to
00:29:03
entonces el triset es
00:29:03
si uno se pusiera a contar
00:29:07
lo que pasa es que en números de objetos tan pequeños
00:29:09
es difícil de estimar
00:29:11
pero si en aplicaciones con
00:29:13
volúmenes de datos grandes, si uno
00:29:15
contara los milisegundos
00:29:16
que tardan los accesos
00:29:19
pues vería que el triset es
00:29:20
el más rápido en realidad
00:29:23
pero el triset lo que pasa es que exige
00:29:24
que haya un criterio de orden
00:29:27
y ese criterio de orden pues me puede complicar
00:29:28
la vida o no me la puede complicar
00:29:31
no sé, depende
00:29:32
en general los conjuntos
00:29:33
siempre son mejor elección que las listas
00:29:37
si yo no necesito
00:29:39
duplicados ni posición
00:29:41
y el hash set es el más sencillo
00:29:43
es el más sencillo
00:29:47
esperamos, el triset se usa mucho
00:29:49
porque es de accesos muy rápidos
00:29:51
¿vale?
00:29:53
bueno, sí
00:29:55
y ya con esto si queréis
00:29:57
lo dejamos
00:29:59
lo único, imaginaos que estáis en la situación
00:30:01
en la que queréis usar un triset
00:30:03
queréis usar un triset que es muy rápido
00:30:04
y está muy bien y queréis usar un triset
00:30:07
pero no tenéis acceso a las clases entidad
00:30:08
no tenéis acceso
00:30:10
entonces al no tener acceso, esto no lo podéis hacer
00:30:12
imaginaos que estáis en ese caso
00:30:15
a mí me han dicho
00:30:17
que tire de ciudad
00:30:19
pero, lo siento
00:30:20
no puedo tocarla
00:30:22
con lo cual si no puedo tocarla
00:30:25
no puedo hacer que implemente
00:30:27
entonces esto no estaría
00:30:29
esto de aquí
00:30:31
no estaría
00:30:33
entonces
00:30:36
según eso
00:30:39
pues el triset no va a funcionar
00:30:41
efectivamente no va a funcionar
00:30:44
pero todavía se puede hacer un apaño que es
00:30:45
al constructor de triset
00:30:47
yo le puedo pasar
00:30:50
un criterio de ordenación concreto
00:30:51
para él y decirle oye tú
00:30:54
usa este criterio
00:30:55
y ya está, y eso a través de
00:30:57
qué objeto se hacía, ¿alguien se acuerda?
00:31:00
cuando quiero pasar un criterio de ordenación concreto
00:31:02
por ejemplo, cuando ordenábamos una lista
00:31:03
con sort y queríamos pasarle
00:31:06
un criterio de ordenación
00:31:08
a través del objeto
00:31:09
comparator, que es otra cosa, no es el
00:31:13
comparable, ¿vale?
00:31:16
pues entonces, me voy a hacer un objeto
00:31:17
comparator, que es un criterio de ordenación
00:31:20
concreto, y ese criterio de ordenación
00:31:22
concreto se lo paso al tríceps
00:31:24
Y así no tengo que tocar la clase ciudad.
00:31:25
Y ese criterio de ordenación va a valer para ese triseto.
00:31:29
Entonces, ¿cómo se hacían esos comparator?
00:31:32
Pues, hacíamos un objeto en orden ciudad, ciudades.
00:31:37
Este objeto tenía que implementar este otro.
00:31:54
Entonces, al implementar este otro
00:31:58
Se hacía automáticamente
00:32:04
Criterio de ordenación
00:32:07
Y le tocaba implementar el método este
00:32:11
Vale, entonces aquí decíamos
00:32:13
Vale, muy bien
00:32:17
Pues dame el orden entre la ciudad O1 y la ciudad O2
00:32:18
Dame el orden entre la ciudad O1 y la ciudad O2
00:32:22
Bueno, como es el alfabético
00:32:24
Podríamos hacer O1.nombre
00:32:26
compare-tool
00:32:29
o dos.nombre
00:32:32
¡Hala!
00:32:39
Ya tengo un criterio de ordenación concreto
00:32:44
entre dos ciudades
00:32:46
y este criterio de ordenación
00:32:47
se lo paso a quien quiera. Al sort para ordenar
00:32:50
al triset para sus usos
00:32:53
se lo paso a quien quiera. Pues venga
00:32:54
vamos a pasárselo a este triset
00:32:56
como este triset me va a dar problemas
00:32:58
porque ciudad no tiene comparable
00:33:00
como me va a dar problemas
00:33:02
pues le voy a decir, oye
00:33:04
Cuidado, que te voy a pasar un nuevo criterio
00:33:06
Orden
00:33:08
Ciudades
00:33:11
Ala, como veis el constructor de Triset
00:33:14
Está sobrecargado, admite varias
00:33:18
Vale, le decimos
00:33:19
Ah, vale, me pasas un criterio de ordenación
00:33:21
En concreto
00:33:24
Pues muy bien, pues yo ya funciono
00:33:24
Según ese criterio de ordenación
00:33:28
Y ya está
00:33:30
Y bueno
00:33:32
Está funcionando igual
00:33:32
Y ciudad no implementa comparable
00:33:35
Pero le hemos dicho al triset
00:33:37
Cómo solucionar ese problema
00:33:38
Vale
00:33:40
Bueno, pues este es el triset
00:33:43
Su uso, etcétera, etcétera
00:33:47
Vale
00:33:49
Preguntas
00:33:51
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 7
- Fecha:
- 3 de abril de 2024 - 18:42
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 34′
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 154.22 MBytes