Queue - 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:
Voy a grabar esta clase, por lo tanto, si habláis me autorizáis a grabar vuestra voz, ¿vale?
00:00:00
Entonces, en las otras últimas clases hemos visto algo de estructuras dinámicas, ¿vale?
00:00:06
Estructuras que pueden aumentar o disminuir su tamaño sin que yo tenga que pensar en ello, ¿vale?
00:00:16
los pobres arrays que son una cosa que se utilizaba principalmente antes entre comillas
00:00:23
pues tenían este problema que eran siempre estáticos como tamaño entonces cuando tenía
00:00:30
que hacerlo más pequeño más grande tenía que no podía cambiar el array tenía que crear un
00:00:35
nuevo array y luego cambiar las referencias eso nos ha dado también una mano para entender un
00:00:40
poquito cómo funcionan las referencias vale si lo pensáis bien esto de que hay un método que
00:00:45
me hace una red más grande luego añade una cosa al final y luego me cambia el puntero al principio
00:00:51
a otro pues es una cosa interesante porque estoy utilizando las referencias estos elementos que
00:00:59
son fundamentales en la programación orientada a objetos vale en java es que a veces perdemos
00:01:04
de vista en el sentido de que no lo hemos pensado que no nos ha no lo hemos interiorizado pero que
00:01:16
tenéis que entender bien la diferencia entre una variable que contiene un valor y una variable que
00:01:26
contiene una referencia un objeto porque cambia completamente la forma con la que luego se
00:01:32
utilizan estas variantes vale entonces en la nueva ya hablamos pero la que vemos hoy un
00:01:38
poco más en detalle es la que o sea la coda vale la cola la cola es digamos una estructura que
00:01:47
implementa el concepto de fifo first in first out vale entonces en una lista son parecidas
00:01:57
De hecho una linked list hace también de queue, ningún problema. Simplemente lo que cambia son
00:02:04
los métodos que utilizo. Mientras en la lista yo puedo añadir, remover y puedo hasta añadir en el
00:02:12
medio o remover o pillar un elemento del medio, la cola tiene que implementar algunos métodos
00:02:18
que garantizan que el comportamiento es fijo. Entonces, yo por debajo puedo tener una lista,
00:02:27
un ArrayList o un LinkedList, pero lo quiero utilizar de una forma específica. No lo quiero
00:02:35
utilizar con... Sustantemente, me impido de utilizar los métodos como el de pillar un
00:02:44
elemento en el medio, de remover un elemento en el medio o añadir un elemento en el medio. Que
00:02:51
las listas permiten, pero la cura no tiene que permitir. Si yo me voy a la interfaz de Q, los métodos específicos
00:02:55
de la Q son de añadir al final y pillar desde el principio. Si yo hago una lista como la que
00:03:03
hicimos nosotros, porque la implementación que hicimos nosotros al final hacía funcionar la lista
00:03:11
prácticamente como una cola, porque nosotros cuando el get en realidad pillamos la posición,
00:03:16
aquí el getter no debería
00:03:24
tener una posición, es sólo
00:03:27
inserta y pilla
00:03:28
si tú insertas ya sabes
00:03:30
que vas a insertar al final de la cola
00:03:33
y pilla no tienes que especificarle
00:03:34
qué elemento pillar o qué elemento
00:03:36
en qué posición pillarlo
00:03:38
porque sabes que seguramente será el primero
00:03:40
de la cola
00:03:42
para garantizar que haga
00:03:43
¿me seguís?
00:03:46
¿sí? ¿dudas?
00:03:48
en fin, el primer elemento se elimina
00:03:53
primero, el último elemento se elimina por último. Los elementos se añaden a una fila de la coda,
00:03:55
pueden contener elementos duplicados. Otra cosa importante, como la lista, si yo añado dos veces
00:04:00
el mismo elemento, entonces se añade dos veces. El mismo elemento tanto considerado como igual
00:04:06
igual, o sea, si inserto literalmente el mismo objeto, como si inserto dos objetos que si lo
00:04:11
comparara con el equal se me daría true pero igualmente entran los dos
00:04:19
los principales operaciones son en colar o tener siguiente vale añadir a la cola
00:04:27
o pillar el siguiente estas son las dos operaciones que debería utilizar está
00:04:32
claro que si yo tengo una linked list por debajo vale y entonces podría
00:04:37
también funcionar como lista y a mitad de mi programa en vez de utilizar esto
00:04:44
dos métodos, uso el método que me pilla, el tercer elemento, pues entonces no estoy usando una POP.
00:04:49
¿Se entiende? ¿Cómo evito eso? Yo me voy a ver la API Java de QW. Si os fijáis, aquí los métodos que
00:04:56
tengo son add, element, offer, pick, poll y remove. Son estos. Si os fijáis, los remove, los poll,
00:05:20
los pick, no tienen un parámetro. Tú no puedes remover el primero, el tercero. Tú dices remueve
00:05:31
y él removerá el primero de la columna. Tú puedes decir añade un elemento, pero no puedes decir
00:05:42
en generalmente en tercera posición. Entonces, si yo voy a mirar una linked list,
00:05:49
veo que linked list que implementa Q, pero implementa también otras cosas,
00:06:03
tendrá las dos. Tendrá por un lado la add a secas, que lo añade a la final de la
00:06:17
lista, pero también tendrá el add en esta posición de este elemento.
00:06:24
Entonces, si yo en un código, vale, si yo en colecciones, hay ejemplos en colecciones,
00:06:32
Si yo tengo una clase, una clase red-blue, y aquí tengo un main, si yo hago linked list
00:07:15
de string. Lista. Alt. Es igual a new linked list de string. Así. Pues cuando yo hago
00:07:31
algo, punto, pues aquí me da la posibilidad de utilizar esto, el add de string, que sostancialmente
00:07:55
me añadiría una string al final de la lista, pero me da la posibilidad también de añadirlo
00:08:04
a nivel de segunda posición o tercera posición. Esto me daría como un marco de peligrosidad,
00:08:09
porque si me equivoco a usar el método, pues no lo estaría usando como una queue.
00:08:18
Entonces, ¿cómo podría evitar esto? Pues forzando que este señor sea una queue. Por debajo sigue
00:08:24
siendo una linked list y como linked list implementa queue, pues puedo usarlo como queue.
00:08:38
Pero ahora, si yo hago algo punto, solo me aparecen los métodos relacionados con la queue,
00:08:43
no con una linked list que estarán implementados en linked list pero ahora yo no tengo no tengo
00:08:52
el add de string en una cierta posición porque que uno lo tiene y su referencia no obstante su
00:09:01
instancia sea una linked list que es una queue y es también una list y es también otras cosas pues
00:09:07
yo les estoy diciendo sí pero tú considéramela como si fuera una call por lo tanto ahora no
00:09:13
tengo problemas de utilizarlo mal. Ahora no puedo insertar algo en posición 3 porque no tengo ese
00:09:18
método, no me lo permite. ¿Y cuando hagas un objeto dentro de esa lista, por ejemplo, ¿se va a crear con el constructor de cola o con el constructor de linterna?
00:09:26
No existe el constructor de cola porque Q es una interfaz.
00:09:47
No puede hacer un new queue, porque no existe queue.
00:09:55
Es una interfaz, no se puede hacer una, como si fuera una clase abstracta.
00:09:59
No puede hacer una new de queue.
00:10:04
O sea, hay que construir una interfaz, pero el intervicio sería una implementada.
00:10:05
Esta es una clase que implementa esta interfaz.
00:10:12
Por lo tanto, yo no puedo hacer new queue, porque no puede hacer una new de una interfaz.
00:10:17
pero así puede hacer una new linked list
00:10:22
ahora esto como objeto es una linked list
00:10:25
va a usar los métodos de linked list
00:10:28
pero si yo aquí le pongo linked list
00:10:29
él utilizará esta referencia
00:10:32
como un objeto de tipo
00:10:34
linked list, entonces me dará todos los métodos
00:10:36
posibles de linked list
00:10:38
si yo lo quería usar como una queue
00:10:39
me expongo al problema de que pueda
00:10:41
utilizar algún método que una cola
00:10:43
no podría
00:10:46
entonces con esto
00:10:46
en un cierto sentido protejo
00:10:49
voy a proteger esta cosa
00:10:51
diciendo, no, mira, cuando uso algo
00:10:54
voy a utilizar solo métodos de queue
00:10:56
¿podría utilizarlo en LinkedList?
00:10:58
sí, yo aquí puedo hacer un
00:11:00
downcasting a LinkedList tranquilamente
00:11:02
porque es un objeto de LinkedList y utilizar
00:11:04
su cosa, pero me estoy ayudando a mí
00:11:06
como programador, para evitar
00:11:08
de usar métodos que no debería
00:11:10
porque si los uso ya no es una cola
00:11:12
pues entonces digo, no, no
00:11:14
la llamo como una cola, sé que esto lo implementa
00:11:16
por lo tanto
00:11:18
todo lo que hace una cola lo puede hacer linked list podrá hacer también otras cosas más esas
00:11:20
cosas no la quiero usar para estar seguro que estoy utilizando algo pasado mañana además si
00:11:25
yo esto hago todas las cosas con el gato tranquilamente si mañana esto lo cambio con
00:11:31
una implementación distinta de cola pues me va a funcionar el resto del programa igualmente
00:11:42
porque no he hecho nunca referencia
00:11:48
a métodos específicos de linked list
00:11:51
siempre he hecho métodos específicos de queue
00:11:53
entonces cualquier clase
00:11:55
que implemente queue, incluida la
00:11:57
mía, o sea, si yo me hago una mía
00:11:59
clase, que se llama mi
00:12:01
no, se llama
00:12:02
my queue
00:12:04
entonces
00:12:05
la puedo poner aquí
00:12:10
si implementa queue
00:12:12
dudas
00:12:14
y el linked list
00:12:16
implementa queue y implementa list. Y si implementaría list, el add sería de list, no de list.
00:12:17
El add te daría igual porque queue lo tiene el add y también list tiene el add.
00:12:26
Pero no se guardaría de la forma, no se añadiría de la forma en que se añade un add.
00:12:37
Vamos a verlo. List ¿qué me dice? Cuando yo implemento el add de list me dice
00:12:41
appends the specified element to the end of the list. Entonces, en este caso tengo suerte porque
00:12:46
tanto lo que me dice la interfaz list como lo que me dice la interfaz queue coinciden. Es añadirla al final.
00:12:54
Tiene sentido, cuando tú añades una lista no la añades al principio, la añades al final. Luego, la lista te incluye
00:13:01
otras cosas que tú dices, no, yo lo puedo insertar al principio. Lo pones aquí. Si tú haces add 0 de un
00:13:07
elemento, pues lo añado al principio en vez que al final. Vale, fenomenal, pues hazlo como quieras. Pero el
00:13:16
add normal coincide con el otro. Entonces, yo implemento un add, en realidad lo estoy tirando de
00:13:22
dos lados, porque list me obliga a implementar add y también queue me obliga a implementar add.
00:13:28
Pero si te fijas, son el mismo idéntico método. Pillan los mismos variables, pillan las mismas
00:13:39
devuelven la misma variable, entonces, si tú lo implementas para list, lo estás implementando también para queue, y como hacen lo mismo, se añaden al final, todo es fin.
00:13:46
Pero si yo hago una cola con todos los elementos que implemento así, y el día de mañana yo ya no quiero que sea una cola, quiero que sea una lista, ¿es posible?
00:13:57
Depende. Esa es una refactorización del código.
00:14:11
¿Por qué no quieres que sea una cola y que sea una lista?
00:14:15
Claro que puedes. O sea, tú mañana entras aquí, aquí en vez de Q pones list y ahora
00:14:20
pregas, rezas, que no haya problemas.
00:14:31
Porque a lo mejor ahora has usado algunos métodos que en Q si existían, entonces lo
00:14:36
podías usar y que ahora en list ya no existen y por lo tanto ya no puedes usar. Por ejemplo el
00:14:43
pick. Si tú has usado pick por algún lado, pues ahora te explota porque te dice una lista no tiene pick.
00:14:48
Pero si tú tenías una juegue, tampoco. No la hemos visto antes. Ah, pero con esto. Lista. Porque esto de mirar
00:14:56
el primer elemento de la lista
00:15:15
es típico de una cola
00:15:19
¿vale? porque tú dices, oye mira
00:15:21
quiero ver cuál es el siguiente elemento
00:15:22
en base a eso hacer una cosa u otra
00:15:25
pero en una lista no
00:15:26
¿vale? no está pensado la lista
00:15:28
si tú quieres habrá otro método
00:15:31
para hacer eso ¿vale?
00:15:33
entonces, claro, si tú de repente
00:15:34
cambias, tienes un problema serio
00:15:37
de diseño, porque tú habías diseñado
00:15:39
para que fuera una queue
00:15:41
y ahora de repente es una list
00:15:43
por qué
00:15:45
no porque te ha dado la gana
00:15:46
porque has hecho un error en el diseño
00:15:49
has visto que las funcionalidades
00:15:51
que te daba la queue no eran
00:15:53
suficientes o no eran adaptas para
00:15:55
todo tu tipo de programa, pero has hecho un problema
00:15:57
tuyo, entonces ahora tienes que
00:15:59
dedicar tiempo en
00:16:00
pillar todo lo que has hecho
00:16:02
y transformarlo en una queue, se puede hacer
00:16:05
si yo quiero hacerlo todavía más
00:16:06
amplio, pues pongo collection
00:16:08
ahora por ejemplo, el collection pick no está
00:16:10
pero si yo uso los métodos
00:16:17
de collection, luego a mí me da
00:16:19
igual que tú uses aquí
00:16:22
una linked list, una queue, una list
00:16:23
lo que te da la gana
00:16:26
va a funcionar porque collection está por arriba de todos
00:16:27
y solo en los métodos
00:16:30
que he utilizado por collection lo voy a encontrar
00:16:34
en toda la lista, en todos los
00:16:35
pero no los propios
00:16:37
de list, no los propios de queue
00:16:39
de hecho collection
00:16:41
tiene un add, remove
00:16:43
y poco más
00:16:46
¿Sí? ¿Entiendes?
00:16:46
O sea, que esto es un poco jugar
00:16:50
con entender lo que yo
00:16:52
quiero y, no obstante,
00:16:54
yo tenga una implementación por debajo
00:16:56
que sea específica
00:16:58
de una cosa, pues luego aquí
00:17:00
la enmascaro en lo que yo
00:17:02
quiero de verdad para que funcione como yo quiero.
00:17:04
¿Vale? Podría dejarme
00:17:07
libertad.
00:17:08
Sí, yo podría poner aquí esto
00:17:10
y ahora
00:17:12
está a mi programador
00:17:14
Utilizar los métodos correctos
00:17:16
Para que sea una cola
00:17:18
O los métodos correctos para que sea una lista
00:17:19
Pero puedo usar los dos
00:17:22
¿Por qué?
00:17:25
LinkedIn List implementa las dos cosas
00:17:26
¿Vale?
00:17:28
Es como si hubiese perdido en un cierto sentido
00:17:29
La ayuda que me da él
00:17:32
A decir, oye mira me has dicho que tienes que ser FIFO
00:17:34
Vale, te garantizo yo que seas FIFO
00:17:36
Porque los métodos que te ponga a disposición
00:17:38
Solo funcionan FIFO
00:17:40
Ahora no, ahora tienes todos los métodos
00:17:41
Si te equivocas, problema tuyo. Has asumido tú la responsabilidad, pero muchas veces si yo he llegado aquí y he dicho, no, esto tiene que ser una cola, pues vale.
00:17:44
Entonces me evito problemas haciendo esto. Me ayuda a mí mismo. Ahora le he dicho al ordenador, oye, ayúdame que si intento yo hacer una cosa que no es buena para una Q, pues tú me avisarás diciendo, no, esto no lo puedes hacer.
00:17:54
Pero es peligroso, es un pequeño problema de diseño. No se programa sin saber que se tiene que hacer.
00:18:10
Es un mecanismo que hacemos nosotros porque estamos a un nivel muy bajo de pruebas, pero tú
00:18:33
normalmente la primera parte de un problema de un proyecto es el diseño tú piensas en lo que tiene
00:18:39
que hacer entonces mientras estás pensando sin haberlo implementado porque el cómo se hace es
00:18:44
distinto del que sea tú sabes que tienes un método que te hace esto un método que te hace y allí
00:18:50
piensa se dice soy mira estos datos de aquí viene en este orden tengo que mantener el orden por si
00:18:54
me viene bien el cifro pues entonces implementas esa por aquí a nivel de diseño que luego te das
00:19:00
cuenta que no que no que necesitabas otra cosa vale pero tiene que ser a nivel de diseño en el
00:19:06
momento en que quien ha hecho el diseño ya lo pasa a los programadores para que lo hagan pues
00:19:10
vosotros tenéis que hacer lo que ve allí tú lo que no puedes hacer es si tu jefe de comillas
00:19:15
el diseñador el design ha dicho esto tiene que ser un club pues le pongo linked list porque así
00:19:21
ve pues tienen que seguir las indicaciones que está o si tú eres el design te esperas que la
00:19:26
gente siga las indicaciones que te he prestado. Tú das poquitopi. Vale. También, vale, existe la
00:19:32
DEC. Creo que se pronuncia DEC. Vale, que es una Double Ended Queue. Una queue con dos finales.
00:19:44
Si me voy a ver DEC, es otra interfaz donde hay métodos, pero además de la ADD a secas,
00:19:53
que es la ADD de la cuba normalmente, tengo un ADD first y un ADD last. O sea que puedo acceder a
00:20:10
los dos extremos de la cola. Puedo añadir delante, añadir detrás, remover delante, remover detrás.
00:20:16
Puedo, es sustantivamente que fuera una cola que puedo recorrerla en los dos sentidos.
00:20:23
En determinados contextos, pues esto puede ser útil. Entonces, si os fijáis, es lo mismo que
00:20:28
antes, tiene la misma cosa, solo que añade un first y un last por cada cosa. Antes tenía pick,
00:20:42
ahora tengo pick first y pick last. Antes tenía poll, ahora tengo poll first y poll last. Pick
00:20:48
que es para mirar pero no lo quita paul lo mira el primer objeto y lo quita de la lista de la
00:20:55
pica mira el primer elemento en que a lo mejor se entiende mejor o sea este aquí añade un
00:21:11
elemento al final. Element retrieves but not removed. Vale? The head of the cue. O sea, me da un puntero al principio de la cola, pero sin quitarlo de la cola.
00:21:19
Offer, me dice, pick retrieves but does not remove the head of the cue. Sostancialmente igual a esto.
00:21:33
Ahora devuelve nulo si la Q es empty. Si la Q está vacía me devuelve nulo.
00:21:48
Este de aquí no lo sé qué hace. Por nulo es de QM. Es igual. No, este es por. Remove.
00:21:54
Si la cola está vacía, pues lanzo una infección. No sacio elemento externo.
00:22:06
¿Vale? La diferencia entre... No, perdón. Estoy mirando. ¿Dónde está el elemento? El elemento. Sí.
00:22:11
La diferencia entre Paul y Element es que Paul te da el primero y lo remueve, perdón, estamos viendo el pic, el elemento te recupera pero no lo remueve de la cola, la cabeza de la cola.
00:22:18
lo mismo, idéntico, peak, la diferencia es cuando es null. Si tú llamas element y la queue es empty,
00:22:41
o sea, no tiene elemento, te lanza una excepción. Entonces la puedes pillar con un try-catch.
00:22:53
Mientras que la peak te devuelve null. Siempre te devuelve algo, nunca explota, pero te devuelve null
00:22:57
si no hay una cabeza de la palabra. ¿Se entiende?
00:23:05
O sea, en el momento, si lo usas cuando hay algo dentro de ti.
00:23:10
No, puedes usar los dos cuando te dé la gana. Solo que reaccionas distinto cuando está vacío.
00:23:16
Este de aquí, si yo uso pic, yo haría ring primero.
00:23:24
Es igual a algo.pic, no lo he quitado de la pila. Y aquí debería hacer, si primero es null, haz algo.
00:23:37
Si no, haz otra cosa. Esta como se te dice a pic. Si uso element, nunca será null.
00:23:51
Porque no me devuelve nunca null. Lo que puede ser, pero hay que explote. Por lo tanto, lo uso así.
00:24:03
Trae la cosa aquí, captcha, no such element exception, aquí, no such element Q, vacía,
00:24:09
y aquí hago algo, si yo intento pillar el primero y lo que hace es explotar porque está
00:24:32
vacía y entonces no lo puede hacer, pues entrará aquí y haré lo que antes hacía
00:24:43
hay en el si es no dos formas son dos hacen lo mismo pero hay un comportamiento ligeramente
00:24:47
distinto que tú tú eliges cuál usar y vale de cara a una una una chica
00:24:55
vale la de que existe la situación esta es la que vale que hereda de
00:25:04
colección si es una interfaz vale la deck hereda de que vale y añade con las de esta cosa aquí vale
00:25:20
y hay varias implementaciones y yo quiero saber cuáles son las implementaciones de que aquí viene
00:25:33
todas las las implementaciones conocidas de esta clase o sea todas las clases que implementan esto
00:25:40
Esto es AbstractQueue, ArrayBlockingQueue, ArrayDeck, DaylightDeck, LinkedTransferQueue...
00:25:48
Todo eso son implementaciones de esta interfaz.
00:25:58
En particular nosotros usamos esta porque es la más fácil.
00:26:01
Sabemos que, por ejemplo, ArrayList no implementa Queue.
00:26:04
¿Hay una Queue basada sobre Arrays en vez que sobre objetos del linkador?
00:26:09
pues probablemente esta, la ArrayDec. La ArrayDec es una cola de doble fin, como Array.
00:26:16
Entonces si uso esta de aquí, por debajo estoy usando Arrays, y si uso esta de aquí, por debajo estoy usando
00:26:30
Enlazar, con las ventajas y desventajas que hemos visto de utilizar Array y utilizar objetos
00:26:34
en la sala.
00:26:39
Sí, también está Priority Queue,
00:26:41
por ejemplo, ¿vale?
00:26:43
Como ejemplos que vemos nosotros, están
00:26:44
por un lado una Priority Queue y por otro
00:26:47
lado la Raydeck, ¿vale?
00:26:49
La Raydeck es una implementación
00:26:50
de la DEC, también la Linked
00:26:53
List es una implementación de DEC,
00:26:55
entonces si tenéis que usar una DEC, podéis
00:26:57
usar estas dos cosas, ¿vale?
00:26:59
Y la Priority Queue es una implementación
00:27:01
de Queue con prioridad, una cola
00:27:03
con prioridad, que vosotros habéis visto, por ejemplo,
00:27:05
en
00:27:07
sistemas, ¿vale?
00:27:07
Los de procesos, de
00:27:11
gestionar
00:27:13
cuál proceso se ejecuta.
00:27:14
Pues probablemente esa es una cola
00:27:18
con prioridad, porque
00:27:19
tienen procesos con más prioridad que otros
00:27:21
y antes se ejecutan los que
00:27:23
tienen más prioridad. Cuando los de
00:27:25
más prioridad no hay ninguno, pues
00:27:27
se pasa a prioridad más baja. Si los de
00:27:29
bajos por mucho tiempo no
00:27:31
son ejecutados, pues
00:27:33
se le aumenta la prioridad para que antes o
00:27:35
Entonces, pues, esto es una forma de hacer el scheduling o no sé qué hacer, ¿sí?
00:27:37
Entonces, podemos ir a ver, ¿no?
00:27:45
Preview.
00:27:49
Esto molaría que vosotros, cuando hablamos de estas cosas, queue, Preview, ArrayList,
00:27:50
os vayáis aquí y os leáis estas cosas, ¿vale?
00:28:02
estas son informaciones técnicas que os describen qué es cada cosa, para que luego vosotros en un
00:28:06
futuro sepáis qué es cada cosa y sepáis dónde buscar la información que os suene. De esto una
00:28:12
vez lo he leído, estaba... Probablemente habrá una versión en castellano. Si no copiáis esto,
00:28:17
lo pegáis a ChatGPT o Gemini o whatever y le decís no traduces y ya está. Entonces,
00:28:23
Pues aquí tenéis los constructores, añadir, contains, iterator, es muy parecido, por algún
00:28:33
lado debería haber una prioridad, habría que leerlo bien.
00:28:43
Insert priority queue, es prácticamente como una queue, debería haber algo por algún
00:28:55
lado.
00:29:12
esto luego se basará sobre un orden, la Priority Queue asume que los objetos que tú le estás
00:29:13
poniendo dentro sean comparables entre ellos y entonces lo va a añadir pero no necesariamente
00:29:24
al principio, más lo va a añadir en la correcta prioridad.
00:29:39
Sí, es que sustancialmente es como si me ordenara esta bola en base a una prioridad que
00:29:45
le doy yo. ¿Cómo le doy la prioridad?
00:29:51
O por Natural Ordering, o sea, esto implementa Comparable y por lo tanto yo sé
00:29:53
cómo ordenarlos, o con un Comparator.
00:29:59
Ese Comparator pues lo veremos dentro de poco.
00:30:04
Si? dudas hasta aquí.
00:30:07
Trash and prevent queue no ordena los elementos de manera FIFO, vale?
00:30:12
Es un FIFO por orden, en este caso Fast In Fast Out va del más ordenado, del más importante,
00:30:21
del que tenga más prioridad.
00:30:32
Como se define la prioridad?
00:30:34
Con comparable.
00:30:36
Y entonces aquí vamos a ver lo que es la interfaz comparable.
00:30:37
La interfaz comparable, en realidad, ya la hemos visto, hemos jugado un poquito con ellos.
00:30:44
Es, sustancialmente, tú implementas comparable cuando quieres definir un orden natural de los objetos que estás creando.
00:30:50
Por ejemplo, los strings implementan comparable y su orden natural es alfabético, léxico-gráfico.
00:31:00
O sea que A viene antes de BBB y AB viene después de A, pero antes de BBB, ¿sí?
00:31:11
La orden natural de la cosa.
00:31:22
Los números, integer, ¿tienen una orden natural integer?
00:31:25
Ahora menor, A mayor, ¿vale?
00:31:32
Ahora, gato, ¿tienen una orden natural gato?
00:31:34
En principio no, ¿vale?
00:31:41
Pero yo puedo hacer que mi gato implemente un compareable, entonces estoy forzado a poner compare to,
00:31:44
y en este compare to definir cómo se ordenan los gatos, por tamaño, por nombre, por lo que sea, hasta con varios parámetros.
00:31:52
Yo podría decir, los gatos se ordenan por tamaño, y si dos tienen el mismo tamaño, pues por nombre.
00:32:04
y lo codifico yo
00:32:11
implementando este método aquí
00:32:14
¿sí? recordáis
00:32:16
este método aquí da un positivo
00:32:18
si el objeto actual
00:32:19
es mayor que el especificado
00:32:21
o sea que he pasado por parámetros
00:32:24
negativo si el objeto this
00:32:25
es menor que el otro
00:32:28
y el mismo es igual
00:32:29
tened en cuenta también que con per tu
00:32:31
tiene que ir de la manita con equals
00:32:33
¿sí?
00:32:36
en el sentido que
00:32:38
si dos
00:32:39
objetos dan
00:32:41
equals true, tienen
00:32:43
que dar con per tu
00:32:45
cero.
00:32:47
¿Vale?
00:32:51
Ahora, si
00:32:52
con per tu das
00:32:53
cero, no necesariamente
00:32:55
el equals tiene que ser
00:32:58
true.
00:32:59
Es una implicación en un sentido
00:33:01
solo. O sea,
00:33:03
equals
00:33:09
igual a true.
00:33:10
implica que COMPAR TÚ tenga que ser cero, pero COMPAR TÚ a cero no necesariamente implica que sea TRUE, ¿se entiende?
00:33:13
Yo tengo dos gatos, si me dices, estos dos gatos son iguales, claramente cuando los comparo me tiene que dar cero.
00:33:34
Pero si yo tengo dos gatos, que hemos dicho que lo mencionamos por la tamaña, y son dos gatos completamente distintos,
00:33:40
pero este gato aquí son tres kilos, este gato aquí son tres kilos también,
00:33:46
pues el Compertú me daría cero, porque no hay uno antes que el otro, porque en la Orden Natural me dirían que están igual,
00:33:50
pero no son el mismo elemento, entonces igual me daría falso.
00:33:58
Lo que yo tengo que comprobar es esta cosa de aquí, estar seguro de esto.
00:34:04
Cuando toco el COMPARE TO, tengo que estar seguro que esto valga, esto no, esto no lo tengo que comprobar porque puede ser o puede no ser, ¿sí?
00:34:09
Estas cosas van siempre, van un poquito de la manita.
00:34:23
Cuando yo toco COMPARE TO, voy a mirar también el EQUALS, cuando voy al EQUALS voy a mirar también el LASH CODE, van un poco todos en el mismo saco.
00:34:26
Cuando toco estas cosas, estaría bien que tocaran todas las cosas, ¿sí?
00:34:34
ejemplo de comparable, aquí tenemos persona
00:34:38
pues entonces tenemos un compareTo
00:34:43
a personaO
00:34:45
fijaos que comparable tiene un tipo genérico
00:34:46
si uso comparable a secca
00:34:48
pues esto sería un object
00:34:50
¿vale? sería esto
00:34:52
object
00:34:53
si pero yo digo que implementas
00:34:55
comparable y le pongo el específico
00:34:58
tipo genérico string o gato
00:35:00
o lo que sea, pues entonces
00:35:02
este object se me transforma en el objeto
00:35:04
de esta persona
00:35:06
Por ejemplo, aquí implemento comparable con tipo genérico persona, ¿lo veis?
00:35:07
Pues entonces aquí es compare to de persona.
00:35:13
Me evita de pillar un object y preguntarme, ¿es una persona?
00:35:16
Sí, si es una persona, haz un downcasting a persona.
00:35:19
Ya lo he hecho.
00:35:23
Entonces aquí, por ejemplo, es el resultado de cero.
00:35:25
Si this.edad es mayor que o.edad, el resultado es uno.
00:35:28
Si this.edad es mayor que o.edad es lo mismo. Esto debería ser al revés. Esto es un typo. Si
00:35:32
es mayor, dale 1. Si es menor, dale menos 1. Y si no retorna, que es a 0, entonces son la misma.
00:35:54
Esto, por ejemplo, está asumiendo que las personas se ordenan por edad.
00:36:01
Una vez que yo he definido que se puede ordenar por edad, por ejemplo, si uso una Priority
00:36:11
Queue, pues pondrá primero los niños y el último los viejos, a menos que no inverta
00:36:15
aquí uno y menos uno, y entonces me pondrá antes los viejos y luego los niños.
00:36:22
Dejamos los set para el siguiente.
00:36:33
- 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:
- 2
- Fecha:
- 11 de febrero de 2026 - 11:48
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 36′ 37″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 307.24 MBytes