20250121 Interfaz Comparable Ejemplo - 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, entonces voy a grabar este ejemplo, ¿vale? A ver qué tal sale.
00:00:00
Pues me voy a crear una clase.
00:00:05
Mi clase se llamará utilidades, ¿vale?
00:00:10
Que es una clase genérica que hace cosas, ¿vale?
00:00:17
No quiero que esto sea utilidades para una clase en concreto,
00:00:22
para, oye, me hago un método para la clase gato, para la clase no sé qué.
00:00:27
Quiero que esta aquí sea una cosa más genérica, ¿vale?
00:00:31
Por ejemplo, yo quiero poder utilizar estas utilidades para que tú me digas una rey
00:00:35
y yo te ordene esta rey, por ejemplo, ¿vale?
00:00:44
O, no lo sé, empezamos desde algo más fácil.
00:00:48
Digamos, que antes me digas si una cosa es mayor o menor que... es ordenada, digamos, o que me pille dos objetos y me los ordene, me ponga antes el primero y luego el segundo, ¿vale? Una cosa de ese estilo, ¿vale?
00:00:53
Entonces, empiezo desde algo muy fácil. Entonces, public void escribe ordenados object a, object b.
00:01:11
¿Sí? Si yo hago una cosa de ese estilo, el objetivo es lo siguiente. Tú me das dos objetos.
00:01:34
y yo te pongo, esto viene antes que este otro, o este viene antes que este otro, ¿sí?
00:01:41
La pregunta es, ¿puedo hacer algo así?
00:01:49
Imaginamos que estos sean enteros, ¿sí?
00:01:56
Si yo te doy 3 y 7, pues tú sabes que 3 viene antes de 7,
00:01:59
si yo te doy 7 y 3, tú sabes que tienes que invertirlos, ¿sí?
00:02:02
Pero si yo aquí pillo objetos, ¿cómo hago a comparar este objeto con este objeto?
00:02:06
Pregunto.
00:02:13
No lo sé, porque no sé cómo se compara un objeto.
00:02:16
Hay objetos que no se pueden comparar.
00:02:19
¿Sí?
00:02:22
Entonces este object sería demasiado genérico para utilizarlo aquí.
00:02:23
¿Cómo podría hacer algo un poquito más interesante?
00:02:27
Por ejemplo, yo podría decir, oye, mira, los objetos que uso aquí no quiero que sean objetos cualquiera.
00:02:40
Quiero que sean objetos comparables.
00:02:47
no sé si tengo que importarlo
00:02:51
un objeto comparable hace referencia
00:02:58
al señor comparable
00:03:05
el señor comparable es una interfaz
00:03:08
definida, que lo que hace
00:03:18
es decir, oye mira, para
00:03:24
para poder hacer un objeto comparable
00:03:27
o sea, para que tú implementes esta interfaz, necesitas necesariamente haber creado un método compare to, ¿vale?
00:03:30
Entonces, si yo aquí utilizo comparables, sé que estos objetos tendrán dentro un compare to, ¿sí?
00:03:40
Y lo puedo utilizar.
00:03:52
Ahora, yo lo que debería hacer es leerme bien qué hace el compare to, para qué sirve, ¿vale?
00:03:53
Entonces, aquí me dice, compara los objetos con otro objeto, ¿vale?
00:03:59
Para ordenarlo
00:04:06
Y dice que, sustancialmente, puede devolver, compare tú, devuelve
00:04:07
O un número negativo, o un número cero, o un número positivo
00:04:12
Dependiendo de si el objeto es menor, igual o mayor
00:04:15
Con respecto al objeto que se compara
00:04:19
¿Sí? Vale
00:04:21
Luego explica cosas aquí, dice otra cosa, bla bla bla bla bla
00:04:23
Ahora, una cosa interesante es que hay que ver qué pasa cuando yo hago comparebol entre objetos que no son el mismo objeto.
00:04:27
Yo tengo gatos, y los gatos se comparan entre ellos.
00:04:37
Tengo string, y los string se comparan entre ellos.
00:04:40
Pero si comparo un gato y un string, ¿qué pasa?
00:04:43
Entonces, vamos a ver qué pasa.
00:04:48
Entonces
00:04:50
Este objeto, esta cosa aquí
00:04:52
Que será estático
00:04:55
Me pilla dos objetos
00:04:56
Y hemos dicho que me los tiene que escribir ordenados
00:05:00
Entonces aquí se preguntará
00:05:03
Si
00:05:05
A
00:05:06
Que es este primer objeto
00:05:08
Punto
00:05:11
Fijaos que aquí son todas cosas de objetos
00:05:13
Pero también me aparece el
00:05:17
Comperto de comparable
00:05:19
Comperto B
00:05:20
¿Qué hago ahora?
00:05:23
¿Qué es esto? Un int
00:05:24
Estamos de acuerdo que es un int
00:05:28
Y tengo tres opciones
00:05:30
O es menor que cero
00:05:32
O es cero
00:05:35
O es mayor que cero
00:05:36
Si es menor que cero
00:05:37
Quiere decir que A
00:05:40
Es más pequeño que B
00:05:42
Entonces si yo escribiré
00:05:44
Si hizo A, B
00:05:48
Si hizo A, B
00:05:50
else if
00:05:55
o else
00:06:02
vamos así, porque también si son iguales
00:06:04
me da igual escribirlo al orden
00:06:09
entonces digo así, or
00:06:10
si esta cosa
00:06:12
es igual a cero
00:06:15
escribilos así
00:06:18
si no, y aquí
00:06:22
es el único caso en el que en vez
00:06:24
el número es mayor que cero
00:06:26
estrictamente mayor que cero, entonces quiere decir que
00:06:28
b es antes que a
00:06:30
pues entonces lo que tengo que escribir aquí es
00:06:32
siso B
00:06:34
y luego
00:06:37
siso A. ¿Qué no entiendes?
00:06:39
Este señor devuelve un entero.
00:06:48
El entero puede ser
00:06:50
menor que 0
00:06:51
si A es más pequeño que B.
00:06:53
Sea lo que quiera decir
00:06:57
que A es menor que B.
00:06:59
En caso de números es claro.
00:07:01
En caso de string
00:07:03
¿qué quiera decir?
00:07:05
Tenemos que saberlo.
00:07:10
Probablemente los ordenará de forma
00:07:12
lexicográfica. O sea que
00:07:13
abuelo es más pequeño
00:07:16
que zorro.
00:07:18
Porque la A es más pequeña que la Z.
00:07:20
¿Sí?
00:07:23
Probablemente. Me espero eso.
00:07:24
Si no lo sé, me lo voy a leer.
00:07:26
Ahora lo vamos a leer.
00:07:28
Asumiendo que string sea comparable.
00:07:30
Vamos a verlo después.
00:07:34
Ahora, por ejemplo, yo me hago
00:07:36
personas. Y decido que
00:07:37
las personas se ordenan
00:07:39
por edad.
00:07:41
Entonces, si A
00:07:43
es más joven que B,
00:07:45
tendré que devolver un número negativo.
00:07:47
Si B es más...
00:07:50
Si A es mayor que B,
00:07:52
o sea, más viejo,
00:07:55
pues entonces es un número positivo.
00:07:57
Y si tiene la misma edad, cero.
00:07:58
¿Sí?
00:08:02
Ahora, yo no lo sé cómo se comparan dos objetos,
00:08:02
pero sé que esto,
00:08:05
sea como sea que tú has decidido
00:08:07
que se comparan dos objetos,
00:08:09
me los dará con un número menor de cero,
00:08:10
igual o cero.
00:08:13
Entonces, si he dicho que si A es menor que B,
00:08:15
Antes me escribes A y luego B.
00:08:17
Y también si son iguales, me da igual escribir uno o el otro.
00:08:19
En el caso, en vez de que A sea mayor que B, entonces para ordenarlos, antes el menor, luego el mayor,
00:08:23
quiere decir que antes escribo el menor y luego el mayor.
00:08:29
Y fijaos, esto yo lo he hecho asumiendo que hay dos comparables.
00:08:34
No sé cómo se comparan y no sé qué objetos voy a utilizar.
00:08:39
Pero ahora tengo un método que le doy dos objetos cualquiera
00:08:43
y él decide cuál es menor y cuál es menor y me lo escribe ordenado.
00:08:46
Vamos a utilizar esto.
00:08:52
Clase principal, hago un main.
00:09:02
Y por ejemplo, dos objetos.
00:09:11
Integer x es igual a 5.
00:09:17
Integer y es igual a...
00:09:23
Es igual a 9. Cuidado. Esto debería ser new integer. Pero es que no le gusta. O sea, Java hoy en día hace una conversión automática entre tipos primitivos y tipos que representan ese tipo primitivo como objeto.
00:09:28
Esto es un objeto
00:10:00
Un objeto de la clase integer
00:10:01
Pero cuando lo escribo así, él en automático lo que hace es que me pilla 5 como entero
00:10:03
Y me lo guarda dentro de un objeto que representa el número 5 como entero
00:10:07
No
00:10:12
Porque yo int s es igual a 5, a 4
00:10:16
Y yo no puedo hacer ese punto
00:10:22
Porque no puedo hacer métodos o variables sobre el entero como tipo primitivo
00:10:24
Sin embargo, sí que puede hacer x punto, porque es un objeto y tendrá sus métodos.
00:10:31
Tiene métodos que me pueden dar valor, tiene métodos que me puede saber cuánto es largo, muchas cosas,
00:10:36
incluido este de aquí, que a lo mejor lo conocemos de algo.
00:10:43
Entonces, integer implementa comparable.
00:10:50
No lo sé. Vamos a verlo.
00:10:58
que hay un buscador aquí
00:11:01
entonces me voy a buscar integer
00:11:04
api, java
00:11:09
me voy a mirar
00:11:11
integer
00:11:13
y voy a mirar si por ejemplo
00:11:14
implementa
00:11:17
comparable, ahora tiene una
00:11:19
cosa rara aquí, que todavía
00:11:21
no sabemos bien que es, lo veremos
00:11:23
vale, pero
00:11:25
comparable la implementa
00:11:27
y de hecho
00:11:29
si voy a mirar los métodos que puede hacer
00:11:31
está el compare to
00:11:33
¿Sí? Pues, por ejemplo, yo lo que puedo hacer ahora es utilizar mi utilidades, punto, escribe ordenados, x y, y voilà, me lo has escrito ordenado.
00:11:35
Si yo le cambio el valor y lo llamo otra vez, ¡bam!, me lo escribió ordenado.
00:12:03
Es capaz de ordenarme estos objetos porque estos objetos son comparable.
00:12:11
¿Vale?
00:12:19
Cambiamos de objeto.
00:12:20
String a es igual a vuelo.
00:12:22
String b es igual a gato.
00:12:30
Sí, para algo.
00:12:35
Pues sí, ahora puedo utilizar esta cosa de aquí, entre A y B.
00:12:37
Siempre y cuando, si tengo suerte, string,
00:12:51
resulta que implemente, all implement interface, fíjate tú, comparable.
00:12:58
Por lo tanto, tiene un compare to, por algún lado,
00:13:08
y aquí encontraré un compare to.
00:13:13
Y si voy a mirar el compareTo, aquí me dice cómo se ha implementado el compareTo para string.
00:13:15
Y me dice compares two strings lexicográfically, o sea, ordenadas alfabéticamente, ¿vale?
00:13:23
Entonces, me espero que tengo abuelo y gato, me escriba abuelo y gato.
00:13:31
si tengo
00:13:37
zabuelo
00:13:40
y gato
00:13:43
pues me escribirá
00:13:45
gato y zabuelo
00:13:47
y fijaos, yo no he cambiado este método
00:13:48
este método me está valiendo para entero
00:13:53
me está valiendo para string, me está valiendo
00:13:57
para cualquier
00:13:58
objeto que exista
00:14:00
que implemente con parable
00:14:02
me funciona
00:14:05
mi método, ¿me entiendes?
00:14:07
ahora
00:14:12
La pregunta es
00:14:12
¿Qué pasa?
00:14:14
Mi amigo
00:14:33
Cast class exception
00:14:34
Porque claro, ¿qué intenta hacer él?
00:14:37
Él le dice, pongo y pillo un entero
00:14:40
Si os acordáis, hacía esto
00:14:41
Punto compares to esto
00:14:44
Pero claro, este de aquí
00:14:46
No es un tipo compatible
00:14:48
Con integer
00:14:50
Estoy haciendo un integer en string
00:14:51
¿Qué viene antes? ¿Tres o abuelo?
00:14:53
No tengo ni idea, no son comparables
00:14:56
Entonces Java, cuando hace una cosa de ese estilo
00:15:00
Pues explota con una excepción
00:15:03
¿Por qué explota con una excepción?
00:15:06
Porque si yo me voy a mirar aquí
00:15:07
Comparable, ¿vale?
00:15:09
Aquí, además de otras cosas, por algún lado
00:15:13
Me comenta que Compar2 puede lanzar dos cosas
00:15:16
o null pointer exception
00:15:23
si es que tú me has dicho
00:15:25
este punto compare tú
00:15:29
y como parámetro me has dado un null
00:15:32
entonces como no puede él trabajar con este null
00:15:35
pues lo que hace es explota con un null pointer exception
00:15:39
si el objeto especificado es null
00:15:42
lanza un null pointer exception
00:15:45
si el objeto especificado
00:15:47
el tipo del objeto especificado
00:15:50
no puede ser comparado con este
00:15:52
objeto, con this
00:15:55
pues entonces lanza un class
00:15:56
cast exception, o sea te lo dice
00:15:59
aquí como tiene que ser implementado
00:16:01
si tú
00:16:03
haces una implementación
00:16:05
del compares to
00:16:06
y resulta que no son
00:16:08
compatibles
00:16:12
lo que debería hacer tu programa
00:16:14
compares to es lanzar
00:16:16
un class cast
00:16:18
exception
00:16:20
entonces y hasta aquí utilizando cosas que me han dado ya hecha vale pues vamos a hacer nuestra
00:16:21
propia clase vamos a hacer una clase nueva que es la clase algo que se pueda comparar persona
00:16:35
y comparamos las edad
00:16:50
tenéis otra
00:16:52
persona
00:16:54
la clase persona tiene
00:16:57
string nombre
00:17:00
e int edad
00:17:03
tiene un constructor
00:17:06
que me permite crear una persona
00:17:09
y luego queremos que esta persona
00:17:21
se pueda comparar
00:17:25
fijaos que si ahora voy aquí
00:17:26
y digo vale creamos dos personas
00:17:28
persona p1
00:17:30
p es igual
00:17:32
pers
00:17:33
1 es igual a
00:17:35
new persona
00:17:38
Sara
00:17:39
33
00:17:43
y persona
00:17:48
pers 2
00:17:51
es igual a new persona
00:17:53
paco
00:17:56
coma
00:18:02
44
00:18:04
y ahora le digo
00:18:04
utilidades
00:18:10
punto
00:18:12
escribe
00:18:14
utilidades
00:18:15
de
00:18:15
pers 1
00:18:16
pers 2
00:18:17
se enfada
00:18:20
¿por qué se enfada?
00:18:23
¿por qué me he enfadado?
00:18:37
porque persona
00:18:43
no es de tipo comparable
00:18:44
no es un comparable
00:18:46
¿por qué?
00:18:51
porque todavía no he extendido
00:18:51
no he implementado comparable
00:18:53
y yo he dicho
00:18:55
que utilidades
00:18:57
lo que hace es pillar un comparable
00:18:58
Entonces persona no lo puede hacer
00:18:59
Así como tal
00:19:02
No puedo implementar
00:19:03
Ah, espera, no pasa nada
00:19:05
Public
00:19:06
No, int
00:19:10
Compare to
00:19:11
The object
00:19:14
Object
00:19:17
Ya está
00:19:18
Ya tengo para comparar
00:19:20
Return 1
00:19:22
Ya está, ya lo tengo
00:19:24
¿Por qué se enfada?
00:19:26
Porque el hecho que yo implemente
00:19:40
Este método no quiere decir que esté implementando la interfaz.
00:19:42
¿Se entiende?
00:19:49
O sea, yo no he sobrescrito el contrato.
00:19:51
O sea, no he firmado el contrato.
00:19:55
¿Vale?
00:19:58
La gente desde fuera ve que persona sí tiene un compare to,
00:19:58
pero no es el compare to definido en la interfaz comparable,
00:20:02
porque yo no la implemento esa interfaz.
00:20:06
por lo tanto no puedo
00:20:08
tratar a una persona como
00:20:10
comparable, lo que estoy haciendo
00:20:11
es que tú tienes tu método compare to
00:20:14
tuyo, que lo has usado como te da la gana
00:20:16
para que
00:20:18
yo esté seguro
00:20:20
que esto funcione
00:20:21
pues entonces le tengo que
00:20:24
decir implement
00:20:26
comparable
00:20:27
ahora, este
00:20:30
comparable aquí, ahora yo he
00:20:32
firmado el contrato, que no es un
00:20:34
Compartoo como me da la gana
00:20:36
Es el Compartoo de Comparable
00:20:38
Y yo tendría que
00:20:40
Irme a
00:20:42
La interfaz Comparable
00:20:43
Y leerme bien que quiere
00:20:45
Que haga la interfaz Comparable
00:20:48
Y definir
00:20:51
Esto
00:20:52
¿Está claro?
00:20:53
Vale
00:20:56
Ahora, si yo lo he hecho
00:20:56
Sé que Comparable
00:21:00
Tiene que comparar
00:21:02
this con este
00:21:04
objeto de aquí
00:21:06
¿vale? y
00:21:07
ver
00:21:09
si son compatibles o no
00:21:10
¿sí? entonces
00:21:13
lo voy a hacer de una forma un poquito rara
00:21:15
pero ve, la primera cosa
00:21:18
es que este objeto de aquí
00:21:20
tiene que ser
00:21:22
una persona, si no
00:21:23
mal vamos, yo estoy en
00:21:29
persona, estoy comparando
00:21:32
this que es una persona
00:21:35
y no lo quiero comparar con un gato
00:21:36
Porque no puedo comparar gato. Si yo te digo, ¿qué viene antes? ¿Esta persona aquí que he creado? ¿Esta persona aquí? ¿Esta? ¿O la palabra abuelo? No lo sé, no son comparables.
00:21:38
Entonces, si yo estoy definiendo una forma de comparar entre ellos dos señores, dos personas, ¿vale?
00:21:57
Entonces, lo que necesito es que esto también sea una persona. Necesito dos personas para poderlas comparar.
00:22:06
Una es... ¿Cuáles son las dos personas que estoy comparando?
00:22:13
No. Aquí no está ni persona 1 ni persona 2. ¿Quién son?
00:22:23
Porque aquí yo lo he llamado así
00:22:31
Pero si ahora le pongo persona 3, persona 4
00:22:36
Es una cosa distinta
00:22:39
No lo sé, no sé qué voy a...
00:22:40
Aquí estoy en general
00:22:42
Pero aquí yo tengo dos objetos con los que puedo trabajar
00:22:44
¿Cuáles son estos objetos?
00:22:47
Uno es esto
00:22:55
Este es un objeto
00:22:56
¿Sí? ¿Y cuál es el otro?
00:23:00
¿Y cómo se llama la referencia de ese mismo objeto?
00:23:12
This
00:23:15
Estos son los dos objetos que estoy comparando
00:23:15
This
00:23:18
Y el objeto que me han pasado por parámetro
00:23:19
¿Sí?
00:23:22
Ahora, this es una persona
00:23:23
¿Por qué? Porque estoy en la clase persona
00:23:25
This es una persona, ningún problema
00:23:27
Pero object
00:23:29
¿Qué es?
00:23:31
Por eso, entonces necesito
00:23:33
Cerciorarme que esto sea
00:23:43
Una persona, ¿cómo lo hago?
00:23:45
¿Qué puede pasar aquí?
00:24:06
Dos cosas
00:24:08
Uno
00:24:09
Que object
00:24:11
sea una instancia de persona
00:24:16
o sea que si hiciera
00:24:19
obj instance of persona
00:24:21
me diera true
00:24:23
y entonces esta cosa funciona perfectamente
00:24:24
¿verdad?
00:24:28
o la segunda opción
00:24:31
que si yo hiciera
00:24:32
persona
00:24:33
p instance of persona
00:24:35
me devolviera un
00:24:38
hola
00:24:39
me devolviera un
00:24:41
un class cast exception
00:24:44
que si os acordáis
00:24:47
el compare to puede lanzar
00:24:49
un class exception
00:24:51
si está mal, por lo tanto esto me viene perfecto
00:24:53
yo lo hago
00:24:56
que son
00:24:57
tipos compatibles, ya lo he transformado
00:24:59
a una persona y ahora tengo dos personas
00:25:01
que no son tipos compatibles
00:25:03
pues lanzará un class exception
00:25:05
que es lo que se espera en la gente
00:25:06
del método
00:25:09
compare to, la gente
00:25:10
según el contrato, este es mi
00:25:13
contrato, se espera que
00:25:15
si el tipo del objeto
00:25:17
que te ha dado no es compatible,
00:25:19
tú lances un class case exception.
00:25:21
Pues ya está.
00:25:24
Ya lo tengo.
00:25:26
¿Se entiende? Pero yo quiero que me salte.
00:25:29
El contrato del
00:25:37
compertú me dice que si tú aquí
00:25:39
me pasas un objeto que no es
00:25:41
persona, tú tienes que hacer
00:25:43
saltar un error. Lo dice aquí.
00:25:45
Lo dice aquí.
00:25:49
Si el tipo del objeto especificado, o sea, el que pasa los parámetros,
00:25:51
no puede ser comparado con este objeto, o sea, porque son tipos distintos,
00:25:56
me lanzas un class cast exception.
00:26:01
Entonces, si yo voy a, como no sé todavía cómo lanzar excepciones,
00:26:04
pues lo que voy a hacer es aprovecharme de esto.
00:26:10
Yo sé que esta cosa de aquí, si la hago mal, si este de aquí no es una persona,
00:26:12
Cuando lo hace, lanza un classCastException
00:26:17
Por lo tanto, con esta frase aquí
00:26:20
Yo puedo tener dos resultados posibles
00:26:22
O el objeto que me has pasado es una persona
00:26:25
Y por lo tanto ahora lo tengo referenciado como persona
00:26:28
Y puedo usar los métodos de persona
00:26:30
Perfecto
00:26:32
O el objeto que me has pasado no es una persona
00:26:34
Y cuando intento castearlo a algo que es persona
00:26:36
Me va a lanzar un classCastException
00:26:39
Te mueves aquí, por favor
00:26:41
Te mueves aquí
00:26:43
¿Me entendéis?
00:26:47
¿Vale? Entonces, aquí yo estoy aprovechando
00:26:53
La funcionalidad de otra cosa
00:26:56
Que es el cast, que a veces lanza
00:26:57
Un classCastException para poder
00:26:59
Completar mi
00:27:01
Trabajo
00:27:03
Con este de aquí
00:27:05
¿Vale? Entonces, ahora yo tengo
00:27:07
Dos personas, aquí, aquí delante
00:27:09
Ahora tengo dos personas, ¿qué hago?
00:27:11
Tengo dis
00:27:16
Y tengo p
00:27:17
¿Vale? Lo que quiero hacer yo
00:27:18
es, para hacerlo básico, interresultado es igual a cero, por ejemplo, si this.edad, hemos dicho que comparamos por edad, es menor que p.edad,
00:27:21
Entonces, ¿qué hago?
00:27:42
Si this es más pequeño que p
00:27:59
Devuelvo
00:28:03
No estoy en escribir ordenado
00:28:04
Estoy en comparando
00:28:12
Yo tengo que decir si este es más grande o más pequeño
00:28:14
Y para decir que es pequeño mando un número negativo
00:28:16
Para decir que son iguales un cero
00:28:20
Para decir que es mayor un número positivo
00:28:22
Por lo tanto, menos uno
00:28:26
Si this es más joven que p, entonces te daré menos uno.
00:28:28
Else o if otra vez.
00:28:40
Lo hago feo porque luego vemos que hay otro.
00:28:44
This.edad es mayor que p.edad.
00:28:47
Resultado, uno.
00:28:54
Y ya está.
00:28:59
Return, resultado.
00:29:00
Si son iguales
00:29:02
Ya la he metido a cero
00:29:06
Entonces no entrará ni aquí ni aquí
00:29:07
Y me lo dejará en cero
00:29:09
Pues ya está, he definido
00:29:11
Cómo se comparan estas dos personas
00:29:14
Vamos a ver
00:29:17
En principal
00:29:19
Ahora tengo mis dos personas
00:29:23
Que ahora son comparable
00:29:25
Y por lo tanto sí que los puedo poner aquí
00:29:27
En este caso me debería dar
00:29:29
Antes Sara y luego Paco
00:29:32
Y me da
00:29:34
¿Por qué?
00:29:35
Porque no he definido cómo se escriben las personas.
00:29:43
Entonces, public string toString.
00:29:47
Cuando quieres dar una representación en formato string de estos objetos, es el toString.
00:29:54
Lo que haces es, por ejemplo, return this.nombre más una paréntesis,
00:30:01
más this.edad
00:30:15
más cierro paréntesis
00:30:17
entonces la representación de un objeto persona
00:30:19
será su nombre seguido de entre paréntesis
00:30:23
su edad
00:30:26
ahora cuando lo lanzo aquí
00:30:27
veo que me lo ha ordenado como Sara
00:30:30
que tiene 33 años y luego pago de 44
00:30:33
si pago lo pongo
00:30:36
de 14 años
00:30:37
pago y Sara
00:30:39
o sea que yo he definido
00:30:43
Cómo se comparan entre ellos dos personas
00:30:47
Y a partir de allí
00:30:51
Él me los ordena correctamente
00:30:54
¿Se entiende?
00:30:58
Fijaos que yo me espero también
00:31:02
Que este método de aquí
00:31:04
Bueno, el método compare to
00:31:05
Si por si acaso y aquí le pongo
00:31:06
X
00:31:09
Que es un entero
00:31:10
Pues esto debería explotar con un
00:31:12
ClassCastException
00:31:15
perfecto, classCastException
00:31:19
¿por qué? porque cuando llegará aquí
00:31:22
e intenta hacer del integer
00:31:25
una conversión a persona
00:31:27
pues esto no es correcto
00:31:30
y por lo tanto lanzará un classCastException
00:31:32
me vale
00:31:34
y por otro lado
00:31:36
si yo aquí le paso un null
00:31:39
me debería dar un null pointer exception
00:31:42
¿Por qué? Porque cuando dentro de persona intentará hacer P.edad
00:31:49
P es null
00:31:55
Y por lo tanto null.edad me dará un null pointer exception
00:31:57
¿Dudas hasta aquí?
00:32:02
Vale, ahora
00:32:07
Si os fijáis
00:32:08
Esto compara dos personas
00:32:10
Y me dice si es menor o igual o mayor de edad
00:32:14
¿Sí?
00:32:18
Pero no me dice cuánto
00:32:19
O sea, independientemente de que uno sea de una edad y uno sea de otra, me dará menos uno. Uno o cero.
00:32:21
Y funciona. Está definido. ¿Vale? Por cómo está definido compertú, me vale.
00:32:31
Pero compertú podría ser más fino, hilar más fino, y decirme en este int cuánto es menor o cuánto es mayor con respecto al otro objeto.
00:32:38
O sea, que en vez de devolverme menos 1, 0 y 1, me podría, si los dos están cerquita, devolverme menos 1, por ejemplo, pero si los dos son muy lejos, pues devolverme menos 100.
00:32:53
Y si los dos son muy, muy lejos, menos 1000.
00:33:05
Por ejemplo, aquí podría hacer dis.p menos, dis.edad, perdón, menos p.edad.
00:33:10
porque si esto tiene 10 y esto tiene 20
00:33:32
me dará un número negativo
00:33:40
y es como tiene que ser
00:33:42
si esto tiene 20 y esto tiene 10
00:33:45
me dará un número positivo
00:33:47
y si esto tiene la misma edad me dará 0
00:33:48
perfecto
00:33:51
¿si o no?
00:33:53
por lo tanto
00:33:57
esta podría ser una solución
00:33:58
es más
00:33:59
si esto tiene 10 años y esto tiene 40
00:34:00
me dará menos 30
00:34:03
y me está dando
00:34:06
más distancia con respecto a
00:34:08
si esto tiene 10 y esto tiene 12
00:34:10
que me dará menos 2
00:34:12
entonces el número que me da, no solo me dice
00:34:13
positivo o negativo, que es lo que
00:34:16
para que sirve Compertur
00:34:18
sino que también lo puedo utilizar
00:34:20
para saber cuánta distancia hay entre ellos
00:34:22
que a lo mejor para otros
00:34:24
otros trabajos
00:34:26
pues puede venir bien
00:34:28
¿sí? y fijaos que
00:34:29
esta implementación, aparte que es más elegante
00:34:32
que todo este iffeo
00:34:34
pues sigue funcionándome
00:34:36
sigue funcionando
00:34:39
aquí
00:34:46
si, fijaos el método es siempre
00:34:47
el mismo, da igual
00:34:54
que objetos le estoy pasando
00:34:56
con que implementen
00:34:58
comparable tendrán
00:35:00
dentro el método compareTo
00:35:02
por lo tanto independientemente
00:35:04
de lo que sea comparable tendrá
00:35:06
el compareTo y lo podré utilizar
00:35:08
sobre estos objetos y por lo tanto
00:35:10
podré definir
00:35:12
este método y podré utilizar
00:35:14
este método, ahora esto extendiéndolo
00:35:16
en vez de escribir ordenados
00:35:19
yo lo que podría hacer aquí es
00:35:21
pillar un array
00:35:22
de comparable
00:35:24
y ordenarlo
00:35:26
independientemente de lo que esté
00:35:28
a lo que estoy ordenando
00:35:30
vale
00:35:32
si yo me voy
00:35:33
a Arrays
00:35:35
en Arrays, si no me equivoco
00:35:39
estará
00:35:46
este señor de aquí
00:35:52
en sus varias funciones
00:35:54
este de aquí es un array sort
00:35:57
¿vale?
00:36:00
por algún lado
00:36:02
no, no, hay un sort
00:36:04
de comparable, no
00:36:06
hay un sort de object
00:36:08
pero bueno, a ver como lo hace
00:36:11
yo podría hacerme, pensaba de encontrarlo
00:36:15
aquí, pero podría hacerme un
00:36:18
ordena
00:36:19
de objetos comparable
00:36:21
y luego allí dentro ir comparándolo
00:36:23
entre ellos y si están desordenados
00:36:26
ordenarlos hasta que tenga
00:36:28
un array ordenado y lo devuelva
00:36:30
¿vale? y esto es un ejercicio parecido
00:36:32
a lo que hacíamos en octubre
00:36:34
de dado un array desordenado
00:36:36
ordenalos, solo que en vez
00:36:38
de ordenarlos según los
00:36:40
números, lo ordeno según lo que me
00:36:42
dice el
00:36:44
el Compertú
00:36:45
¿sí?
00:36:47
o sea que esto lo podéis hacer
00:36:49
¿sí?
00:36:51
y más cosas que yo
00:36:55
quería hacer con esto
00:36:57
vale, entonces
00:36:59
Si todo esto está bien, ahora yo puedo hacer lo siguiente, ¿vale?
00:37:14
Yo podría hacer siso persona.perts1.compareto.perts2, ¿sí?
00:37:19
Y también puedo hacer siso persona.equals.perts2.
00:37:37
¿Sí? Entonces, si eso es que persona 1 y persona 2 son distintos, ¡voilá!
00:37:46
Me está diciendo que hay una diferencia de edad de 19 años y que no son lo mismo.
00:37:54
¡Fenomenal!
00:37:59
Pero cuidado. Y si yo le digo que los dos tienen 14 años, con pertú me dicen que son iguales.
00:38:01
Sin embargo, ¿eh? ¿Cuál se me dice que son distintos?
00:38:14
Y esto no puede ser. Es mi responsabilidad cuando implemento la clase Persona, que implementa Comparable, y entonces hago esta cosa de aquí, yo tengo que estar seguro que ahora cuando me da cero, los dos son iguales.
00:38:17
¿Se entiende? Pues ¿cómo hago eso? Tendré que redefinir equals porque según mi concepto de comparación, para mí dos personas son iguales cuando dos personas son mayores o menores según la edad.
00:38:38
Entonces, tendré que definir de alguna forma que cuando estas dos personas, mejor, cuando estas dos personas sean iguales, no puedan ser distintos esta cosa aquí, el compertú.
00:39:00
O sea que aquí hay que razonarlo un poquito mejor. Porque esto me podría valer asumiendo que mi concepto de equals, de igualdad, tenga en consideración también el nombre.
00:39:17
O sea, estos señores no son la misma persona, porque uno es sara y uno es pajo, tienen la misma edad.
00:39:34
Entonces, si los comparo son iguales, pero es justo que no sean la misma persona.
00:39:43
A menos que para mí dos personas de la misma edad sean la misma persona.
00:39:49
Pero si yo ahora hago esto, y yo considero que estos dos sean la misma persona, deberían ser equivalentes,
00:39:53
pues entonces esto ahora me debería dar true.
00:40:04
No sé si me explico lo que quiero decir, ¿vale? O sea, que yo cuando toco el compare to, tengo que pensar también a cómo identifico el equals. Las dos cosas van juntas y tienen que ser consistentes, ¿vale?
00:40:07
Si para mí dos personas son iguales cuando tienen nombre y edad iguales, que es una definición de igualdad un poco blanda, porque nosotros sabemos que dos personas se pueden llamar Sara y dos personas pueden tener 14 años, pero por cómo lo estoy haciendo yo, dos objetos Sara 14 deberían ser el mismo.
00:40:25
Si yo quiero poderlo separar, a lo mejor le pongo un identificador, a lo mejor le pongo el DNI, entonces sí que sé cuándo son iguales, cuándo no, ¿vale?
00:40:45
Pero COMPARE TO e EQUALS deberían estar consistentes entre ellos, sobre todo si dos personas son la misma persona, el resultado de COMPARE TO tiene que ser cero, sí o sí.
00:40:55
Y que si compareTo da un valor que no es cero, pues probablemente los objetos no deberían ser el mismo objeto.
00:41:12
Estas dos cosas hay que comprobar.
00:41:25
Entonces, en este caso aquí, pues debería yo pensar también en cuando hago, como norma general,
00:41:28
cuando hago la implementación de comparable o entonces compareTo,
00:41:35
pues va en pareja también sobre escribir el equals
00:41:39
para que sean consistentes los resultados de comparable
00:41:42
y de equals, y esto por algún lado dice
00:41:46
esto, yo creo que aquí no
00:41:48
mira
00:41:55
he recomendado muchísimo
00:42:08
pero no requerido
00:42:15
estrictamente, que si
00:42:18
x convertido de y da 0
00:42:21
entonces
00:42:23
x.equals de y
00:42:25
te de true
00:42:28
constantemente
00:42:30
luego
00:42:31
habrá casos en que tú dices
00:42:35
no, no puede ser y quiero que no
00:42:37
pero por lo general
00:42:39
esto debería ser una cosa que funcione
00:42:41
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 16
- Fecha:
- 21 de enero de 2025 - 12:40
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 42′ 49″
- Relación de aspecto:
- 16:10 El estándar usado por los portátiles de 15,4" y algunos otros, es ancho como el 16:9.
- Resolución:
- 1152x720 píxeles
- Tamaño:
- 158.25 MBytes