Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 27-02-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:
a usarlas. Pues venga, vamos a hacernos una clasecita alumno, por ejemplo, para poder
00:00:00
guardar objetos de un tipo más sofisticado que string o cualquier otra cosa. Venga, me
00:00:09
voy a hacer un paquete, model para guardar las entidades y me voy a hacer un alumno.
00:00:16
Venga, pues este alumno
00:00:23
Se va a caracterizar
00:00:33
Por su número de matrícula
00:00:36
Por ejemplo
00:00:38
¿Vale?
00:00:39
Su nombre
00:00:49
Vamos a dejarle por ahora con esas dos propiedades
00:00:50
Solo
00:00:59
Tenemos un constructor
00:00:59
dime
00:01:11
bueno pues tenemos una aplicación para gestionar
00:01:16
alumnos
00:01:38
y ya está
00:01:39
bueno vamos a ponerle ya una edad
00:01:40
para poder hacer alguna operativa
00:01:44
aunque sea de pues comparar edades
00:01:45
o algo así
00:01:47
entonces añado esto aquí al
00:01:48
constructor
00:02:05
y me falta el getty set de la edad
00:02:06
bueno pues ya está
00:02:13
tengo un alumno con tres propiedades y una aplicación
00:02:23
que va a gestionar estos alumnos
00:02:26
entonces la aplicación
00:02:27
va a tener
00:02:32
esto de aquí
00:02:34
pues la aplicación va a tener
00:02:35
un montón de alumnos
00:02:37
entonces un montón de alumnos
00:02:39
hasta ahora nosotros pues que hacíamos
00:02:40
pues los metíamos todos en algo así
00:02:42
vale
00:02:46
los metíamos todos en algo así
00:02:48
y aquí teníamos el problema efectivamente
00:02:50
de que tenemos que comprometer
00:02:53
el tamaño
00:02:55
yo aquí tengo que decir si 100
00:02:56
o cuantos, la solución que
00:02:59
hacíamos, que nos
00:03:01
implicaba escribir mucho código
00:03:03
era decir, bueno, inicialmente
00:03:05
me hago un array de 0
00:03:07
posiciones, inicialmente de 0
00:03:09
y cuando me quiera meter uno nuevo
00:03:11
hago todo el rollo de hacer un auxiliar
00:03:13
con una posición más, copiar
00:03:15
añadir el nuevo y sustituir
00:03:17
era la solución que usábamos
00:03:19
para no comprometernos desde aquí al tamaño
00:03:21
pero realmente, hombre
00:03:23
el uso de los arrays cuando son
00:03:25
eficientes, es si tú sabes
00:03:27
un tamaño lo dices y el array se queda
00:03:29
ya siempre quieto y ahora ya
00:03:31
acceder por posición, recorrer
00:03:33
es computacionalmente inmediato
00:03:35
es lo más rápido y lo más eficiente
00:03:37
no hay nada más eficiente que un array
00:03:38
pero
00:03:41
tienes que fijar aquí
00:03:42
el número de posiciones
00:03:44
y se van a quedar siempre las mismas
00:03:46
no se puede cambiar, si tienes que
00:03:49
tirar la basura y coger otro
00:03:51
ya se ha perdido la eficiencia computacional
00:03:52
porque ya estás tirando la basura y cogiendo lo otro
00:03:54
bueno pues entonces
00:03:56
esto es lo que hacíamos hasta ahora
00:03:58
ahora ya
00:04:00
no tenemos por qué coger una
00:04:02
una RAI obligatoriamente
00:04:04
si sabemos que va a haber 20 y son 20
00:04:06
y punto pelota
00:04:08
cogeríamos una RAI, eso es lo que cogeríamos
00:04:10
siempre
00:04:12
pero en nuestro caso, no sé, a lo mejor
00:04:13
un año tengo 17, luego se
00:04:16
matriculan 4 de golpe, luego se van 3
00:04:18
no lo sé, va a ser
00:04:20
un número de alumnos variable, pues entonces
00:04:22
cogeríamos alguna de las clases
00:04:24
colección, que ya están hechas
00:04:26
¿cuáles?
00:04:28
ahora mismo estamos viendo listas
00:04:31
pues de listas
00:04:33
cogeríamos una lista
00:04:34
pues venga, entonces yo puedo
00:04:36
hacer esto
00:04:39
¿la lista de qué tipo va a ser?
00:04:39
va a ser una lista de tipo
00:04:42
alumno
00:04:44
pues me comprometo el tipo
00:04:45
porque ya hemos visto que lista
00:04:48
es genérica
00:04:50
lista te dice, oye cuando me instancies
00:04:53
instancias, dime qué tipo de dato me vas a meter dentro, ¿vale?
00:04:55
Porque esto es una clase genérica, que lo vimos ayer.
00:05:00
Una clase que se declara en función de un tipo que todavía está por comprometer, no se sabe.
00:05:03
Y cuando tú ya instancias un ejemplo concreto, cuando lo instancias, dices,
00:05:09
oye, dime ya cuál, porque ahora ya sí que estás creando algo real.
00:05:14
Estás creando algo real, tienes que decir qué tipo es.
00:05:17
No puedes crear algo real y dejarlo en el aire.
00:05:20
solo dejamos las cosas en el aire cuando estamos declarando
00:05:23
cuando estamos ya creando
00:05:26
no podemos dejarlo en el aire
00:05:27
bueno, pues aquí en mi main
00:05:28
estamos ya creando una lista
00:05:31
pues tenemos que decir de qué tipo va a ser
00:05:34
y lo decimos de esta manera
00:05:36
poniendo ahí
00:05:37
vale, entonces mi lista de alumnos
00:05:38
la declaro como sea
00:05:42
entonces con esto he hecho la declaración sin más
00:05:43
he declarado el objeto
00:05:45
pero no lo he creado, he dicho
00:05:47
mi referencia alumnos
00:05:49
va a ser una lista de datos
00:05:51
de tipo alumno, es una declaración
00:05:53
por ahora de variable
00:05:55
de un objeto variable
00:05:56
pero hombre, tenemos que instanciarlo
00:05:58
claro, tenemos que instanciar
00:06:00
para que exista ya esa colección
00:06:02
para que exista, tenemos que instanciarla
00:06:04
bueno
00:06:06
pues
00:06:08
no podemos instanciarla
00:06:09
así, esto no podemos hacerlo
00:06:13
esto no podemos hacerlo
00:06:15
porque ya sabemos que lista
00:06:18
es una interfaz, lista no es
00:06:20
una clase concreta, lista es una interfaz
00:06:22
entonces yo tengo que instanciar
00:06:24
de cualquier cosa que implemente
00:06:26
esto, de cualquier cosa
00:06:28
que lo implemente
00:06:30
¿no? cuando teníamos una interfaz
00:06:31
animal, que la implementaban
00:06:34
perro, gato, tú podías declarar la variable
00:06:36
de tipo animal a, pero luego lo instanciabas
00:06:38
new perro, new gato, así funcionaba
00:06:41
¿no? eso es lo que hemos visto de interfaces y de todo
00:06:42
pues yo aquí tengo que decir
00:06:44
oye, dime una implementación concreta
00:06:46
de la lista, ¿qué implementación quieres?
00:06:48
Te ofrezco dos. Elige. Bueno, pues esta es una. ArrayList dejaba útil. Pero tenemos otra. Vamos a imaginar que tenemos dos listas de alumnos. También tengo esta otra. Estas son las dos implementaciones posibles para las listas.
00:06:50
esta
00:07:31
dentro está hecha como un array
00:07:33
que se tira y se hace
00:07:36
de nuevo cada vez que haga falta
00:07:38
y esta está hecha como una lista
00:07:39
enlazada como la que vimos ayer
00:07:42
¿vale? ¿cómo se usan?
00:07:43
se usan exactamente igual
00:07:48
nosotros las estamos usando
00:07:49
esto ya es
00:07:51
transparente para nosotros
00:07:53
cuando nosotros queramos insertar alumnos
00:07:55
los insertaremos con el método correspondiente
00:07:57
¿y cómo lo haga por dentro? me da igual
00:07:59
que hará bien un alumno nuevo
00:08:01
y vamos a ponerlo en la lista
00:08:03
alumnos, pues venga
00:08:06
para eso que tengo, pues fijaos
00:08:08
todos los métodos que tengo de alumnos
00:08:10
para la lista
00:08:12
pues fijaos todo lo que puedo hacer con la lista
00:08:15
añadir un alumno
00:08:26
añadir un alumno en una posición
00:08:28
concreta, añadir de golpe
00:08:30
un montón de alumnos
00:08:32
que los tengo a su vez en otra colección
00:08:34
añadir al principio
00:08:36
añadir al final, eliminar la colección
00:08:38
ver si un alumno
00:08:41
está en una
00:08:43
un objeto
00:08:44
que yo le pase, está en esa colección
00:08:47
o no está
00:08:49
recuperar el primero, recuperar
00:08:49
el último, decirme
00:08:53
en qué posición está el objeto que yo le paso
00:08:55
eliminar
00:08:57
recuperar por posición, todo eso
00:08:59
puedo hacer con una lista, todo eso
00:09:02
y me da igual hacerlo con alumnos
00:09:04
uno
00:09:07
con alumnos 2
00:09:07
tengo lo mismo
00:09:10
lo que pasa es que internamente
00:09:11
alumnos 1 lo hace de una manera
00:09:13
y alumnos 2 lo hace de otra
00:09:15
porque alumnos 1 es un ArrayList
00:09:18
y alumnos 2 es un LinkedList
00:09:19
cada uno lo hace a su manera
00:09:21
pero el uso es el mismo
00:09:22
yo lo uso para meter cosas, sacarlas, recorrer
00:09:24
y para eso es para lo que lo uso
00:09:28
¿cuándo elegiré una y cuándo elegiré otra?
00:09:29
pues ya lo hemos dicho
00:09:33
ArrayList es muy buena para consultas
00:09:34
Porque consultar un array es inmediato
00:09:37
LinkedList es muy buena
00:09:38
Para inserciones y eliminados
00:09:41
Porque lo único que tengo que hacer es mover enlaces
00:09:43
Mover punteros de direcciones de memoria
00:09:45
Ya está
00:09:47
Cuando tengo pocos datos
00:09:48
Que estoy haciendo una cosa así
00:09:52
Estoy resolviendo algo así sobre la marcha rápidamente
00:09:54
Pues hombre, ArrayList es lo mejor
00:09:57
Porque el array siempre es lo mejor
00:09:59
Pero como tenga muchos datos
00:10:01
Y esté metiendo y se ha acabado todo el rato
00:10:03
ArrayList ya
00:10:04
Tarda más
00:10:05
bueno, pues entonces
00:10:08
vamos a
00:10:10
como las dos se usan igual
00:10:13
las dos se usarían igual
00:10:16
y todo lo que vamos a probar a partir de ahora
00:10:17
aplica igual para las dos
00:10:20
porque repito, la única diferencia
00:10:22
es como lo hacen por dentro, pero es que eso
00:10:24
no nos da igual, no tiene ninguna implicación para nosotros
00:10:26
salvo el tiempo que tardan
00:10:28
a la vista
00:10:29
el envoltorio, una vez puesto el envoltorio
00:10:31
hacia afuera ofrecen lo mismo las dos
00:10:34
ofrecen lo mismo
00:10:35
vale, entonces lo que
00:10:36
haga con una lo puedo hacer con la otra igualmente
00:10:39
vale, pues vamos a
00:10:41
por ejemplo, insertar unos cuantos
00:10:43
alumnos
00:10:45
en la primera, pues venga
00:10:46
vamos a insertar
00:10:49
un nuevo alumno
00:10:50
con su número
00:10:53
de matrícula
00:10:55
que no sé si era int o que era
00:10:56
era int, número de matrícula
00:10:58
uno
00:11:01
vale, este alumno
00:11:02
que tiene 20
00:11:05
ala, ya tengo este alumno en la colección
00:11:06
y ya está, y tan fácil
00:11:10
y tan cómodo
00:11:12
¿que inserto un segundo alumno?
00:11:15
pues ala, ya tengo el segundo alumno en la colección
00:11:24
entonces, insertar es comodísimo
00:11:26
por ejemplo, en la lista
00:11:28
alumnos 2, que es una lista
00:11:35
está el método
00:11:37
addAll, que lo hemos visto ahí
00:11:38
a ver que lo...
00:11:41
y este método, por ejemplo, ¿qué hace?
00:11:49
aquí uno se trata de mirar la ayuda
00:11:52
es decir, pues este te añade de golpe
00:11:53
todos los alumnos que haya en la colección
00:11:56
que tú le pasas
00:11:59
pues por ejemplo aquí habríamos añadido
00:12:00
a alumnos 2
00:12:03
todos los alumnos que están en la colección
00:12:04
que tú le estás pasando
00:12:07
o sea habríamos añadido los de alumnos 1
00:12:08
por ejemplo
00:12:10
entonces se trata aquí de ver que métodos tengo
00:12:11
para usarlos
00:12:13
nada más
00:12:15
que ahora queremos añadir un alumno
00:12:16
pero en medio de los otros anteriores
00:12:19
pues había el método
00:12:21
añadir, este estaba sobrecargado
00:12:24
tú le pasabas una posición
00:12:26
vamos a decirle en la posición 1
00:12:28
y le vamos a añadir un nuevo alumno
00:12:30
este
00:12:33
ala, este aquí
00:12:42
por ejemplo, esta es otra versión de add
00:12:48
sobrecargada que tú le dices en qué
00:12:52
posición quieres
00:12:54
bueno y así podemos insertar
00:12:55
sin problema
00:12:59
que ahora queremos recorrer
00:12:59
la colección para mostrar lo que hay
00:13:03
bueno, tenemos el método get
00:13:04
que te recupera en la posición que tú le digas
00:13:07
pues podríamos
00:13:09
combinar el for de toda la vida
00:13:11
con el método get y ya está
00:13:13
como hacíamos en la colección
00:13:15
que hicimos nosotros
00:13:18
desde igual a cero, mientras si sea menor que
00:13:18
¿quién? que alumnos1.size
00:13:21
porque tenemos el método size
00:13:25
que me dice el número de elementos de la colección
00:13:27
incrementando y
00:13:29
pues vamos a mostrar
00:13:31
alumnos1
00:13:35
get
00:13:39
y, ¿vale?
00:13:40
Combinando el método get que me devuelve
00:13:47
el alumno en la posición y
00:13:49
con el for
00:13:50
puedo recorrerlo y mostrarlo
00:13:52
exactamente igual que recorría un array.
00:13:54
Vale, ahora pregunto
00:13:59
cuando yo haga este system.out.println
00:14:01
me va a mostrar los
00:14:05
tres alumnos de alumnos1, ¿verdad?
00:14:08
alumnos1 tiene tres, porque le he metido
00:14:11
aquí dos, luego le he metido otro
00:14:12
entre medias. ¿Pero cómo me lo va a mostrar?
00:14:14
¿Qué me va a mostrar de esos alumnos?
00:14:17
¿Qué me va a mostrar?
00:14:21
¿Me va a mostrar
00:14:23
la edad? ¿Me va a mostrar la...?
00:14:24
Me va a mostrar una cosa muy rara
00:14:28
porque ya sabemos que este
00:14:30
llamará al toString de ese
00:14:32
objeto y el toString
00:14:34
de la clase alumno es el dado de object
00:14:36
que te muestra una patata.
00:14:38
Pues entonces no queremos que nos muestre una patata.
00:14:40
Vamos a sobreescribir toString en alumno.
00:14:42
Vamos a sobreescribir toString
00:14:45
un alumno. ¿Nos gusta
00:14:46
esto que nos ofrece?
00:14:56
Venga, vale, nos gusta. Lo podríamos cambiar
00:14:58
y poner el tu stream que quisiéramos.
00:15:00
Bueno, vamos a hacer este main.
00:15:03
Ups, a ver si
00:15:04
me ha insertado a Pepe, a Javi
00:15:06
y a ver dónde me ha metido a Luis, que le he dicho en la posición
00:15:10
uno. A ver cómo interpreta a la uno. Si la interpreta
00:15:12
como la segunda, a ver cómo, dónde me la ha metido.
00:15:14
Porque no sé seguro
00:15:17
la uno, cómo me la está interpretando
00:15:18
a la hora de meterlo dentro. Si es después
00:15:20
de ese o delante.
00:15:22
vamos a ejecutar esto
00:15:23
vale, me lo ha puesto
00:15:25
en la posición 1, efectivamente
00:15:33
esta es la 0
00:15:35
esta es la 1
00:15:36
a donde me ha colado
00:15:39
a la 1 me ha colado este
00:15:40
y esta es la 3
00:15:42
vale
00:15:45
bueno, pues una forma
00:15:46
muy cómoda de guardar un montón
00:15:48
de datos, me hago una ArrayList o un LinkedList
00:15:51
me da lo mismo, porque el uso
00:15:53
sería idéntico, son los mismos métodos
00:15:55
me da lo mismo uno que otro
00:15:57
y ahí meto datos
00:15:58
y lo recorro
00:16:00
meto datos y recorro, si quiero
00:16:02
vale, ¿qué pasa si quiero eliminar?
00:16:04
también puedo eliminar, porque de unos datos
00:16:09
recordad que esencialmente lo que se hacía
00:16:11
era
00:16:13
insertar
00:16:13
consultar, eliminar y
00:16:16
modificar, no a un dato
00:16:19
pues cambiarle lo que tuviera, lo que tiene dentro
00:16:20
entonces hemos hecho
00:16:22
insertar, add, insertar
00:16:24
es add, add first, add, me da lo mismo
00:16:26
los métodos que me ofrezca
00:16:28
insertar, hemos consultado
00:16:29
combinando el get y el for
00:16:31
que yo quiero eliminar un dato de la colección
00:16:33
lo tengo mucho más fácil con el array
00:16:36
eliminar el array es que aparte
00:16:37
no se podía hacer, teníamos que inventárnoslo
00:16:40
teníamos que hacer un array de menos posiciones
00:16:42
copiar saltándonos
00:16:44
teníamos que hacer todo eso, porque eliminar de un array
00:16:46
como tal no se puede, el array es el que es
00:16:48
y no pueden coger
00:16:50
pues aquí sí que podemos
00:16:51
porque aquí
00:16:53
alumnos1 tiene dos variantes
00:16:55
del método remove
00:16:58
o varias, no dos, tiene muchas
00:16:59
aloop
00:17:02
nos
00:17:13
uno tiene
00:17:15
del método remove
00:17:17
fijaos cuantas variantes tiene
00:17:19
borrar por posición, le pasas una posición
00:17:20
y te borra el de esa posición, ya está
00:17:23
como lo haga ella, me da igual
00:17:25
que lo hace como array, como linked list
00:17:27
depende, la que hayamos elegido
00:17:29
le pasas un objeto
00:17:31
y te borra el objeto que sea igual a ese
00:17:33
Te borra todos los de una colección
00:17:35
Que si tú le pasas remove all
00:17:38
Te borra el primero
00:17:40
Te borra el que cumple un predicado
00:17:41
Pero construir predicados no sabemos hacerlo
00:17:44
Esto es como construir una condición
00:17:46
Tiene que ver con interfaces funcionales
00:17:48
Que no estamos en ello
00:17:50
Con programación funcional
00:17:51
Vale, remove last, te borra el último
00:17:53
Tiene bastantes variantes de remove
00:17:55
Que yo quiero borrar
00:17:58
El que está entre medias
00:18:05
Pues hombre
00:18:08
puedo usar esto
00:18:09
puedo usar esto y efectivamente
00:18:11
si vuelvo a recorrerlo
00:18:13
me habría borrado el que está en la
00:18:14
posición 1, vale
00:18:17
si yo ahora vuelvo a recorrer, he borrado el de
00:18:22
posición 1 y vuelvo a
00:18:24
hacer el recorrido, vuelvo
00:18:26
a hacerlo, voy a poner aquí un
00:18:29
separador para que
00:18:31
se vea, pues
00:18:36
efectivamente me ha
00:18:41
borrado el de posición 1, vale
00:18:45
pues hala, muy útil
00:18:47
muy útil, ¿verdad? las listas
00:18:48
para guardar cosas, eliminarlas, etc
00:18:50
y no solo eso, sino
00:18:53
para diferentes utilidades, por ejemplo
00:18:56
si seguimos mirando métodos que haya
00:18:59
en el list
00:19:01
este de aquí
00:19:04
ay, que agollón lupa quería poner
00:19:06
esto
00:19:08
fijaos, tiene un sort
00:19:11
un sort
00:19:24
que tiene
00:19:26
toda la pinta
00:19:28
de que te ordena
00:19:29
¿verdad? tiene toda la pinta de que te ordena
00:19:31
los elementos de la lista, ostras, eso es
00:19:34
complicadísimo hacer en una lista enlazada
00:19:36
en un array, tienes que estar a través
00:19:38
de un intermedio, subir a una lista enlazada
00:19:40
pues tienes ya un método que te lo hace
00:19:41
tienes un método
00:19:44
que te ordena
00:19:46
¿vale? pero claro, hay que
00:19:50
pasarle
00:19:54
una cosa
00:19:56
que dice aquí, que es
00:20:04
el criterio de ordenación
00:20:05
¿no?
00:20:07
yo he hablado, te ordena alumnos
00:20:08
y los alumnos como se ordenan, ni idea
00:20:12
los alumnos no sabemos como se ordenan
00:20:14
no es como los números, los números tienen un orden
00:20:15
los int, los double
00:20:18
tienen ya un orden intrínseco que ya
00:20:20
la máquina virtual lo sabe
00:20:21
porque está ya programado en la JDK
00:20:23
está programado, tiene un orden que es su orden natural
00:20:25
el orden natural numérico del álgebra
00:20:27
de toda la vida, pero los alumnos
00:20:29
no tienen un orden
00:20:31
entonces si llegamos a este método
00:20:32
hay que decirle
00:20:35
cuál es el criterio de ordenación que queremos dar.
00:20:37
¿Vale?
00:20:41
Pues vamos a hacerlo.
00:20:42
Porque esto nos vale para repasar también lo de interfaces.
00:20:44
¿Vale?
00:20:49
Vamos a, en este proyecto de ejemplo,
00:20:49
a ordenar estos alumnos.
00:20:51
Vamos a ordenar estos alumnos.
00:20:52
Vamos a ver.
00:20:58
Ordenamos los alumnos.
00:21:05
Los vamos a ordenar.
00:21:07
Vamos a decidir un criterio.
00:21:08
Pues por edad, por orden alfabético,
00:21:11
o por número de matrícula?
00:21:14
¿Qué orden queremos?
00:21:16
Vaya.
00:21:21
Prefería por alfabeto
00:21:22
que era más difícil.
00:21:24
Bueno, venga, empezamos por número de matrícula.
00:21:26
Vale.
00:21:27
Ya, porque pensaba que
00:21:29
queríais complicaros la vida.
00:21:31
Vale, vamos a ordenar por número de matrícula.
00:21:36
Entonces,
00:21:38
afortunadamente no tenemos que
00:21:39
implementar nosotros un algoritmo de ordenación
00:21:42
como la burbuja, ir copiando
00:21:44
de un lado a otro que tuviéramos que hacerlo es
00:21:46
complicado, no tenemos
00:21:48
porque está este método, sort, vale
00:21:49
pero a sort hay que pasarle
00:21:52
una cosa
00:21:54
que es un objeto
00:21:55
un objeto
00:21:57
que sea un objeto que
00:21:59
lleve dentro el criterio
00:22:01
de ordenación
00:22:06
vale, entonces este objeto
00:22:07
que le pasemos tiene que ser de una clase
00:22:10
pues yo que sé
00:22:12
vamos a llamar a esa clase
00:22:14
criterio num matricula
00:22:15
pues este objeto que yo le paso
00:22:17
tiene que ser un objeto
00:22:25
que lleve dentro
00:22:27
el criterio que yo decido
00:22:28
para esta ordenación
00:22:30
el criterio que yo decido
00:22:32
¿vale? entonces
00:22:33
este objeto no está hecho
00:22:36
este objeto lo tengo
00:22:39
tengo que declarar yo esta clase
00:22:40
perdón, esta clase no está hecha
00:22:42
tengo que declararla, tengo que declararla esa clase
00:22:44
para que tenga dentro
00:22:46
para que tenga dentro ese criterio
00:22:48
de ordenación, venga pues
00:22:50
vamos a crear esa clase
00:22:52
vamos a
00:22:53
que ya me lo ha hecho solito, no lo quiero
00:22:58
vale, esta es
00:23:04
la clase que tenemos que hacer, y esto fuera
00:23:06
vale, esta es la clase que tenemos
00:23:08
que hacer, ¿verdad? esta es la clase
00:23:14
que tenemos que hacer
00:23:16
para crear aquí
00:23:17
ahí no, ahí
00:23:19
un objeto de esa clase
00:23:21
un objeto de esa clase que lleva dentro
00:23:23
el criterio de comparación que lo lleva dentro
00:23:26
vale
00:23:28
pues entonces, ¿qué tiene que hacer
00:23:29
una clase para poder
00:23:31
ser criterio de comparación?
00:23:34
pues para poder
00:23:37
ejercer de algo, para poder
00:23:38
ejercer de cualquier cosa
00:23:40
tienes que implementar, adherirte
00:23:41
a la interfaz que te da
00:23:44
permiso a eso
00:23:46
bueno, pues nosotros queremos que
00:23:46
criterio en un matrícula
00:23:50
tenga la potestad de
00:23:51
ser criterio de comparación
00:23:53
pues para tener la potestad de ser
00:23:56
criterio de comparación tiene que
00:23:58
implementar una cosa que se llama
00:24:00
comparator
00:24:02
tiene que implementar esto
00:24:04
y ahora esto ya lo
00:24:09
importamos de java útil
00:24:11
también, vale
00:24:13
entonces para que esta clase pueda ser
00:24:17
pueda adherirse a eso
00:24:20
oye que yo soy criterio de comparación
00:24:22
yo soy criterio de comparar
00:24:24
pues si tú quieres ser criterio de comparación
00:24:26
implementa comparator, si quieres ser
00:24:28
criterio de comparación, vale
00:24:31
pues implemento comparator, estupendo
00:24:32
lo implemento
00:24:35
vale, comparator, esta es una clase
00:24:36
genérica, es decir
00:24:39
la podemos usar así en general
00:24:41
pero lo ideal, ahora que ya sabemos
00:24:43
lo que son las clases genéricas, es decir
00:24:44
vale, comparador es
00:24:46
un comparador genérico de cosas, pero tú que
00:24:48
estás comparando, yo estoy comparando
00:24:50
alumnos, venga pues dime
00:24:53
entonces que tú eres
00:24:54
un comparador de alumnos dime esto concreta me ya concreta me y dime que eres de alumno porque
00:24:56
si uno se va a esta clase esta es una interfaz genérica esta es la interfaz que tiene que
00:25:05
implementar cualquiera que quiera ser criterio de comparación de algo y este es el tipo genérico que
00:25:15
es el algo que tú vas a comparar entre sí sí sí sí a cualquier cosa sea clase interfaz que dependa
00:25:22
de un tipo abstracto
00:25:32
no, no tienes que pasarlo, pero si no se lo pasas
00:25:33
entonces tienes que trabajar con object
00:25:37
y si se lo pasas
00:25:39
entonces tienes mucho, no pasa nada
00:25:41
el compilador fenomenal
00:25:43
tú le pasas object, lo traga todo porque no has especificado
00:25:45
el tipo, el problema viene luego
00:25:47
en tiempo de ejecución, que va a tener que
00:25:49
hacer casting y vete
00:25:51
a saber los casting como salen
00:25:53
si tú dices, no, no, trabaja con alumnos
00:25:55
entonces el compilador te prohíbe y solo te deja
00:25:57
que metas alumnos, con lo cual el compilador
00:25:59
es el que te pone, se pone estricto
00:26:01
pero a cambio ya en la ejecución no tendrás problemas
00:26:03
porque ya el compilador se ha asegurado
00:26:06
de que solo metas alumnos
00:26:08
no sé si más o menos me explico
00:26:09
vale, pues entonces la idea es
00:26:11
cuando una clase es genérica, concretarle el tipo
00:26:14
concretarle, para que ya el compilador
00:26:16
te obligue y te diga, eh, que me has dicho alumno
00:26:18
pues alumno, no me metas cosas que no sean alumno
00:26:20
no me metas cualquier obvio, no, meteme alumno
00:26:22
es lo ideal
00:26:24
vale
00:26:26
pues aquí
00:26:28
esta de aquí
00:26:29
que implemente
00:26:31
un comparador pero de alumnos
00:26:34
que sea solo un comparador de alumnos
00:26:36
que no valga para comparar perro
00:26:37
con mesa, porque es que eso luego
00:26:40
no va a casar en tiempo de ejecución
00:26:41
va a tener que hacer un casting y no va a casar
00:26:44
vale, pues entonces
00:26:46
si queremos que esto sea un criterio que implemente
00:26:48
el comparador este de alumno
00:26:50
el compilador nos dice lo que ya no sabemos de toda la vida
00:26:51
ah, pues tienes que implementar los métodos
00:26:54
del comparador este, lo siento, tienes que implementarlo
00:26:56
no pasa nada
00:26:58
los implemento
00:27:00
ala
00:27:03
este es el método
00:27:04
que tenemos que implementar
00:27:06
y este método es en el que
00:27:07
tú ya pones lo que te dé la gana
00:27:10
pones como quieres
00:27:12
comparar a un alumno
00:27:14
con otro, comparar
00:27:16
significa decir cuál va antes y cuál va después
00:27:20
eso significa comparar, decir cuál va antes y cuál va
00:27:22
después, y el criterio es el mismo
00:27:24
que vimos con el comparable, que esto ya lo hemos
00:27:26
trabajado, y es
00:27:28
si esto es negativo
00:27:29
se sobreentiende que este va antes
00:27:31
si esto es positivo
00:27:33
se sobreentiende
00:27:36
que este va después
00:27:38
y si son iguales
00:27:39
y si es cero, perdón, si es cero
00:27:41
se sobreentiende que es que ni uno
00:27:43
no es mayor ni menor, que es que están en la misma
00:27:45
posición en cuanto a orden
00:27:48
¿vale? es como el 3 y el 5
00:27:49
el 3 es menor que el 5, el 3 y el 3
00:27:53
el 3 es igual que el 3
00:27:55
no es ni menor ni mayor
00:27:57
¿vale? pues aquí tenemos que con esas premisas
00:27:58
de funcionamiento
00:28:01
y a inventárnoslo, vale
00:28:02
entonces yo quiero que dé negativo
00:28:05
si el número de matrícula de O1
00:28:07
es menor que el número de matrícula
00:28:09
de O2
00:28:11
cero si el número de matrícula es igual
00:28:12
porque hemos dicho ordenar en orden ascendente
00:28:15
el número de matrícula
00:28:17
y positivo si el número de matrícula de O1
00:28:18
es mayor, hombre pues quizá
00:28:21
lo más fácil es devolver esto
00:28:23
O1 punto
00:28:24
get
00:28:27
num matrícula
00:28:29
menos o uno o dos, perdón.
00:28:30
Esto es lo más cómodo.
00:28:41
Si el número de matrícula de este está antes,
00:28:43
es un número más bajito que este,
00:28:47
esto me va a dar negativo.
00:28:50
Luego efectivamente el método interpreta que este alumno va antes.
00:28:52
Si este número es mayor que este otro,
00:28:57
la resta va a dar positiva,
00:29:01
la resta va a dar positiva,
00:29:02
luego esto va a dar positivo,
00:29:04
luego efectivamente el método
00:29:05
lo que nos devuelve es que este va después
00:29:07
y si
00:29:09
los números de matrícula son idénticos
00:29:11
la resta es cero, esto va a devolver cero
00:29:13
ni uno es mayor que el otro
00:29:15
ni otro es mayor que el uno
00:29:17
pues ahora tenemos un criterio de comparación ya
00:29:18
perfectísimamente implementado
00:29:22
con todos los requisitos que le hacen falta
00:29:24
implementar la capacidad
00:29:27
de ser criterio de comparación
00:29:29
que para eso tiene que implementar el comparator este
00:29:30
implementar esa capacidad
00:29:32
y implementar el método
00:29:34
poniendo yo aquí lo que me interese
00:29:37
lo que me interese
00:29:41
teniendo en cuenta que el valor de retorno
00:29:42
tendrá que ser negativo
00:29:45
si el primero va antes
00:29:46
positivo si el primero va después
00:29:48
o cero si van a la vez
00:29:51
¡ala! pues ya tenemos un criterio ahí de comparación
00:29:53
magnífico
00:29:57
pues estupendo
00:29:58
ya le puedo pasar a sort
00:29:59
un objeto de ese criterio
00:30:01
ya se lo puedo pasar
00:30:04
vale, pues vamos a ejecutar esto
00:30:05
pero pasándose los desordenados
00:30:11
para ver que efectivamente los ha ordenado
00:30:13
le paso el 3, le paso el 2
00:30:17
y luego en la posición 1
00:30:19
le paso el número de matrícula
00:30:22
1
00:30:23
vamos a mostrar
00:30:24
sin eliminar
00:30:27
antes y después de ordenar
00:30:29
vamos a mostrar
00:30:32
antes y después de ordenar
00:30:34
vale, pues
00:30:36
aquí están
00:30:48
tal y como los metí
00:30:51
primero el 3, luego el 2
00:30:55
y después de haberle hecho
00:30:57
el sort a la colección
00:30:59
después de haberle hecho esto
00:31:01
el sort, ahora ya
00:31:03
los ha ordenado
00:31:05
por el criterio que yo le he dicho
00:31:07
número de matrícula, por el criterio
00:31:09
que a mi me ha dado la gana decirle
00:31:11
luego las colecciones pues nos dan muchas
00:31:12
cosas ya hechas, que si tuviéramos
00:31:18
que programar son un rollo
00:31:20
Que a mí de repente me apetece
00:31:21
Cambiar el criterio de ordenación
00:31:23
Y quiero ordenar por
00:31:24
Edad
00:31:27
¿Me puedo hacer otra clase?
00:31:30
¿Otro criterio de comparación?
00:31:33
¿Me puedo hacer otro?
00:31:35
¿Eh?
00:31:38
¿Crit?
00:31:40
¿Eh?
00:31:41
A ver, era por no complicarlo, pero venga, sí
00:31:43
Por nombre
00:31:45
Venga, vamos a ordenar por nombre
00:31:45
Por orden alfabético de nombre
00:31:49
estoy usando otro criterio, llamo al mismo método
00:31:50
a sort, llamo al mismo método
00:31:53
pero le voy a pasar otro criterio
00:31:54
tengo que hacer la clase que recoge
00:31:56
ese criterio, tengo que hacerla
00:31:59
pues venga, hacemos esta clase
00:32:00
y esta clase
00:32:05
que implemente el comparator
00:32:10
este de alumno
00:32:11
vale, esta es otra clase con otro
00:32:12
criterio de comparación
00:32:17
vamos a ponerle el criterio
00:32:18
bueno, pues aquí se nos complica, ¿no?
00:32:21
porque tenemos que devolver
00:32:29
negativo si o1
00:32:30
está alfabéticamente
00:32:32
el nombre, perdón, está alfabética antes que o2
00:32:33
o sea, lo que hay que comparar son estas dos cosas
00:32:36
o1.getNombre
00:32:38
y o2.getNombre
00:32:41
esto es lo que hay que comparar
00:32:45
alfabéticamente
00:32:46
si este alfabéticamente
00:32:47
va antes que este otro, me devolverá negativo
00:32:50
si alfabéticamente
00:32:52
van a la vez, o sea, es el mismo nombre
00:32:54
me devolverá cero
00:32:56
y si alfabéticamente este va después que el otro
00:32:57
me devolverá positivo
00:33:00
es lo que yo tengo que hacer
00:33:01
pero comparar alfabéticamente dos cadenas es un rollo
00:33:03
por ahí comparar el primer carácter
00:33:05
si el primer carácter es igual tienes que pasar al segundo
00:33:07
si el segundo es igual
00:33:10
tienes que pasar al tercero
00:33:11
entonces eso lo podemos programar
00:33:13
con dos for estupendamente
00:33:15
uno hace un primer for que va
00:33:17
carácter por carácter y va
00:33:19
luego de forma recursiva
00:33:21
mucho más fácil, se programaría de forma recursiva
00:33:23
es un ejercicio de programación
00:33:26
maravilloso, dos cadenas
00:33:28
ordenalas alfabéticamente
00:33:29
pero bueno
00:33:31
no lo vamos a hacer, ya no estamos para esos trotes
00:33:33
pero sería un ejercicio magnífico
00:33:36
de programación
00:33:37
de pura y dura de toda la vida
00:33:39
¿por qué no lo vamos a hacer?
00:33:41
porque tanto esto como esto
00:33:42
pertenecen a qué clase
00:33:45
pertenecen a la clase string
00:33:46
y la clase string
00:33:49
afortunadamente tiene muchas cosas ya hechas
00:33:51
la clase string tiene
00:33:53
entre otros
00:33:56
un método por ahí
00:33:59
esto para buscar rápidamente
00:34:01
que era control
00:34:05
¿cuál era el atajo
00:34:06
para buscar aquí en el editor?
00:34:09
¿alguien lo...
00:34:11
control F?
00:34:12
si yo busco aquí
00:34:14
compare to
00:34:16
aquí me sale
00:34:19
vale
00:34:21
no, pero yo no quiero esta
00:34:22
compare to
00:34:27
aquí
00:34:31
este
00:34:36
vale, pues resulta
00:34:37
que la clase string tiene un montón de cosas hechas
00:34:40
que ya hemos usado, el length
00:34:41
el charat
00:34:43
vamos
00:34:46
el index of, tiene un montón de cosas ya hechas
00:34:49
bueno, pues tiene un método compareTo
00:34:52
que ya directamente
00:34:53
me devuelve
00:34:56
negativo si la cadena
00:34:57
que llama el compareTo va alfabéticamente
00:34:59
antes que esta
00:35:02
o sea, ya me hace todo el código de la ordenación alfabética
00:35:03
llamando aquí a
00:35:06
a estos compare tools
00:35:08
de las clases string UTF etc
00:35:10
ya me lo hace, me devuelve
00:35:11
negativo si el string que llama
00:35:14
a este método va antes
00:35:16
que este otro, 0 si son iguales
00:35:18
y positivo si el string
00:35:20
que llama a este método va después
00:35:22
que este otro, o sea el compare tool
00:35:24
ya me dice alfabéticamente cual va antes
00:35:25
el que llama al método o el otro
00:35:28
bueno pues hombre si ya tengo
00:35:30
el compare tool string
00:35:32
pues vamos a usarlo aquí
00:35:33
y no vamos a volvernos locos
00:35:35
y hacemos esto
00:35:37
y hacemos
00:35:40
retuno1.getNombre
00:35:45
.compareTu
00:35:47
este otro
00:35:51
o 2.getNombre
00:35:52
voy a bajar abajo esto
00:35:55
para
00:35:57
y ya tenemos el criterio hecho
00:35:57
porque el método compareTu
00:36:03
ya te devuelve negativo, cero
00:36:05
positivo en función del orden alfabético
00:36:08
Del string que llama al método
00:36:10
De este string
00:36:11
Y del string pasado por parámetro
00:36:13
Ya te lo hace
00:36:15
Te compara estos dos strings
00:36:16
El que llama al método
00:36:18
Y este otro
00:36:19
Y ya te devuelve menos uno, cero o uno
00:36:20
Pues aprovechémonos de eso
00:36:23
Llamemos directamente a esto
00:36:25
Y devolvamos eso que ha devuelto él
00:36:26
Pues ala, fenomenal
00:36:28
Ya tenemos otra clase comparator de esta
00:36:30
Que me devuelve el criterio alfabético de ordenación
00:36:33
Según el nombre de los alumnos
00:36:36
bueno, pues si yo ahora vuelvo
00:36:38
a ejecutar esto
00:36:43
ahora me los va a dar
00:36:44
ordenados por nombre
00:36:48
¿veis? aquí están
00:36:50
por número de matrícula, un, dos y tres
00:36:59
y aquí están
00:37:01
por orden alfabético de nombre
00:37:03
ahí están
00:37:05
¿vale? luego todo el trabajo que nos ahorramos
00:37:06
pues trabajando con colecciones
00:37:14
pero no podemos olvidar ninguna
00:37:15
otra cosa
00:37:18
¿vale? para entender lo que los métodos
00:37:18
hacen, para entender lo que nos ofrecen, tenemos
00:37:22
que tener claro, pues, todo el
00:37:24
tema de los interfaces, de implementar métodos,
00:37:26
de un montón de cosas. Tenemos que tener
00:37:28
claras. ¿Vale?
00:37:30
Bueno, hasta aquí más o menos.
00:37:34
¿O habéis desconectado muchos?
00:37:36
¿Cuántos habéis desconectado?
00:37:40
Con sinceridad.
00:37:42
¿Sólo Claudia es sincera?
00:37:44
¿Y su compañera?
00:37:46
El orden alfabético,
00:37:52
creo que se salta las mayúsculas y las minúsculas
00:37:53
no lo sé
00:37:56
no sé el compare to the string
00:37:58
cómo lo hace
00:38:00
ah, vale, pues
00:38:00
aquí en string
00:38:05
sí, habría que ver cómo
00:38:09
funciona
00:38:11
donde estoy en el criterio nombre
00:38:12
aquí, yo he usado el compare to
00:38:15
que si no las ignora
00:38:17
lo que hace es ponerte antes
00:38:20
todas las minúsculas y luego después de las mayúsculas
00:38:21
Y luego dices tú que en string hay otro
00:38:23
Que es el compare tú
00:38:26
Ignore este de aquí
00:38:28
Efectivamente que te ordena alfabéticamente
00:38:29
Ignorando mayúsculas, minúsculas
00:38:32
Vale, depende del criterio que queramos dar nosotros
00:38:34
Si queremos tenerlo en cuenta
00:38:36
O no tenerlo en cuenta
00:38:38
Bueno, ¿cuántos habían desconectado entonces?
00:38:39
No me lo creo
00:38:49
Que solo
00:38:50
Vale, venga
00:38:51
Vamos a parar un momentito
00:38:53
Para reconectar
00:38:54
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 6
- Fecha:
- 27 de febrero de 2024 - 18:31
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 39′
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 187.83 MBytes