20250930-FicherosObjetos_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:
Vale, pues entonces
00:00:00
Como a nadie se le ocurre más
00:00:03
A mí es que solo me vienen Bini y Entidad a la cabeza
00:00:05
Como a nadie se os ocurre más
00:00:07
Términos
00:00:10
Y nos da pereza preguntarle a esa gente
00:00:11
Que le tenemos agobiado de tantas preguntas
00:00:13
Ya tendremos tiempo de preguntarle
00:00:15
Pues vamos a llamar
00:00:18
A nuestro paquete, pues Bins, por ejemplo
00:00:19
Aunque le podríamos llamar Modelo
00:00:21
Modelo es un nombre o Model es un nombre
00:00:23
Vale
00:00:25
Vale, y no nos habíamos puesto
00:00:27
de acuerdo en que íbamos a gestionar
00:00:29
vamos a gestionar
00:00:31
venga
00:00:34
el alumno
00:00:37
y el alumno
00:00:41
va a tener
00:00:43
esto también
00:00:44
nos va a servir como recordatorio general de programación
00:00:47
pero ya va a ser el último recordatorio
00:00:50
que hagamos porque no hace falta recordar nada
00:00:52
en realidad
00:00:54
el alumno va a tener
00:00:54
su
00:00:58
nombre
00:00:59
Su NIF, su nombre y su lista de asignatura.
00:01:01
Como asignatura es una palabra muy larga, vamos a poner módulo.
00:01:12
Vale, lo que suele ocurrir es que si suspendéis este módulo mío,
00:01:22
No suele ser tanto por los contenidos
00:01:32
Propios suyos
00:01:35
Que ya veréis, que no tienen mayor dificultad
00:01:37
Sino
00:01:39
Por cuestiones en general de Java
00:01:41
De desarrollo y programación en Java
00:01:43
Entonces
00:01:45
Pues es importante que
00:01:47
¿Quién?
00:01:49
No
00:01:52
Es muy completo
00:01:52
Y muy estupendo
00:01:56
Y por eso no hay manera de echarle del mercado
00:01:58
Pese a lo rígido
00:02:00
Que es y lo puñetero
00:02:02
que tienes que tiparlo, todo que tienes
00:02:04
que no sé cuántos, etc.
00:02:06
Pero claro, eso le da
00:02:08
mucha robustez
00:02:10
y mucha flexibilidad.
00:02:11
Venga, pues a ver, tenemos esto, aquí
00:02:13
hacemos siempre
00:02:15
yo para los constructores, como ya sabéis
00:02:16
soy muy vaga y no los pongo a menos que
00:02:22
sea imprescindible. Dejo el por defecto y luego
00:02:24
seteo las propiedades y ya está.
00:02:26
Pero eso no significa
00:02:28
que sea lo habitual.
00:02:29
Luego,
00:02:33
si una vez que hago la aplicación
00:02:33
ya veo que
00:02:35
necesito un constructor, pues en ese momento lo creo
00:02:37
y listo
00:02:39
bueno, pues tendríamos
00:02:40
un bin básico, y tan básico
00:02:46
porque es que por tener no tiene ni
00:02:48
toString, ni tiene equals, ni tiene nada
00:02:49
pero ya sabemos
00:02:52
en qué situaciones puede hacer falta
00:02:53
el equals, en cuál es el toString
00:02:56
si aparecen
00:02:57
lo ponemos
00:03:00
si aparecen lo ponemos
00:03:01
aquí si hiciéramos un equals
00:03:03
si sobre escribiéramos equals, ese equals
00:03:05
sobre qué propiedad lo apoyaríais
00:03:08
sobre nil, claro, ¿verdad? porque un alumno será igual a otro
00:03:12
por su nil, no por su nombre, porque Adrián es Alonso, pues hay muchos
00:03:16
ni por su módulo, ¿vale? y ahora
00:03:20
el módulo este, pues la lista de módulos que tiene
00:03:24
pues le vamos a poner
00:03:28
el nombre del módulo
00:03:31
Y siempre es muy socorrida
00:03:34
La nota
00:03:37
Que este modelo de datos
00:03:38
Lo habremos hecho mil veces, seguro
00:03:41
Porque
00:03:43
Imaginación
00:03:43
Justo imaginación no es lo que nos sobra
00:03:45
A mí por lo menos
00:03:49
Vale
00:03:52
De nuevo
00:03:54
Pues un poco vago
00:03:59
El bin, ni equals, ni toString
00:04:01
Ni constructores, si nos va haciendo falta
00:04:03
Lo hacemos aparecer, vale
00:04:05
hala pues modelo de datos
00:04:07
de dos entidades y ya está
00:04:10
esta aplicación solo gestiona alumnos
00:04:12
con los módulos que tiene y sus notas
00:04:14
se acabó
00:04:15
entonces
00:04:16
como fruto del análisis de la aplicación
00:04:19
uno habrá sacado cuáles son los requisitos
00:04:21
funcionales de la aplicación
00:04:24
¿vale? los requisitos funcionales de la aplicación
00:04:26
es lo que
00:04:28
tiene que hacer
00:04:30
eh
00:04:31
insertar un nuevo alumno
00:04:32
eliminar un alumno, recuperar un alumno
00:04:36
dado su NIF
00:04:39
agregar un módulo
00:04:40
a un alumno, quitarle un módulo
00:04:42
a un alumno, ver las notas
00:04:45
de un alumno en tal módulo
00:04:46
esas serían los requisitos funcionales
00:04:48
que después de habernos entrevistado ahí
00:04:50
todos juntos
00:04:52
hemos hecho un documento en el que dice
00:04:54
requisito funcional 1, tatatí
00:04:56
requisito funcional 2, tatatí, requisito funcional 3
00:04:58
tatatí, vale
00:05:00
entonces parte de esos requisitos funcionales que hemos dicho
00:05:01
aluden precisamente al hecho
00:05:04
de insertar alumno,
00:05:07
eliminar alumno. Claro, sale la pregunta
00:05:08
¿de dónde? ¿Dónde van a estar
00:05:10
esos alumnos guardaditos?
00:05:12
Bueno, pues hemos dicho
00:05:15
que ahora mismo los vamos a guardar en un
00:05:16
fichero, no en una base de datos,
00:05:18
sino en un fichero.
00:05:20
Luego,
00:05:23
de alguna manera,
00:05:25
tendremos que gestionar ese fichero.
00:05:28
¿Vale?
00:05:31
Entonces,
00:05:33
Podemos hacer
00:05:33
Por ejemplo
00:05:36
El paquete ya de lógica
00:05:37
¿Vale?
00:05:41
El paquete de lógica
00:05:44
Donde va nuestra aplicación
00:05:45
¡Hala!
00:05:47
Así a lo bestia
00:05:50
Entonces
00:05:51
El paquete de lógica
00:05:52
Donde va nuestra aplicación
00:05:54
Pues vamos a hacer
00:05:55
Nuestra
00:05:57
Aplicación
00:05:58
De gestión
00:06:01
De alumnos
00:06:02
Vale
00:06:04
Nuestra aplicación de gestión de alumnos
00:06:05
Se me ha olvidado
00:06:10
Ponerle esto
00:06:12
No lleva corchetes
00:06:13
¿El qué?
00:06:22
El stream
00:06:23
Ah, sí
00:06:24
Lleva corchetes o lleva esto
00:06:26
Que es más bonito
00:06:30
Pero bueno, de esto ya
00:06:32
Como no llegamos a hablar el año pasado
00:06:33
A ver esto
00:06:36
Por si alguien le inspira curiosidad
00:06:38
Esto permite
00:06:40
que un método tenga un número de parámetros variable
00:06:45
que es algo que no llegamos a mencionar el año pasado
00:06:49
porque es meter demasiadas cosas
00:06:52
y uno se lo puede estudiar en 10 minutos
00:06:54
entonces nosotros cuando hablamos de métodos el año pasado
00:06:57
dijimos que cuando uno declara un método
00:07:00
tiene que poner exactamente
00:07:03
todos los parámetros que va a recibir con su tipo
00:07:06
vale, eso está bien, no pasa nada
00:07:10
podemos vivir así el resto de nuestra vida
00:07:12
pero a veces a lo mejor nos da un poquito más de libertad
00:07:14
el que un método pueda recibir a veces un int
00:07:20
o a veces dos int o a veces tres int
00:07:23
o a veces una cantidad variable de int
00:07:25
y luego siempre un double
00:07:29
es decir una cantidad de parámetros variable
00:07:31
entonces estos tres puntos aquí en medio
00:07:34
significan este método puede recibir
00:07:38
un string o dos o tres
00:07:42
o cuatro, depende de la situación
00:07:45
no es igual que poner
00:07:47
unos corchetes, cuando pones unos
00:07:49
corchetes dices, este método recibe
00:07:51
un array, vale
00:07:53
este puede recibir un string suelto
00:07:54
o dos string sueltos o tres string sueltos
00:07:57
esa es la idea, y luego también podría
00:07:59
tener este método, bueno ya no sería el main
00:08:01
porque lo estoy convirtiendo en otro
00:08:03
pues podría recibir
00:08:04
vale
00:08:07
bueno, es que como le
00:08:08
Tiene que ser el
00:08:13
Vale, tendría que ser el último
00:08:21
Para que luego en la llamada no hubiera confusión
00:08:24
Sobre lo que tú le estás pasando
00:08:26
Por ejemplo, esta sería una declaración válida
00:08:28
Para el método
00:08:36
Siempre le tienes que pasar un entero
00:08:37
Siempre un entero
00:08:40
Y luego le puedes pasar un string solo
00:08:41
O también le podrías llamar
00:08:44
Pasándole dos strings o tres
00:08:45
Bueno, solo para que os suenen
00:08:47
Los tres puntitos
00:08:49
Vale, solo para que suenen
00:08:51
No es algo que nos importe a nosotros
00:09:01
Pero como ahora ya no suenan
00:09:03
Si alguien, sobre todo si alguien lo ve
00:09:05
Ya no se asusta
00:09:08
Y si alguien quiere los detalles
00:09:09
Pues ya se lo mira en
00:09:11
En 15 minutos
00:09:12
Y ya domina todo lo
00:09:15
Relacionado con esos tres puntitos
00:09:16
¿Con los tres puntitos le puedes enviar nada?
00:09:19
No
00:09:25
estoy, no lo sé
00:09:26
creo que le tienes
00:09:28
que, creo que le puedes enviar
00:09:31
nada, creo, pero no estoy segura
00:09:33
no estoy segura, habría, esa es la diferencia
00:09:35
entre si tú le pones un array, que tienes que poner null
00:09:37
en el caso de que no hayas enviado nada, null
00:09:39
o el array, un array vacío
00:09:41
ahí creo que puedes no enviar
00:09:43
nada
00:09:45
vale, pues entonces
00:09:46
aquí estamos gestionando
00:09:49
los alumnos estos
00:09:51
y en algún sitio
00:09:52
tenemos que decidir donde van nuestros alumnos
00:09:55
pues hemos dicho un fichero
00:09:57
entonces como solo tenemos un fichero
00:09:59
ese fichero
00:10:01
puede ser una variable estática que pongamos
00:10:03
aquí fuera, verdad
00:10:05
static pues
00:10:06
file fichero
00:10:09
alumnos
00:10:13
vale, este va a ser donde van
00:10:14
nuestros ficheros
00:10:17
y ahora nuestra aplicación lo primero que tendrá que
00:10:18
hacer es
00:10:25
dime el nombre fichero alumnos
00:10:26
para que la aplicación ya cargue los que hubiera
00:10:29
y ahora ya
00:10:37
pues puede instanciar
00:10:39
fichero alumnos
00:10:41
con new file
00:10:43
ahora ponemos
00:10:47
el scanner
00:10:53
que next
00:10:54
next line para
00:11:07
en el salto de línea
00:11:09
y next para en el token de separación
00:11:10
y ese token tú lo puedes cambiar
00:11:13
El token de separación por defecto es el espacio
00:11:15
Entonces con next
00:11:17
No puede ser una línea con espacios
00:11:19
A menos que previamente cambies el token de separación
00:11:20
Que habrá un método para cambiarlo
00:11:23
Hombre, como el fichero no tendrá espacios
00:11:24
Pues podríamos poner aquí
00:11:34
El next y ya está
00:11:36
El nombre del fichero no tendrá espacios
00:11:37
Perdón
00:11:40
Y ahora aquí ya nos podríamos plantear
00:11:41
Hacer la aplicación, vamos a hacer un menú
00:11:46
De dos opciones, porque si no nos estamos
00:11:48
Mil años, ¿vale? Solamente
00:11:49
Pues por ejemplo vamos a insertar alumno y recuperar alumno, para ver que verdaderamente el alumno se ha insertado y todo eso, insertar alumno y recuperar alumno, vale, esta sería la opción 1 por ejemplo y esta la opción 2
00:11:52
Y vamos a ponerle
00:12:26
La cero
00:12:31
Salir
00:12:32
Y ahora la opción
00:12:35
Para no tener problemas
00:12:38
Con el salto de línea y todo eso
00:12:42
La vamos a leer como string directamente
00:12:44
Porque si empezamos a mezclar
00:12:47
Next in con next line
00:12:49
Recordad que el next in deja el salto de línea
00:12:51
En el buffer
00:12:53
Luego el next line siguiente se va a comer el salto de línea
00:12:53
Y entonces habría que limpiar el buffer
00:12:57
Si hacemos todo next line
00:12:59
No hay ningún problema con eso
00:13:01
Entonces vamos a leer
00:13:02
Esto así
00:13:04
Y ahora ya pasemos rápidamente el switch
00:13:06
En el caso
00:13:13
De que
00:13:19
Tengamos una
00:13:20
Lo que sea
00:13:26
En el caso
00:13:31
Uy una A no, un 1
00:13:34
Un 1
00:13:36
A sacar errores y nos despertamos
00:13:37
¿Eh?
00:13:40
Pero
00:13:41
Luego habla de la verdad
00:13:41
Entonces ya y dormimos
00:13:46
El switch termina
00:13:48
Esto sería
00:13:58
Y aquí siempre poníamos
00:14:02
Un default, verdad
00:14:09
Con
00:14:10
Opción incorrecta
00:14:13
Joder
00:14:17
Este es el final del switch
00:14:18
Este es el final
00:14:29
Del do
00:14:31
Vale, con lo cual aquí lógicamente
00:14:32
Nos falta el while
00:14:35
mientras la opción
00:14:36
sea distinta
00:14:38
de la cero, vale
00:14:40
mientras la opción sea distinta de la cero
00:14:46
todo eso, este sería
00:14:48
el esqueleto de nuestra aplicación
00:14:52
solo tiene dos funcionalidades
00:14:54
vale
00:14:56
y ahora ya aquí
00:14:58
ahora ya aquí
00:15:04
para insertar alumno
00:15:06
pues tendríamos que
00:15:08
pedir los datos del alumno
00:15:09
para no engrosar un switch case que queda muy feo
00:15:12
vamos a hacerlo mediante un método de solicita datos
00:15:15
alumno igual a solicita
00:15:19
datos, vale, importamos
00:15:24
alumno, bueno, solicita datos
00:15:29
pues es este método que tendremos que hacer ahora
00:15:33
que me va a devolver un alumno, importamos la clase alumno
00:15:36
y ahora ya
00:15:41
alumno
00:15:44
pues tendríamos que meterlo
00:15:46
en nuestro fichero
00:15:48
tendríamos que meterlo en nuestro fichero
00:15:49
no es necesario
00:15:52
que recordemos mapas y nada de eso
00:15:58
porque podríamos
00:16:00
vamos a hacer una cosa, por si alguien tiene los
00:16:01
mapas olvidados
00:16:04
como esta es la versión patatera
00:16:05
luego en la versión buena podemos hacerlo
00:16:07
directamente con el fichero
00:16:10
vamos a hacer la versión vaga
00:16:12
que es
00:16:14
la aplicación cuando arranca
00:16:15
coge todos los alumnos
00:16:17
y los lleva a un map
00:16:20
si hago eso
00:16:21
esto de meter el alumno
00:16:23
recuperar el alumno, trabaja sobre el map
00:16:26
se hacen dos patadas en una línea
00:16:28
entonces
00:16:30
¿qué tendríamos que hacer aquí?
00:16:31
yo tengo mi fichero
00:16:36
y tengo
00:16:37
una estructura map
00:16:40
que es la que va a tener los datos
00:16:41
vale, mi estructura map
00:16:43
es un diccionario
00:16:45
y el diccionario ya sabéis que la utilidad
00:16:49
que tiene respecto a una colección normal
00:16:52
es que te saca la clave del objeto
00:16:55
te la saca aquí fuera
00:16:58
y al tener la clave del objeto fuera
00:17:00
puedes hacer las búsquedas, las modificaciones
00:17:02
los borrados mucho más fácil
00:17:05
sin tener que recorrer
00:17:07
Si tú tienes una colección con los objetos así
00:17:08
Para hacer cualquier cosa
00:17:12
Tienes que recorrer hasta que lo encuentres
00:17:13
En un mapa
00:17:15
La clave primaria de cada objeto
00:17:17
La has sacado fuera
00:17:19
Con lo cual puedes usar directamente
00:17:20
La clave para localizarlo
00:17:23
Sin tener que recorrer
00:17:25
Bueno, pues en este caso
00:17:26
Lo que vamos a guardar en el mapa
00:17:28
Son alumnos, ¿verdad?
00:17:29
Primero tenemos que pensar
00:17:32
¿Cuál es la clave de nuestros alumnos?
00:17:33
Pues nos vamos a nuestros alumnos
00:17:35
La clave es el NIF, que es un string
00:17:36
Luego nuestro map va a tener como clave string
00:17:38
Y como valor alumno
00:17:41
¿Verdad?
00:17:44
Entonces inicialmente
00:17:45
Esto va a ser
00:17:47
Un mapa vacío
00:17:48
Luego lo primero que tendremos que hacer
00:17:50
Una vez que nos han dado el nombre del fichero de alumnos
00:17:58
Es, bueno, ni lo he llamado
00:18:01
No le he dado ni nombre
00:18:03
Alumnos
00:18:05
Y vamos a importar tanto map como hashmap
00:18:06
Vale
00:18:10
Entonces
00:18:17
Recordad que había varias implementaciones
00:18:19
De diccionarios o mapas
00:18:25
Como lo queráis llamar, diccionario o mapa
00:18:27
HashMap, Trimap y LinkedHashMap
00:18:29
¿Cuál era la diferencia entre ellas?
00:18:34
La diferencia era en qué tipo de estructura
00:18:37
Se guardaba la clave
00:18:40
Esa era la diferencia entre ellas
00:18:41
En qué tipo de estructura
00:18:43
Se guardaban las claves
00:18:45
porque las claves son las que hay que manejar
00:18:47
de alguna manera, las que Java
00:18:50
tiene que manejar con más
00:18:52
soltura, porque son las que
00:18:54
usa para localizar los objetos
00:18:56
etcétera, entonces
00:18:57
si las claves se guardan en un hash set
00:18:59
entonces tenemos un hash map
00:19:02
si yo quiero que las claves se guarden
00:19:03
en un tree set, entonces tendremos
00:19:05
un tree map, vale, a su vez
00:19:07
cuál es la diferencia entre guardar en un
00:19:10
hash set y guardar
00:19:11
en un tree set, en un
00:19:13
HashSet se guardaban
00:19:18
los elementos
00:19:20
atendiendo
00:19:21
se generaba un código de hash
00:19:24
y se guardaban internamente, todo eso
00:19:26
luego nos era transparente a la hora de usarlo
00:19:28
pero si explicamos
00:19:30
como funcionaba por dentro
00:19:32
para poder elegir con criterio
00:19:33
una estructura u otra
00:19:35
vale, ambas son muy eficientes
00:19:37
sobre todo la HashSet
00:19:39
quizás es la que más se usa, entonces cuando
00:19:41
Java guarda internamente
00:19:44
en un hash set lo que hace
00:19:46
es
00:19:48
asociar un código de hash
00:19:48
a cada elemento, entonces ese código
00:19:51
de hash hace que luego
00:19:54
cuando tiene que localizarlo dentro del hash set
00:19:56
lo hace muy rápido, porque tú le das un objeto
00:19:57
saca el código de hash de ese objeto
00:19:59
con ese código de hash se va a su tabla hash
00:20:01
y dice, ah este código de hash es este
00:20:04
está aquí colocado
00:20:05
entonces es bastante rápido localizar
00:20:07
los elementos en un hash set porque a cada objeto
00:20:10
tiene un código de hash
00:20:12
te llega un objeto para localizarle
00:20:13
haces el hash, es este
00:20:15
pero eso implicaba que cada
00:20:16
que la clase esta de aquí
00:20:19
tiene que tener una función
00:20:21
para generar ese código, una función
00:20:23
esa función era la implementación
00:20:25
esta, vale
00:20:28
string ya la tiene, string ya tiene
00:20:30
su propia implementación de hashCode
00:20:33
no tenemos que hacerla nosotros
00:20:35
luego puedo usar
00:20:36
un hashMap que implica
00:20:38
a su vez que las claves van en un hashSet
00:20:41
sin preocuparme de nada más
00:20:43
porque string ya tiene una función de hash
00:20:44
para generar esos códigos de hash
00:20:47
que le van a permitir internamente a java
00:20:49
trabajar rápidamente con el conjunto
00:20:51
que repito
00:20:53
efectos de programar nosotros
00:20:55
es que eso no es transparente
00:20:56
ni vemos como genera los hash
00:20:58
como los usa para localizar
00:21:00
nosotros metemos en la colección
00:21:01
eliminamos y ya está
00:21:03
pero
00:21:05
si que tenemos que saber
00:21:06
que si una clave
00:21:09
es de una clase concreta
00:21:10
esa clase tiene que tener una implementación
00:21:12
de hashcode lo más
00:21:15
eficiente posible
00:21:17
string ya la tiene
00:21:17
¿vale? pero si yo pusiera como clave
00:21:20
una clase mía
00:21:22
cualquiera, una clase que yo
00:21:24
me he inventado clave
00:21:26
pues tengo que hacer una implementación
00:21:27
de hashcode
00:21:31
ahí
00:21:32
la tengo que hacer
00:21:34
que la hicimos el año pasado
00:21:35
pues la que te generaba el eclipse es suficiente
00:21:38
porque tampoco teníamos conocimientos
00:21:40
como para generar una óptima en función de
00:21:42
la estadística de mis datos, lo ideal
00:21:44
es que en función de la estadística
00:21:46
del uso de mis datos
00:21:48
yo generara una óptima, pero bueno
00:21:49
eso ya es pasarse
00:21:52
nadie hace eso, ¿vale?
00:21:54
con la implementación de Haskell de estándar
00:21:56
que te ofrece Eclipse ya es un compromiso
00:21:58
más o menos
00:22:00
porque si no implementamos esto
00:22:01
¿qué versión de Haskell usa?
00:22:04
la de Object, porque ya sabéis
00:22:08
que todas las clases eran de Object, todas
00:22:10
entonces si yo no sobrescribo
00:22:12
hashCode va a utilizar la implementación
00:22:14
de object y la implementación
00:22:16
de object
00:22:19
convierte el set en una lista
00:22:19
normal y corriente porque todos los elementos
00:22:23
devuelven el mismo hashCode, todos, con lo cual
00:22:24
¿de qué me serviría?
00:22:27
usar un hashSet si no sobrescribo
00:22:29
la implementación de object
00:22:31
de hashCode es que no
00:22:33
hace un código de hash distinto para cada elemento
00:22:35
con lo cual es como si estuvieran todos en una lista
00:22:37
bueno, todo esto es más o menos
00:22:39
del año pasado, lo repaso un poco por encima
00:22:41
pero lo que importa ahora
00:22:43
es que a la hora
00:22:44
de usarlo, la clase
00:22:47
que pongamos aquí, si es
00:22:49
que es un HashMap, tiene que tener
00:22:51
una implementación de hash, este
00:22:53
bien la tiene, porque ya está hecha
00:22:55
esa clase y la tiene, ¿vale?
00:22:57
Bueno
00:23:00
y si poníamos el trimap
00:23:00
esto se guardaba en un
00:23:03
triset, eso tenía una
00:23:07
implicación, en un triset
00:23:10
implica que internamente lo guarda en un árbol binario
00:23:12
donde es muy eficiente el árbol binario
00:23:16
porque se coloca según un criterio de orden
00:23:19
si es mayor hacia acá, este es mayor que este
00:23:24
este es menor que este, este es menor que este
00:23:28
este es mayor que este, este es menor que este
00:23:31
entonces al guardar según un criterio de orden
00:23:33
a la hora de localizar, localiza muy rápido
00:23:36
porque se va quitando punto a la mitad de los elementos
00:23:40
de golpe, se los va quitando entonces localiza
00:23:43
rápido, por eso el trimap es eficiente
00:23:45
¿vale? pero a la hora
00:23:46
ya nosotros de escribir el código
00:23:49
¿qué implicación
00:23:50
tenía si yo aquí
00:23:53
decido un trimap
00:23:55
en vez de un
00:23:57
hasmap, decido un trimap
00:23:59
ahora ya a la hora de escribir código
00:24:01
¿qué implicación tenía? ¿alguien la recuerda?
00:24:03
seguro que sí
00:24:05
claro
00:24:06
que esta clase
00:24:11
tenía que tener un criterio de orden.
00:24:12
¿Y cómo hacemos que una clase
00:24:15
tenga un criterio de orden?
00:24:16
Implementando comparable
00:24:19
e implementar comparable
00:24:20
implica implementar el método compare-tú.
00:24:23
Entonces le damos un criterio de orden.
00:24:25
Que no podemos...
00:24:28
String ya implementa comparable,
00:24:29
con lo cual podríamos usar 3Maps sin problema.
00:24:30
Que tenemos aquí una clase
00:24:32
que no implementa comparable,
00:24:34
pero no la hemos hecho nosotros.
00:24:37
Ni tenemos acceso a ella
00:24:39
y no podemos tocarla, con lo cual
00:24:41
yo no puedo de repente coger su código
00:24:43
fuente y decir, voy a añadirle que
00:24:45
implemente comparable y por el método que me dé la gana
00:24:47
no puedo, esa clase no la he hecho yo
00:24:49
como ocurre la mayoría de las veces y no puedo
00:24:50
eso implica que es imposible
00:24:53
usar un trimap
00:24:55
vale, pero bueno
00:24:56
implica que entonces aquí tienes que hacer una instancia
00:25:03
de la heredada, vale
00:25:05
sí, pero cambias el modelo de datos
00:25:07
un poquito, pero bueno, sería una solución
00:25:09
pero cambiándolo, hay una más fácil
00:25:11
que es
00:25:13
pasas aquí en el constructor
00:25:14
un objeto comparator
00:25:18
¿os acordáis?
00:25:21
entonces el comparator es un objeto
00:25:24
que es un criterio de orden concreto
00:25:27
para el uso del map
00:25:29
no es que ese criterio de orden
00:25:31
simplemente para siempre en esta clase
00:25:33
no, solamente el map lo va a usar
00:25:35
él solamente, su trimap
00:25:38
lo va a usar cuando necesite meter las cosas
00:25:40
Va a usar ese criterio de orden que yo ponga aquí
00:25:43
Y esta clase se queda inalterada
00:25:45
Ni comparable ni nada
00:25:47
¿Vale?
00:25:48
Bueno, pues aquí
00:25:51
No nos complicamos la vida
00:25:52
En realidad es que da igual cual pusiéramos
00:25:54
Como string, implementa comparable
00:25:56
Implementa hashcode
00:25:58
Es que da igual el que eligiera
00:26:00
Pero
00:26:02
Si hay una diferencia
00:26:04
Con esto ya paramos un segundito
00:26:07
De implementar hashback a implementar
00:26:09
trimap, hay una diferencia
00:26:11
visible que yo podría observar luego
00:26:13
trabajando. ¿La recordáis?
00:26:15
Que cuando yo itere,
00:26:17
que puede ser que yo tenga que
00:26:22
iterar para ver todos los alumnos,
00:26:23
para ver todo. Pues cuando
00:26:25
yo itere, cuando itero en un triset,
00:26:27
la iteración se va a hacer
00:26:31
en el orden
00:26:33
del criterio de orden.
00:26:34
Entonces, la iteración me va a sacar
00:26:37
los elementos siempre ordenaditos.
00:26:39
La iteración en un haset
00:26:41
no me lo saca siguiendo ningún criterio
00:26:43
de orden que yo haya definido
00:26:46
entonces, si mi aplicación
00:26:47
va a hacer iteraciones para mostrar listados
00:26:50
y lo que sea, pues estás cómoda
00:26:52
porque esa iteración
00:26:54
ya me va a dar los elementos ordenados
00:26:56
aquí quiero yo ordenar
00:26:58
los alumnos por NIF, si yo tuviera una
00:27:00
funcionalidad que fuera
00:27:02
dame la lista de alumnos ordenados
00:27:03
por NIF, pues hombre
00:27:06
ahí podría tener sentido elegir un trimap
00:27:08
porque cuando itere por el map van a salir
00:27:09
todos ordenados por la CLAR
00:27:11
que es el... si me da igual
00:27:13
pues entonces un HashMap
00:27:15
que siempre es más
00:27:17
más comodillo y esas cosas
00:27:19
vale, vamos a parar
00:27:22
un segundinito
00:27:23
- 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:
- 9
- Fecha:
- 30 de septiembre de 2025 - 18:52
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 27′ 26″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 525.04 MBytes