20250211 Ejemplos Comparator - 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:
si habláis me dais la posibilidad el permiso para que es grave vale vamos a
00:00:00
crear una clase persona que ahora vamos a utilizar vale esta clase persona le
00:00:06
vamos a poner algunas cosillas le vamos a poner que tiene una string nombre un
00:00:11
un int edad, lo de clásico, y public persona de string n int e, y esto me crea un dis.nombre
00:00:20
es igual a n, dis.edad es igual a e. ¿Vale? Más o menos.
00:00:41
Ok, lo que yo quiero hacer es crear una colección de personas
00:00:46
¿Vale?
00:00:52
Y luego quiero crearme un metodillo que ordene estas personas
00:00:53
¿Parece bien?
00:00:59
¿Sí?
00:01:03
Ejercicio sencillo
00:01:03
Pero luego a partir de allí vamos a ver cómo podemos mejorar un poquito las cosas
00:01:04
¿Vale?
00:01:10
Vale
00:01:12
Entonces vamos a hacer un main
00:01:21
Aquí ponemos un main
00:01:23
vale, entonces aquí nosotros
00:01:28
creamos una colección y metemos dentro personas
00:01:33
¿qué
00:01:35
sobre
00:01:39
¿qué colección queréis usar?
00:01:40
hacer una lista de personas
00:01:49
un conjunto de personas
00:01:50
si queréis usar
00:01:52
una
00:01:54
esto es más bien sobre
00:01:55
no es sobre maps, luego hacemos
00:01:58
un ejercicio de maps
00:02:00
¿vale?
00:02:01
la cuestión es, si tenéis una colección
00:02:05
que no hemos usado que queréis usar que si yo el asset o preferís usar el
00:02:09
arre list lo dejo más fácil arre list
00:02:14
linked list son igual estas dos son prácticamente lo mismo de hecho puede
00:02:19
usar una list a ver que había usado ya aquí arre list
00:02:25
da igual da igual no es eso lo que vamos a mirar hagamos una lista luego lo
00:02:40
complicamos en otro momento hagamos una lista de personas personas es igual a new array list
00:02:47
de persona clic clic vale vale entonces tenemos esta persona de aquí añado unas personas al azar
00:02:55
vale persona perdón personas punto ad de new persona de algo y ponemos sara 40
00:03:12
ponemos antonio 24 y ponemos
00:03:33
quizá 45 vale he puesto personas podrían ser 23 me da igual es para crear una persona una
00:03:46
lista vale ahora yo tengo esta esta lista de aquí lo que quiero es un metodito que pille
00:03:57
estas personas y esta lista y las ordene vale entonces aquí yo tendré un ordenar personas
00:04:04
este ordenar a lo mejor puedo que me devuelva algo sí y podría hacer que personas es igual
00:04:16
a ordenar personas si son personas entonces la idea es la siguiente sin ordenar y está ordenada
00:04:26
return personas
00:04:59
ay
00:05:07
hay error
00:05:09
a ver si haga este de aquí
00:05:14
cuando ayer hice algo
00:05:16
y me cargué
00:05:40
vale, he cambiado
00:05:41
de proyecto para que funcione
00:06:24
porque el otro no sé por qué tiene algún parámetro
00:06:26
que no me funciona, no quiero perder tiempo
00:06:28
pues cuando lanzo este
00:06:29
programa me sale este de aquí
00:06:32
¿cómo lo mejoro? ¿qué hago?
00:06:34
vale
00:06:47
empezamos por aquí
00:06:47
me pongo aquí, botón derecho
00:06:49
source, toString
00:06:52
que quiero que aparezca
00:06:53
nombre, edad, lo genero
00:06:55
pues ya está
00:06:58
no, no me sirve, toString, aquí está
00:06:59
¿vale? entonces me escribirá
00:07:02
la persona, nombre, cosas así
00:07:04
si no me gusta, porque a lo mejor esto sale
00:07:06
muy grande
00:07:08
pues entonces le pongo
00:07:09
directamente el nombre
00:07:12
más
00:07:14
entre paréntesis la edad.
00:07:19
Entonces, ahora me sale así.
00:07:29
No quiero esta coma.
00:07:32
Ahora me sale así.
00:07:35
¿Sí? Así veo
00:07:38
mi cosa. Claro, como mi programa
00:07:39
ordenar no hace nada,
00:07:41
pues entonces no hace nada.
00:07:44
¿Sí?
00:07:46
Ok. Vale.
00:07:47
Metámonos
00:07:51
aquí.
00:07:52
¿Cómo puedo ordenar
00:07:53
esta cosa? Lo hacemos antes
00:07:55
De la versión fácil
00:08:01
Vale
00:08:02
¿Vosotros os acordáis que
00:08:04
Arrays
00:08:07
Tenía un metodillo para ordenar?
00:08:07
Pues las colecciones tienen un metodillo
00:08:12
Para ordenar
00:08:15
Que es collections
00:08:16
¿Vale?
00:08:17
Collections.sort
00:08:20
¿Si?
00:08:22
En collections.sort
00:08:25
Le puedo pasar
00:08:27
Personas
00:08:28
esto se enfada
00:08:30
el método sort de list
00:08:32
en el connection es aplicable
00:08:35
a list de persona
00:08:37
porque tendré que ponerle
00:08:39
aquí persona
00:08:44
no
00:08:46
a ver
00:08:49
como se usa esto
00:08:52
este aquí me está diciendo que el método
00:08:55
sort de la list
00:08:58
de tipo
00:09:00
colecciones no es aplicable
00:09:02
al argumento list de persona
00:09:04
¿Y por qué?
00:09:06
Vamos a ver la API
00:09:11
Vamos a ver qué me dice
00:09:12
API Collections Java
00:09:13
22
00:09:20
Entonces, estos son
00:09:24
Esta es como una clase comodín
00:09:30
Para gestionar colecciones
00:09:32
Que me da varios métodos
00:09:34
Sobre el que puedo utilizar
00:09:37
Las colecciones
00:09:38
Tipo, dame el máximo de una colección
00:09:40
Dame el mínimo de una colección
00:09:42
O hazme un sort, ¿vale? Ah, ok, ahora lo sé. ¿Por qué creéis que se va a enfadar? ¿Vale? Este es un método que organiza, ¿sí? Lo que tiene que hacer es, sustancialmente, pillarme las personas y decir, oye, mila, ordénamela. ¿En qué sentido?
00:09:44
Es que hay un criterio de ordenación para personas. No sabemos cómo se ordenan las personas, justo. Entonces la pregunta es, ¿cómo puede existir un método sort que ordene cosas sin saber si estas cosas son ordenadas o no?
00:10:16
Y en el momento en que tú sabes, estableces un orden, ¿cómo puede sort saber cuál es el orden? ¿Qué podríamos hacer nosotros en sort si fuéramos nosotros el que implementan sort para decir, oye, mira, lo que me estás pasando es ordenable?
00:10:40
Pero entonces tienes que rehacerlo desde cero. Y nosotros no queremos rehacerlo desde cero. Porque entonces por eso me hago yo mi programa aquí, que es la versión difícil en el sentido de hacerlo nosotros el sort.
00:10:59
efectivamente, o sea
00:11:24
¿qué pensáis que pilla como parámetro
00:11:29
el método sort?
00:11:32
una lista cualquiera
00:11:34
una colección cualquiera
00:11:38
repito la pregunta
00:11:41
¿quién ha hecho sort?
00:11:46
¿vale?
00:11:50
que supuestamente me ordena las cosas
00:11:50
¿pensáis que como parámetro aquí
00:11:52
en su definición ha puesto
00:11:56
ponme una colección cualquiera y yo te la ordeno?
00:11:57
no, no podría ser eso
00:12:01
¿Vale? Porque, por ejemplo, si no me habría ordenado esta de aquí, pero esta de aquí no me la puede ordenar. ¿Por qué no me la puede ordenar? Porque persona no se sabe cómo se ordena. Entonces, ¿cómo podría yo estar seguro que lo que me pases aquí, la lista que me pases aquí, sea posible ordenarla?
00:12:02
haciendo comparto, es decir
00:12:23
que parámetro le pondría
00:12:25
yo a sort, es decir
00:12:28
el parámetro que me das tiene que ser un
00:12:30
una colección, ¿de qué?
00:12:32
de enteros, entonces solo ordeno
00:12:36
los enteros, un string yo no puedo
00:12:38
cualquier cosa que yo le pase
00:12:40
que se ordene, y para estar seguro
00:12:46
que lo que me pases tú
00:12:48
es ordenable
00:12:50
quiere decir que el tipo
00:12:51
de las listas
00:12:54
o de las colecciones que me pases es una colección de
00:12:56
¿Ojetos de qué tipo?
00:12:58
¿De string? Pues ordenaría solo string
00:13:03
¿Integer? Ordenaría solo integer
00:13:05
¿Persona? Pues persona ni siquiera la puedo ordenar
00:13:07
¿Cómo puedo
00:13:09
Decir
00:13:10
En general que cualquier cosa
00:13:12
Que tú me pongas aquí
00:13:15
Seguramente yo la puedo ordenar
00:13:16
Con un tipo genérico
00:13:18
Si no
00:13:26
Porque
00:13:28
¿Qué hace que un objeto
00:13:30
Tú has contestado
00:13:35
Me falta el siguiente paso.
00:13:38
O sea, yo tengo un método.
00:13:41
Va a recibir una lista, ¿vale?
00:13:42
Pero si yo pusiera una lista de cualquier cosa, una lista de T,
00:13:44
yo habría podido pasarle lista de personas.
00:13:48
Y habría tenido el problema que personas no las puedo ordenar.
00:13:52
Entonces, ¿cómo puedo decir, no, mira, no me pases cualquier lista?
00:13:57
Porque las listas de objetos no ordenables, yo no puedo ordenarlos.
00:14:00
Si no me dices un criterio de ordenación, yo no lo puedo hacer.
00:14:05
Pero yo tengo una forma de decirte, oye, mira, dame una lista de objetos especiales
00:14:09
que sí tienen que tener un criterio de ordenación.
00:14:15
Y a partir de allí yo puedo hacer lo que me haga la gana.
00:14:20
No, ¿eh?
00:14:26
Pues vamos a verlo aquí.
00:14:26
¿Qué pilla list?
00:14:32
El concepto es que los tipos que pongo aquí deberían ser comparable. Si los tipos que pongo aquí son comparable, ¿vale? All elements in the list, más simplemente de comparable interface.
00:14:37
entonces yo puedo
00:14:59
si tú me pasas un list
00:15:03
de un objeto y este objeto es
00:15:05
de tipo comparable, es una instancia comparable
00:15:07
que no puede ser porque es una interfaz
00:15:09
pero ¿os acordáis que podía usar las referencias
00:15:10
como instancias
00:15:13
y cosas por el estilo? Si yo te digo
00:15:15
el objeto que me pones
00:15:17
aquí dentro tiene que ser un comparable
00:15:19
lo que me estás
00:15:21
diciendo es que dentro tiene que tener
00:15:23
un compareTo y si tiene
00:15:25
el compareTo yo puedo usar el compareTo
00:15:27
para decir si esto viene antes que esto.
00:15:29
Entonces, si me das un list de persona,
00:15:33
yo no te lo acepto.
00:15:35
Pero si me das un list de persona
00:15:37
que implementa comparable,
00:15:39
o sea, si me estás dando sustancialmente
00:15:42
un objeto comparable,
00:15:43
pues entonces sí ahora sé pillar a esta persona,
00:15:46
sé decirle compare to y hacerlo.
00:15:48
¿Me entendéis lo que quiero decir?
00:15:51
Esto es interfaces.
00:15:53
Entonces, ¿por qué se enfada este de aquí?
00:15:59
Creo.
00:16:01
porque sort no admite
00:16:01
lista de personas
00:16:04
porque persona no implementa comparable
00:16:06
vamos a
00:16:08
implementarle comparable
00:16:12
implements comparable
00:16:14
ahora le voy a decir
00:16:16
mira persona, te voy a añadir
00:16:20
algo que permite
00:16:22
dame dos personas y te digo
00:16:23
quien viene antes y quien viene después
00:16:26
esto
00:16:27
se enfada porque dice
00:16:30
si me has dicho que implementas comparable
00:16:31
pero no tienes el método compare to vale comparamos creamos los métodos cuando creo
00:16:33
compare to me da un objeto vale porque compare to siempre se compara con un objeto y aquí hay
00:16:41
que hacer cosas como ver si el objeto es de la misma clase ver si hay cosas por el estilo vale
00:16:49
Ahora vamos a verlo. No sé si esto tengo suerte, me da Compertú. No, lo tengo que hacer yo el Compertú. Entonces, el concepto es, yo tengo dos objetos aquí dentro. Esta es la interfaz de Compr y ya lo hemos hecho. Pero ya que estamos, la repasamos.
00:16:55
¿Vale? Entonces, yo aquí tengo dos objetos. ¿Cuál es el primer objeto? This. Esta persona. ¿Y la voy a comparar con qué objeto? O. Estos son mis dos objetos. ¿Sí? Un objeto que es this y un objeto que es o. Quiero comparar estos dos. ¿Sí?
00:17:16
El primer problema que tengo es que esto es un objeto cualquiera.
00:17:56
Y si no es comparable, debería pasar algo.
00:18:02
Vamos a ver un momento si nos ayuda Java API comparable.
00:18:05
Espera, que aquí a lo mejor es...
00:18:13
Si os acordáis, comparable, que era esta interfaz de aquí,
00:18:20
dice implementa compare to, implementa compare to de un objeto.
00:18:24
lo que tienes que hacer es devolver un entero
00:18:29
y cuando devuelves un entero
00:18:32
le tienes que decir
00:18:34
cero si son equivalentes
00:18:37
menor si el primero es anterior que el segundo
00:18:41
y un número mayor que cero
00:18:45
si el segundo es anterior que el primero
00:18:47
¿os acordáis, no?
00:18:50
también, si yo miro
00:18:52
comparable tiene un tipo genérico
00:18:54
entonces aquí tengo dos opciones
00:18:58
o lo dejo así como estoy
00:19:01
y compruebo allí dentro
00:19:03
si
00:19:05
si esto es de mi tipo
00:19:07
correcto
00:19:09
ahora lo hacemos si queréis
00:19:10
o digo que no es que implementas
00:19:13
comparable cualquiera
00:19:15
implementas comparable de persona
00:19:17
porque si os fijáis
00:19:19
la interfaz
00:19:24
es comparable de un tipo genérico
00:19:29
y luego aquí
00:19:31
lo que me hace es comparar
00:19:33
con ese tipo genérico.
00:19:36
¿Lo veis que comparó? Entonces, si yo le digo
00:19:42
que eres comparable con otra persona,
00:19:44
pues aquí me hace tras solo una persona.
00:19:45
Y me quito el problema de que estoy
00:19:48
comparando con un objeto.
00:19:49
Si lo quisiera hacer así, fijaos que
00:19:51
si yo intento
00:19:54
hacer un...
00:19:56
comparar
00:19:59
este objeto, una persona,
00:20:00
con un gato, lo que
00:20:02
debería pasar es esto.
00:20:03
ClassCastException
00:20:06
Tú me estás diciendo
00:20:09
Que me has pasado un gato
00:20:11
Pero estabas trabajando con personas
00:20:12
Pues cuando yo intento hacer
00:20:15
Un casting de este objeto que me has pasado
00:20:17
A persona, pero no es una persona
00:20:19
Porque me has pasado un gato
00:20:21
Pues exploto
00:20:22
¿Sí?
00:20:23
Y esto se podría lograr en nuestro
00:20:26
En nuestro ejemplo
00:20:29
Sin persona
00:20:31
Así
00:20:32
Simplemente haciendo, vale, paso 1
00:20:34
personaP es igual
00:20:37
a persona
00:20:40
de O
00:20:41
esta cosa de aquí
00:20:43
lo que está intentando hacer es convertirme
00:20:47
este objeto
00:20:50
en una persona
00:20:51
si este objeto es una persona
00:20:53
funcionará
00:20:55
si este objeto no es una persona, ¿qué lanzará?
00:20:57
una excepción
00:21:02
¿qué tipo de excepción?
00:21:03
classCasterException
00:21:07
y entonces es
00:21:08
Y es lo que yo me espero, porque me lo dice el API, ¿vale? El API me dice, oye, mira, que si el objeto que has pasado no se puede comparar con este objeto porque no son del mismo tipo, lanza un class cast exception.
00:21:10
perfecto
00:21:24
para hacerlo más bonito
00:21:28
y más sencillo para nosotros
00:21:31
y así repasamos y usamos también
00:21:34
los tipos
00:21:36
voy a decirle
00:21:37
que implementa comparable de persona
00:21:40
fijaos que ahora cuando le digo
00:21:43
añádeme los métodos no implementados
00:21:44
no me añade de objeto
00:21:47
me añade de persona
00:21:49
porque ahora estoy trabajando con persona
00:21:50
si
00:21:53
¿Están de acuerdo?
00:21:54
Entonces, ahora tengo dos objetos.
00:21:57
Tengo el objeto dis de tipo hola, persona.
00:21:59
Y tengo el objeto o de tipo persona.
00:22:12
Dos personas.
00:22:17
¿Cómo ordeno las personas?
00:22:19
Por nombre, claramente.
00:22:26
Por nombre, claramente.
00:22:31
¿Sí? Entonces, ¿cómo ordeno, cómo digo si una persona es más, o sea, viene antes o después de otra persona? Que no, que no, que no. ¿Por nombre? ¿Por la edad? No, por la edad no, por nombre. ¿Por la edad? No, tampoco por la edad, por nombre.
00:22:33
¿Cómo le digo qué tengo que escribir aquí?
00:22:56
¿Qué operaciones tengo que decir para decir tengo dis y tengo 0?
00:22:59
Tengo o, perdón.
00:23:03
Quiero, si dis viene antes de o, un número negativo.
00:23:04
Si o, dis y o van al mismo nivel, pues son el mismo nombre,
00:23:09
tienen el mismo nombre, pues tiene que dar un 0.
00:23:14
Y si en vez va antes o que dis, pues tendré que dar un número positivo.
00:23:16
char t1 es igual a dis.nombre.charat0, punto y coma, sí, siguen existiendo los char, char oc, pongamos este c, es igual a o.nombre.charat0, ¿eh?
00:23:21
Ahora, si os acordáis, estos señores eran también números.
00:24:15
Entonces, a lo mejor yo lo que puedo hacer es devuelve tc menos c, o c menos tc.
00:24:21
Si esta es una a, pongamos, si esta es una a, 28, y esta es una z, 30, más grande que 28, 40,
00:24:30
Pues si hago esto menos esto, saldrá positivo
00:24:50
Y entonces, esto es mayor
00:24:54
Pues al revés, ¿no?
00:24:59
Debería ser
00:25:00
Eso, no sé si es TC menos OC o OC menos TC
00:25:01
Pero eso lo miramos, ¿vale?
00:25:05
Posiblemente es TC menos OC
00:25:07
Vamos a hacer una prueba
00:25:09
¿Así o al revés?
00:25:10
Vamos a probarlo
00:25:22
Main
00:25:23
Me hago un pequeño main aquí
00:25:24
De prueba, ¿vale?
00:25:26
donde me creo dos personas, le pregunto COMPARTOO y veo que pasa.
00:25:28
Ya está.
00:25:33
Entonces, persona1 es igual a new persona de AAA22.
00:25:34
Y persona2 es igual a new persona de BBB22.
00:25:43
Tanto esto no lo usa en el COMPARTOO.
00:25:52
Y ahora me pregunto, si eso, 1.2, ¿qué me debería dar? ¿Número positivo, negativo o cero?
00:25:54
Negativo, ¿no? Porque esto viene antes que esto.
00:26:12
Vamos a ver que sale, menos 1. ¡Perfecto!
00:26:17
Y si esto fuera el señor Z, perfecto.
00:26:21
Y si esto fuera el señor Z mayúscula, y esto fuera A, ¿qué opináis? ¿Funciona esto o no?
00:26:28
No sé si hay un caso en el que esto pueda funcionar.
00:27:05
Aquí tenemos mayúsculas y minúsculas. Si os acordáis, la mayúscula y la minúscula venían separadas.
00:27:24
Entonces el riesgo que tengo aquí, que me da un poquito de miedo, es que si uno pilla una mayúscula y uno una minúscula, pues no funcione.
00:27:28
Pero lo puedo solucionar.
00:27:35
cuando pillo el nombre lo pongo en minúscula entonces me da igual que sea mayúscula o
00:27:36
minúscula lo pongo en minúscula y luego lo comparo si no nos complicamos demasiado pero
00:27:53
la idea es esa vale efectivamente si luego ya aquí le pongo asterisco ya la cosa se complica
00:28:08
pero oye seguirá su orden lo pondrá antes o después pero seguirá los órdenes algunos
00:28:14
símbolos lo podrán antes, algunos símbolos
00:28:22
lo pondrán después, pero un orden está
00:28:24
por allí. ¿Sí? Que es el
00:28:26
ordenashi, al fin y al cabo.
00:28:28
¿Sí? ¿Os gusta esta
00:28:30
cosa? Claro,
00:28:34
fenomenal, porque
00:28:39
nosotros nos gusta
00:28:41
sufrir,
00:28:42
nos gusta
00:28:45
ser,
00:28:46
nos gusta reinventar la rueda
00:28:49
una y otra vez,
00:28:51
y otra vez, y otra vez,
00:28:53
y otra vez, y otra vez.
00:28:55
ya está porque si string implementa comparable qué solución nos parece mejor está o está se
00:28:57
entiende vale el concepto es este de aquí está bien como ejercicio para pensar es esta no es
00:29:36
esta esto es como ejercicio de pensar cómo lo puede hacer y es correcto esto lo hemos hecho
00:29:43
hecho de hecho a uno de los ejercicios que hemos hecho en pasado era de ver si una palabra venía
00:29:48
antes que la otra esto en octubre sí y más o menos lo hacíamos así esta es mi implementación
00:29:54
vale pero yo sé que string o debería que saber que string implementa con perol si no lo sé qué hago
00:30:01
lo busco
00:30:07
me voy aquí
00:30:10
string api
00:30:11
java 22
00:30:14
me voy a string
00:30:17
y voy a preguntarme
00:30:19
¿esto implementa? ¿qué implementa?
00:30:21
implementa comparable de string
00:30:24
o sea que ya se pueden comparar
00:30:25
dos strings y nosotros hemos dicho
00:30:27
que quiero comparar las personas
00:30:29
en base al nombre, por lo tanto
00:30:31
¿qué hago? pillo el nombre
00:30:33
de este objeto
00:30:35
y el nombre del objeto que estoy comparando
00:30:37
y comparo estas dos strings
00:30:39
y me quito de encima
00:30:42
de problemas de masada mayúsculas
00:30:43
masada mayúsculas, masada lo que sea
00:30:45
pues uso la forma con que
00:30:46
se comparan dos strings
00:30:49
ya lo han hecho ellos
00:30:51
¿sí?
00:30:53
entonces esto me dará
00:30:56
el número que me dará, ¿cómo está hecho esto
00:30:57
por debajo? no lo sé, pero sé que
00:30:59
me ordena lexicográficamente
00:31:01
¿sí?
00:31:03
¿Dudas? Fijaos en el momento en que este señor es comparable y ha implementado el compareTo, mágicamente mi error del sort que pasaba aquí ha desaparecido.
00:31:05
Porque ahora sort pilla un objeto list de un objeto que es comparable.
00:31:21
Y entonces lo puede comparar.
00:31:29
¿Vale?
00:31:32
Esto hace algo.
00:31:34
A ver.
00:31:36
Tenía Sara, Antonio y Luisa.
00:31:43
Y ahora tengo Antonio, Luisa y Sara.
00:31:45
Esto ya me lo he ordenado.
00:31:49
Lo que me hace pensar también que sort...
00:31:50
¿Qué hace sort?
00:31:52
Este método de aquí.
00:31:54
Ordena de menor a mayor, pero me crea una nueva colección y me la devuelve.
00:31:59
Esto está trabajando sobre la propia colección.
00:32:07
Yo no he hecho personas igual esta cosa de aquí
00:32:10
He hecho
00:32:13
Ordename persona
00:32:15
Y automáticamente personas se volverán
00:32:16
Cuidado
00:32:18
Porque si yo quería mantener la original
00:32:19
Ahora la he perdido
00:32:23
Ahora la tengo ordenada
00:32:24
Hacer una copia, ordenar la copia
00:32:25
Utilizar otro tipo de sort
00:32:33
Mirar si hay un sort ya hecho
00:32:35
Que devuelve la cosa
00:32:37
Fijaos también que
00:32:39
El sort, si no me equivoco
00:32:41
si devuelve algo
00:32:43
no, void
00:32:45
por lo tanto no
00:32:50
trabaja sobre esta cosa
00:32:55
entonces efectivamente
00:32:57
si quisiera mantener la original
00:32:59
pues lo que debería hacer posiblemente
00:33:01
es cambiar
00:33:03
el original
00:33:04
copiar el original, hacer una copia
00:33:06
hacer un clone, hacer algo
00:33:09
para copiar esta lista y luego ordenar
00:33:10
otra lista
00:33:13
si, dudas
00:33:14
¿cómo copio una lista?
00:33:17
si yo hiciera lista 2 y esta persona 2 es igual a personas ahora tengo dos listas tengo dos enlaces
00:33:30
al mismo objeto no he copiado nada que debería hacer es crearme una nueva lista o una nueva
00:33:48
lista de persona vacía hacerme un iterador sobre la vieja por cada objeto meterlo en la nueva y
00:34:01
ahora tengo una copia o me voy a mirar en lista donde estará esto está listo pero no collection
00:34:09
collection list list vamos a ver en list si por si acaso hay un método en lista que me permite copiar
00:34:26
todo esto como por ejemplo copy off copy off a lo mejor man hace algo devuelve una lista
00:34:33
inmodificable contenente los elementos de la colección ya dada es estático vale puedo hacer
00:34:45
list punto copy off de una colección y esto me dará una copia de esta colección y una vez que
00:34:50
tengo la copia una la ordenó en la otra la tengo por ejemplo ya que por aquí si buscáis un poco
00:34:56
métodos interesantes los hay si no os lo complementáis vosotros vale estamos
00:35:03
de acuerdo hasta aquí entonces tengo ordenar que pilla personas la ordena
00:35:12
fenomenal vale ahora tengo las personas ordenadas por nombre pero ahora de
00:35:21
repente no quiero ordenar por nombre quiero ordenar por edad porque me lo
00:35:26
pide el botón de la ventanita que ha pulsado el usuario y ha dicho ahora
00:35:37
Ahora no quiero que ordene por nombre.
00:35:42
Quiero que ordenes por la columna edad.
00:35:46
Entonces quiero ordenar por edad.
00:35:48
¿Por qué?
00:35:50
Le puedo poner una pantalla al usuario diciendo,
00:35:50
¿y por qué?
00:35:53
Pero ahora él tendrá sus razones.
00:35:54
O ordenárselo por nombre, diciendo,
00:35:58
por edad, por nombre, porque sí.
00:36:00
Pero los usuarios no suelen ser felices de eso.
00:36:02
Entonces, sí, mensaje.
00:36:06
System.org.pl en la vida no es justa.
00:36:10
Entonces, ahora yo quiero pillar esto, hacer que personas es igual a ordenar por edad personas, y ver qué pasa.
00:36:14
¿Sí? Y lo voy a hacer si hizo personas otra vez.
00:36:30
Entonces, este señor de aquí, de hecho, tened en cuenta que esto podría ser void.
00:36:37
Y podría ser que no lo guarde aquí.
00:36:44
Porque al fin y al cabo estoy trabajando sobre personas.
00:36:48
¿Lo veis?
00:36:52
Entonces lo hacemos void.
00:36:56
Como sort modifica esto que le paso, no hace falta guardarlo otra vez.
00:37:04
Ya se ha modificado.
00:37:10
Entonces, ahora tengo esto.
00:37:12
Es parecido.
00:37:15
Esto devuelve una lista, pero es la misma lista que me ha pasado.
00:37:17
Y este de aquí, en vez, trabaja directamente aquí arriba.
00:37:21
La pregunta es, vale, y ahora puedo hacer collection.sort esto.
00:37:25
¿Qué pasaría si yo hago esto otra vez?
00:37:34
Hace lo mismo.
00:37:38
Pues entonces podría ir a persona y decir, oye, no, a mi persona, no me compares por nombre.
00:37:39
Compárame por otra cosa.
00:37:46
Pero entonces también esto compararía para la otra cosa.
00:37:48
Entonces, ¿qué hago en una situación en la que existen objetos que tienen un orden natural, que es esto,
00:37:54
las personas, el orden natural de las personas que he decidido yo, es que se ordenan por nombre?
00:38:05
Podría haber puesto aquí también, y luego, si el nombre es igual, puedes ordenar también por edad.
00:38:14
No lo sé. Aquí la edad no la tienen consideración. Me da igual.
00:38:20
Pero esto es cómo se ordenan las personas. Las personas se ordenan por nombre.
00:38:23
Es su forma natural de ordenarse.
00:38:27
Pero ahora yo quiero ordenar estas personas con un criterio distinto.
00:38:30
¿Cómo lo hago?
00:38:36
Pues para hacer esto, y ahora lo hacemos de una forma un poquito fea,
00:38:42
Me crea un objeto
00:38:46
Que es un objeto
00:38:50
Orden
00:38:53
Por
00:38:57
Orden
00:38:58
Por
00:39:00
Edad
00:39:02
Y le digo que este señor
00:39:04
Implementa
00:39:09
Comparator
00:39:11
De persona
00:39:15
La persona me lo pillará
00:39:17
Porto
00:39:21
Y voy a mirar
00:39:25
Que método
00:39:28
Tengo que implementar
00:39:29
El método que tengo que implementar
00:39:31
Es un método
00:39:33
Que compara
00:39:35
Un objeto o uno
00:39:37
Con un objeto o dos
00:39:40
Siendo los dos objetos personas
00:39:41
O sea, es distinto del
00:39:43
Compertú
00:39:47
Compertú pilla un solo
00:39:48
Parámetro
00:39:51
Y compara
00:39:53
Un objeto
00:39:54
Con el objeto pasado por parámetro
00:39:56
La interfaz comparator implementa el método compare, no compare to, que pilla dos parámetros
00:39:59
Y es lo mismo, devuelve o uno, o sea, un número menor, desde que cero, si o uno es menor que o dos
00:40:13
Cero si son iguales y un número mayor si o uno es mayor que o dos
00:40:24
Pero esto me permite sostancialmente establecer otro criterio con el que comparo dos personas
00:40:31
Que por ejemplo en este caso es por edad
00:40:41
Entonces este de aquí lo que devolverá será o1.edad menos o2.edad
00:40:43
Si este tiene 10 años y este tiene 20 me dará un número negativo
00:40:52
Si tiene la misma edad me dará 0
00:40:58
si tengo este de aquí
00:41:01
que tiene 40 años y este tiene 20
00:41:04
me dará un número positivo
00:41:06
¿se entiende?
00:41:07
¿sí?
00:41:10
entonces, ¿ahora cómo uso esta cosa?
00:41:12
pues si vosotros vais a
00:41:17
el API, vuestro mejor amigo
00:41:19
y vais a collection
00:41:21
veréis que collection tiene sort
00:41:23
que pilla una lista
00:41:25
si yo uso esto
00:41:27
lo que se está utilizando
00:41:29
es el compare to
00:41:31
el comparable, pero existe también otro sort
00:41:33
que pilla dos parámetros, pilla una lista
00:41:38
y después un objeto de tipo comparator
00:41:41
y si tú me has dado un objeto
00:41:46
de tipo comparator, pues yo lo que hago es
00:41:49
hacer el sort, pero usando esto, o sea voy a
00:41:53
comparar los objetos usando el compare de estos dos objetos
00:41:57
no el COMPERTÚ, o sea que voy a ordenarlo según el criterio de ordenación que me has
00:42:01
dado en el COMPERTÚ. Vamos a verlo. ¿Cómo se usa? Pues esto se usaría más o menos
00:42:09
así. Cuando hago este sort de aquí, que es ordenar por edad, en realidad antes me
00:42:16
Creo un orden por edad e, o es igual a new orden por edad.
00:42:24
Me creo un objeto de tipo orden por edad que implementa comparator.
00:42:34
Entonces aquí le paso como segundo parámetro este objeto.
00:42:41
objeto. Él, dentro, podrá hacer orden.compare y poner aquí dos personas, la persona uno
00:42:51
y la persona dos. Entonces, utilizando este objeto, él puede hacer la comparación de
00:43:00
las personas que están en esta lista. Y entonces me ordena la lista, pero no en base a las
00:43:05
personas al nombre perdón más en base a este nuevo orden definido en este
00:43:14
objeto si dudas porque tú normalmente un objeto lo defines con un comparable y
00:43:21
normalmente cuando tú ordenas ese objeto es bastante común que tú lo ordenes
00:43:40
según el objeto mismo si el que ha desarrollado ese objeto ha decidido
00:43:46
ordenarlo de una determinada forma porque naturalmente se ordena de esta forma ahora
00:43:52
puede ser como por ejemplo un caso no esto que el usuario te diga si lo quiero por otro criterio
00:43:58
pues entonces tengo este modo de aquí y veamos si funciona tec fijaos este era el original esto
00:44:03
es ordenado de forma natural por nombre y este de aquí es ordenado con el nuevo criterio 24 40
00:44:15
45 y como lo sobre escribe para sobre escribir el compare tú necesitaría hacer otra clase que
00:44:26
herede de persona pero luego los objetos que tengo yo son personas no de la subclase tú tú
00:44:44
puedes sobreescribir cuando tienes una subclase
00:44:53
y sobreescribes el método de la superclase.
00:44:55
Entonces, si persona
00:44:58
tiene tu Compertú
00:44:59
y lo quieres sobreescribir,
00:45:01
tienes que crearte
00:45:03
persona ordenada por edad
00:45:04
y aquí sobreescribir
00:45:07
el caso. Pero luego los objetos que
00:45:09
tienes en la lista son objetos personas, ¿no?
00:45:11
Objetos personas ordenadas por edad.
00:45:13
Y entonces cuando tú llamarás el
00:45:15
Compertú, llamarás siempre el de persona.
00:45:17
Entonces no te funciona.
00:45:20
¿Dudas?
00:45:23
Vale, ahora, la cosa fea de esto, ¿sí?, es que nosotros nos estamos creando un objeto que no sirve de nada.
00:45:27
¿Cuándo vas a crear estos objetos de aquí? Nunca. Lo vas a crear cuando tienes que hacer este trabajo de aquí.
00:45:45
pero luego este objeto de aquí
00:45:55
no te sirve de nada, es como un objeto comodín
00:46:01
que necesitas pasarle aquí
00:46:03
porque él sabrá que dentro
00:46:05
de aquí está el método compare
00:46:07
que es el método que tiene que usar para comparar
00:46:09
las personas y ordenarlas
00:46:11
entonces vamos a hacer el último paso
00:46:13
al revés
00:46:18
porque ahora que he aprendido que
00:46:25
puedo cambiar el criterio como me da la gana
00:46:31
quiero un metodito que en vez de ordenarlo
00:46:33
de más joven a más viejo
00:46:34
hace de más viejo a más joven
00:46:36
¿sí? es otro criterio
00:46:38
entonces ahora tengo
00:46:40
este nuevo método de aquí
00:46:50
que lo que hace es utilizar
00:46:52
el coso
00:46:55
¿vale? entonces por como lo hemos
00:46:57
aprendido nosotros y por como lo podéis usar
00:46:59
vosotros tranquilamente
00:47:01
pues lo que hacéis es me crearía
00:47:02
otro objeto que es
00:47:05
orden por edad invertido
00:47:06
cambiar esto con esto
00:47:08
y ya está
00:47:11
justo
00:47:12
pero vamos a ver una cosilla
00:47:14
que os encontráis por allí
00:47:17
y que a lo mejor
00:47:18
os puede dar molestar
00:47:19
si la veis y no sabéis que es
00:47:23
aquí
00:47:25
que es donde pondría el objeto
00:47:27
nuevo
00:47:30
le digo new
00:47:31
comparator
00:47:33
de persona
00:47:37
persona. Y la sintaxis es un problema. Paréntesis y paréntesis. A ver si se ve todo. No se
00:47:38
ve todo. ¿Lo veis esta cosa maléfica y malvada aquí? Aquí lo que estoy haciendo es crear
00:47:57
un nuevo objeto, pero no estoy creando un objeto de algo que existe, mas estoy definiendo
00:48:11
la clase de este objeto
00:48:20
aquí dentro
00:48:21
esta se llama clase anónima
00:48:23
estoy creando
00:48:29
una nueva clase sin definir esa clase
00:48:31
y le estoy diciendo que es un new comparator
00:48:33
cuidado, que yo os había dicho
00:48:37
no se puede hacer un new de una
00:48:38
clase, de una interfaz
00:48:40
pero cuando lo haces así, sí
00:48:43
porque lo estás definiendo aquí
00:48:45
de hecho él se enfada porque dice
00:48:47
me falta saber
00:48:50
me dice, oye, mira, que le falta el método
00:48:52
porque para que sea un comparator, quiere decir que tiene que implementar
00:48:57
esta clase, que no sé cómo se llama, es una clase anónima, no tiene nombre
00:49:01
pero como tú me dices que es un tipo comparator, tiene que tener el método compare
00:49:05
¿dónde se lo pongo?
00:49:10
pues en su definición de clase, es decir, entre estos dos
00:49:13
estas dos llaves de aquí
00:49:17
entonces pincho aquí
00:49:19
y veis que me lo añade aquí dentro
00:49:22
o sea que ahora sin tener que crearme una clase extra
00:49:26
y luego crear un objeto de esto
00:49:30
le estoy diciendo, oye mira, tú ordename personas
00:49:32
y el criterio de ordenación te lo voy a definir aquí
00:49:35
usando una clase anónima
00:49:39
que implementa comparator
00:49:41
y que aquí es donde te defino
00:49:44
Pero, ¿cómo se compara? ¿Qué es? Hemos dicho al revés de esto. Esto me evita de crear una clase externa para hacer una cosa como esto que solo me sirve aquí.
00:49:46
Ahora, si yo esto lo uso 100 veces, en momentos distintos, pues cada vez tengo que volver a reescribir esto. Entonces a lo mejor me compensa escribirlo fuera, crearme un objeto solo de esto aquí y usarlo todas las veces que quiero.
00:50:10
Pero si lo uso solo aquí
00:50:24
Pues tengo esta opción de aquí
00:50:26
¿Por qué os hago ver esto?
00:50:28
Porque esto aparece
00:50:31
Si vosotros buscáis en
00:50:33
Stack Overflow
00:50:35
Si vosotros buscáis en
00:50:37
ChartGPT, como no
00:50:39
Es posible que la solución
00:50:40
Que os da sea esta
00:50:43
Y para que vosotros la entendáis
00:50:44
¿Quiero que la uséis?
00:50:46
Claro, si sabéis usarla, perfecto
00:50:48
Pero no va a restar ni a sumar puntos
00:50:50
hacerlo así o hacerlo así esto es estándar de como hemos visto de
00:50:52
implementar comparator etcétera etcétera por lo tanto esto lo tenéis que saber
00:51:00
hacer este de aquí si sois programadores más avanzados si queréis aplicar esta
00:51:04
nueva forma de definir las cosas quién soy
00:51:11
yo para para decir que no vale esto cuanto más aumenta la complejidad de lo
00:51:16
que vais a mirando los ejercicios más se empieza a parecer pero por ahora si no lo sabéis usar y
00:51:23
no queréis aprenderlo ningún problema y os lo digo para que si lo veáis si lo veis una cosa
00:51:30
así digáis oye qué es eso y vamos a ver si funciona pues ya está original ordenado por
00:51:36
nombre que es el short sin nada ordenado por de menor a mayor edad utilizando el objeto orden por
00:51:47
edad y este de aquí es el último que hemos hecho, que me lo ordena por edad descendiente
00:51:56
usando la clase anónima. Entonces, ¿para qué sirve la interfaz comparable? Para establecer
00:52:02
un orden estándar con el que se ordenan mis objetos. Muchas clases o muchos métodos pueden
00:52:30
requerer que yo
00:52:43
tenga establecido un orden
00:52:45
de mis objetos para poder ordenarlos
00:52:47
o para poder hacer algo como pillar
00:52:49
el menor. Si tú no me has definido
00:52:51
cómo se comparan dos objetos entre ellos
00:52:53
no te puedo pillar el menor.
00:52:55
¿Sí? ¿Make sense?
00:52:58
Una clase que
00:53:00
conocéis vosotros que entra en el examen
00:53:01
que necesita
00:53:03
comparable.
00:53:05
Que necesita que los objetos que usa
00:53:07
sean comparable.
00:53:09
Triset, por ejemplo.
00:53:13
TRIMAP, ¿sí? Todo lo que son TRI, como el árbol se construye en base a si este objeto que voy a insertar es mayor o menor,
00:53:15
pues necesitan, los objetos que manejo necesitan implementar COMPARABLE.
00:53:27
Entonces, ¿para qué sirve COMPARABLE? Para definir un orden estándar, un orden natural de mis objetos.
00:53:33
Y pertenecerá al mismo objeto, a la clase que define el objeto, persona, pues implementa su posibilidad de ser ordenado.
00:53:39
¿Para qué sirve la interfaz comparator?
00:53:49
Para establecer un criterio distinto del natural, de los estándar, para comparar dos objetos.
00:54:05
para establecer un criterio de comparación distinto del natural que ya está en la cosa, ¿vale?
00:54:11
Un ejemplo de utilizo es el sort, ¿vale?
00:54:24
El sort, si yo no le digo nada, me lo ordenará de forma natural.
00:54:27
Si yo le digo, ordénamelo según otro criterio, pasándole el criterio,
00:54:31
Sea porque me he hecho un objeto que implemente compare o comparator, o sea porque le implemento aquí directamente, hago una clase anónima poniéndole aquí el objeto comparator y la implementación del compare, pues me ordena según este otro criterio.
00:54:37
¿Dudas?
00:54:57
- 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:
- 5
- Fecha:
- 11 de febrero de 2025 - 12:38
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 55′ 05″
- 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:
- 219.00 MBytes