Saltar navegación

2025-04-07-Programacion - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 7 de abril de 2025 por Jose Manuel M.

36 visualizaciones

Tema 9 - Colecciones y mapas

Descargar la transcripción

La semana pasada habíamos empezado ya, bueno hace dos en realidad, que tuvimos el problema con el audio, habíamos empezado a hablar ya de... 00:00:01
Bueno, ¿tenéis alguna pregunta que me queréis hacer antes de arrancar yo a contaros nuevas cosas? 00:00:08
Si no hay nada en particular, pues ya os digo, continúo un poco con el repaso de los contenidos del tema. 00:00:20
Si durante la clase os surge alguna cosita, pues ya me vais diciendo. 00:00:27
os estaba diciendo que hace un par de semanas 00:00:31
habíamos hecho ya un primer repaso del tema de colecciones 00:00:34
con las clases genéricas y colecciones 00:00:36
como no se grabó la semana pasada volvimos a reincidir en lo mismo 00:00:38
y nos hemos quedado a mitad de ver el temario 00:00:42
que contempla esta unidad 00:00:46
pues vamos a ir con ello 00:00:48
la semana que viene estamos en vacaciones 00:00:50
y luego incluso me parece que después 00:00:55
a la vuelta de Semana Santa creo que 00:00:58
volvemos un martes, con lo cual ese lunes tampoco 00:01:01
tendremos clase. Entre medias 00:01:02
durante Semana Santa abre 00:01:05
un tema. Igual la 00:01:06
planificación no la teníamos que haber hecho para que abriera 00:01:08
un tema en mitad de día lectivos. 00:01:11
O sea, de día no lectivos, pero bueno, 00:01:13
al fin y al cabo, en vuestro caso da un poco 00:01:15
igual, al ser a distancia. 00:01:17
Lo que yo creo que voy a hacer va a ser dejarlo abierto 00:01:19
el siguiente tema 00:01:20
pues justo durante esta semana para que lo 00:01:22
tengáis disponible desde el día uno de 00:01:24
las vacaciones de Semana Santa. 00:01:26
que, bueno, que están bien para descansar, pero si alguien tiene algún ratillo y le apetece mirar cosas, pues, bueno, que lo tenga ya el siguiente tema abierto. El siguiente tema trata sobre el flujo de datos. En cuanto a flujos de datos, hemos estado ya trabajando con algunos. Los flujos de datos se puede decir que son las vías de comunicación del programa con fuentes externas, pues, tanto para enviar datos del programa hacia afuera como para recibirlos. 00:01:28
y bueno pues con cuáles hemos trabajado principalmente pues con la lectura de teclado 00:01:53
y la salida a pantalla pues ya son dos flujos de datos y luego y luego aparte de estos dos flujos 00:01:59
de datos no sé si tenéis el micrófono abierto a alguien por ahí a lo mejor para que no se mezclen 00:02:05
los sonidos si no vais a participar ahora mejor silenciarlo y nada os decía que en cuanto a los 00:02:11
flujos de datos pues las comunicaciones de programa no sólo se realizan a través de teclado 00:02:18
y pantalla, que sí que es verdad que es una de las fuentes 00:02:23
de comunicación más habituales. También leemos de ficheros. 00:02:27
El año que viene trabajaréis mucho con conexiones con sockets en la asignatura 00:02:31
de programación de servicios y procesos. Bueno, pues diferentes caminos 00:02:35
para comunicar nuestra aplicación con otras fuentes 00:02:39
o con otra aplicación directamente. Entonces, todo esto son flujos de datos 00:02:43
y veremos los flujos de datos, pero en particular para la lectura de ficheros, 00:02:46
lectura y escritura. Pero bueno, no me adelanto porque eso 00:02:51
es el siguiente tema y ya tendremos las tutorías para trabajar 00:02:54
sobre eso. Retomando en la que 00:02:57
estamos ahora, que son las estructuras dinámicas de datos, pues habíamos 00:03:00
hablado de que teníamos dos tipos, las colecciones 00:03:03
y los mapas. Hemos estado trabajando 00:03:05
sobre las colecciones principalmente o 00:03:09
exclusivamente durante estas dos sesiones 00:03:12
y las colecciones, bueno, pues las 00:03:15
vamos a escribir aquí un poquito, aunque ahora lo borre, las colecciones eran aquellas 00:03:18
que almacenaban datos, el uso 00:03:22
de la memoria es dinámico, no como los arrays, una de las diferencias que teníamos 00:03:26
y almacenábamos datos que podían ser de diferentes tipos, o bien primitivos 00:03:30
datos primitivos, como enteros, aunque fueran a través de su, enteros 00:03:34
long, todos estos, aunque fueran a través de sus clases wrapper 00:03:38
o bien referenciados, pues objetos de clases que tengamos nosotros en el 00:03:42
programa como por ejemplo aquí la principal que hemos estado trabajando el otro día sobre ella 00:03:46
todos los datos que se guardan en una colección pues son del mismo tipo entonces en el momento 00:03:50
que definimos la colección entre el símbolo de mayor y menor decimos el tipo sobre el que va a 00:03:57
trabajar esa colección podría ser string o igual podría ser string como podría ser de tipo de 00:04:02
objetos de la clase principal. Acordaros que esto del símbolo menor y mayor tiene mucho que ver con 00:04:10
las clases genéricas. ¿Por qué? Porque en la librería de Java aquel código que trabaja con 00:04:19
las colecciones trabaja de forma genérica con los tipos de tal forma que el mismo código nos sirve 00:04:24
para cualquier tipo que queramos asociar a la colección con la que estemos trabajando. Y luego 00:04:30
dentro de las librerías tenemos diferentes tipos 00:04:35
de colecciones. Tenemos unas colecciones 00:04:39
que son las que llaman durante el tema listas 00:04:43
que son los ArrayList y los 00:04:48
LinkedHashCode 00:04:53
Esto yo creo. Bueno, pues estos dos 00:05:00
lo que permiten es almacenar tantos datos como 00:05:03
vayamos solicitando mediante los métodos que tenemos disponibles 00:05:06
para las colecciones, que la mayoría de ellos son comunes 00:05:10
para todas las colecciones porque todas ellas implementan un interfaz 00:05:14
que es el interfaz collection que nos define estos métodos que veíamos el otro día 00:05:18
y bueno, pues estos dos principalmente trabajan con colecciones 00:05:22
que permiten tanto duplicados, es decir, meter 00:05:26
varias veces el mismo dato y 00:05:30
no tienen un orden, orden en particular 00:05:34
y luego tenemos las que 00:05:37
podemos ordenar bajo un criterio que tengamos 00:05:42
nosotros definido en nuestro algoritmo, que son aquellas que aparecen como tree 00:05:46
como árbol, por ejemplo una tree set 00:05:49
como tiene la parte tree, está ordenado 00:05:53
por el concepto, por la parte tree 00:05:58
Y esta que tenemos tiene un orden en base a un criterio que definamos nosotros en el programa. 00:06:02
A un criterio definido como requisito para el programa. 00:06:12
Y luego las que aparecen en el set, que también está incluido aquí el set, 00:06:19
estas colecciones no tienen duplicados. 00:06:23
Bueno, en toda esta jugada, en esta distribución de la que estamos hablando, nos fijábamos, por ejemplo, en una colección de tipo triset y decíamos, si está ordenado y no tiene duplicados, en base a que el programa decide que algo está ordenado y no tiene duplicados. 00:06:26
parece más o menos evidente, por ejemplo, si estamos utilizando una colección 00:06:49
que sea de tipo integer, la clase gripper 00:06:54
del tipo primitivo int, pues parece que tiene 00:06:59
toda la lógica que el orden será de menor a mayor y que los duplicados 00:07:04
si intentamos meter un 7 dos veces, pues eso estaría 00:07:07
duplicado, pero el orden y la cuestión de duplicados 00:07:11
cuando empezamos a pensar en clases propias, como por ejemplo podría ser la clase 00:07:16
persona aquí. Resulta que esta clase de personas, según la hemos definido nosotros 00:07:19
en nuestro programa, porque así nos lo sugería, digamos el enunciado que pudiéramos 00:07:25
tener, tiene como atributos un nombre y una edad. 00:07:29
Entonces, en un programa resulta que las personas 00:07:34
podrían estar ordenadas por nombre, pero en otro a lo mejor nos interesa que estén 00:07:37
ordenadas por edad, o a lo mejor nos interesa que esté ordenado por edad 00:07:40
de forma descendente. Entonces, cuando las colecciones van a 00:07:44
vamos a utilizar una colección de tipo 00:07:48
tree que va a estar ordenado 00:07:51
según el criterio de personas y esto puede ser cambiante 00:07:53
aquel código que está en la librería de java 00:07:57
se tendrá que fijar en algo para ver cuál es ese criterio 00:07:59
como la clase personal estamos codificando 00:08:02
nosotros el criterio que va a utilizar para la ordenación 00:08:05
y a su vez para si es un triset 00:08:09
para que no haya duplicados va a ser el que definamos 00:08:12
tenemos dos opciones que el otro día trabajamos con 00:08:14
una. Sobre la clase que vamos a utilizar en la colección, en este caso triset, para ir almacenando 00:08:18
elementos, lo que podemos hacer, una de ellas es implementar el interfaz comparable. El interfaz 00:08:25
comparable nos obliga a meter el método compareTo. Entonces, desde aquel código que está en las 00:08:31
librerías, cuando vayamos añadiendo nuevas personas a la colección y quiera mirar a ver si ya están 00:08:37
duplicadas y quiera ir manteniendo un orden bajo un criterio 00:08:43
lo que hará desde la colección, aunque no seamos directamente conscientes 00:08:47
aunque sí que pusimos estas trazas y vimos que efectivamente hacía accesos este método 00:08:51
es buscarlo aquí en este método compareTo 00:08:55
que nos comparará en este caso las dos 00:08:58
personas con las que estamos trabajando para ordenarlas o para ver si están 00:09:03
duplicadas, una será aquel que esté llamando al método y la 00:09:07
segunda será aquella persona que reciba aquí como 00:09:11
atributo este método. Entonces fijaros como este atributo lo cargamos 00:09:15
que sea de tipo object para que sea genérico, lo hacemos un casting 00:09:19
a un objeto de clase persona y a partir de aquí comparamos este 00:09:23
que hemos recibido con this, que es el que está haciendo la llamada 00:09:27
al método. De esta comparación resulta que nos tiene que devolver 00:09:31
un entero que podrá ser cero si se consideran los dos iguales 00:09:35
en cuyo caso, si nos termina devolviendo el compareTo 00:09:39
un cero entre esas dos personas, si es un triset, ya no lo añadirá 00:09:43
porque se estaría considerando que es la misma persona 00:09:48
que igual en este compareTo hemos dicho que dos personas iguales son aquellas que tienen el mismo nombre 00:09:51
o aquellas que tienen la misma edad, aunque sean personas 00:09:55
diferentes en sí, objetos de personas diferentes 00:09:59
y si una es mayor que otra, devolverá un valor mayor que cero 00:10:02
y si la otra es la otra mayor que una pues un valor menor que cero no hay un menos uno por ejemplo 00:10:06
y esto lo que estoy moviendo el otro día para ver un poco más el desarrollo en profundidad 00:10:12
pues nada os invito a que veáis el vídeo del otro día y así avanzamos para seguir viendo cosas 00:10:18
Fijaros pensad que aquí en este programa donde estamos hablando de ver este call que tiene 00:10:25
este es anterior en este programa estábamos estamos considerando 00:10:33
por ejemplo, una colección de tipo triset de personas. 00:10:37
Aquí lo tenemos, de personas. 00:10:42
Y para ver si hay duplicados y ver el orden, 00:10:43
hemos dicho que hemos implementado el interfaz comparable 00:10:48
en la clase persona, de lo que estamos hablando. 00:10:52
Pero pensad que a lo mejor en este programa 00:10:56
y en todo el programa en su conjunto, 00:10:59
que podría tener más clases o incluso dentro de este mismo 00:11:01
método main de la clase principal, 00:11:03
Resulta que en un tramo me interesa tener una colección de objetos de la clase persona ordenados bajo el criterio que esté aquí, que parece que es la edad, ¿verdad? Y en caso de la misma edad, el nombre. Y resulta que en otro contexto de la ejecución del programa, también me interesa tener un triset de personas, pero justo en este caso no me interesa que estén ordenadas esa colección por la edad y luego por el nombre en caso de empate. 00:11:07
entonces si yo utilizo este criterio 00:11:35
el interfaz comparable 00:11:39
el único criterio por el que se ordenan las personas 00:11:42
en una, en dos o en veinte colecciones que tenga 00:11:45
será el que indica aquí en el compare tú 00:11:48
entonces si yo aquí, porque en una parte del programa me interesa ordenarlos 00:11:51
por edad, he puesto este criterio 00:11:54
como vimos que el otro día funcionaba razonablemente 00:11:56
en otra parte del código donde me interese también 00:11:59
en una colección de personas, objetos de esta misma clase, pero cuyo criterio sea el orden por nombre, pues ya no me valdrá. ¿Por qué? 00:12:03
Porque si vuelvo a utilizar el interfaz comparable, seguirá siendo exactamente este el criterio que utiliza, el que está en el método compareTo. 00:12:12
¿Cómo podemos resolver esto? Pues para identificar en un triset, por ejemplo, si los duplicados y el orden tenemos una segunda alternativa. 00:12:21
Esta segunda alternativa es la siguiente. 00:12:32
A ver en qué proyecto estamos, por aquí. 00:12:36
Este es el proyecto call, yo creo. 00:12:39
A ver, sí, aquí estamos. 00:12:41
Pues mirad, en lugar de hacerlo directamente sobre la clase persona, 00:12:46
tenemos la posibilidad de definir una nueva clase 00:12:50
que va a tener dedicación exclusiva a definir un criterio de orden, 00:12:52
en este caso, por ejemplo, entre personas, 00:12:59
entre objetos de la clase persona. 00:13:01
Entonces vamos a llamar, por ejemplo, a esta clase comparar. 00:13:03
estoy definiendo una nueva clase independiente de la clase persona 00:13:06
en esta clase comparar, lo que vamos a hacer va a ser implementar 00:13:09
un interfaz diferente, aquí implementamos en la clase persona 00:13:15
el interfaz comparable en uno de los criterios, pues aquí 00:13:19
vamos a implementar el interfaz comparator 00:13:23
java útil por aquí me dice que añada los métodos que no están 00:13:29
implementados y el interfaz comparator me obliga 00:13:38
a tener un método, el método compare. Fijaros, este método 00:13:43
si en la clase persona teníamos, recibíamos 00:13:46
en el compareTo un objeto que al final iba a ser una persona 00:13:52
que comparábamos este objeto en el compareTo 00:13:56
del interfaz comparable con el que estaba llamando al método compareTo 00:13:59
el otro objeto de la clase persona, aquí lo que recibimos son dos objetos. 00:14:03
Es decir, vamos a comparar dos objetos que estemos recibiendo por aquí. 00:14:08
entonces imaginaos que son dos objetos de la clase 00:14:11
persona, por ejemplo, para los que lo vamos a utilizar 00:14:16
pues ¿qué podemos hacer? Pues mirad, podemos coger y decir 00:14:20
fijaros que devuelve, el criterio de devolver es también un entero que será 00:14:23
cero, si ambos son iguales, un valor mayor que cero 00:14:27
si una de las personas es mayor que la otra y un valor menor que cero si lo es la otra 00:14:31
en este aspecto es la misma idea que antes 00:14:36
y lo que hacemos aquí es definir, definimos un objeto de la clase persona 00:14:39
per 1, una referencia 00:14:43
para hacer un casting a 1, que es uno de los dos 00:14:48
que estamos recibiendo, como lo recibimos con formato object 00:14:52
hacemos un casting a la persona y ponemos aquí a 1 00:14:55
las dos personas que vamos a comparar las hemos recibido 00:14:58
aquí como atributo, hacemos un casting al tipo 00:15:06
propio de lo que queremos comparar para no estar trabajando con 00:15:10
uno que en realidad es de tipo object. Y ahora vamos a poner aquí 00:15:14
int y result. Igual a cero. 00:15:19
Y aquí vamos a poner la variable que queremos 00:15:25
devolver. Y ahora aquí en medio vamos a ver 00:15:27
según el criterio con el que queramos comparar estas dos personas, vamos a 00:15:31
trabajarlo aquí entre medias. 00:15:35
mirad, las personas tenían por ejemplo edad, vamos a suponer que queremos hacer una comparación 00:15:37
de esas dos personas por edad, entonces digo 00:15:43
if per1, que es esta persona que he recibido aquí como parámetro 00:15:47
punto y edad, es mayor 00:15:56
que per2 punto y edad 00:15:59
pues entonces esta variable que es la que voy a devolver al final 00:16:03
voy a decir un 1. Esto indica que la primera 00:16:07
de las personas es mayor que la segunda. Devolver un valor mayor que 0. 00:16:11
El SIF es menor si es, este era 00:16:19
el caso si era mayor, pues si es menor uno que otro devuelvo un menos uno. 00:16:26
Y si no es ni mayor ni menor, pues quiere decir que es igual. Y como lo he inicializado 00:16:30
aquí a 0, no hace falta poner un SIF de igual. Si queréis 00:16:34
si alguien lo ve más claro, podríamos decir que si los SIF 00:16:38
Si son iguales, podríamos decir aquí que sea igual a cero. 00:16:42
Ya os digo que esto es innecesario, porque si no pasa por ninguna de estas dos, 00:16:49
pues lógicamente mantendrá el cero de aquí de la inicialización. 00:16:54
Voy a quitar. 00:16:58
Lo que estamos haciendo es comparar las dos personas de acuerdo a un criterio, que es la edad. 00:16:59
Bien, ya tenemos aquí el mecanismo para comparar a las dos personas. 00:17:06
¿Cómo lo estábamos haciendo hasta ahora? 00:17:09
considerando el interfaz comparable en principal, pues nada, directamente creamos el triset 00:17:11
y ya él iba cogiendo y iba llamando al compareTo del interfaz comparable. 00:17:20
¿Qué tenemos que hacer en caso de no querer considerar el comparable y utilizar este otro criterio? 00:17:26
Pues lo que podemos hacer aquí es crear un objeto de la clase comparar, 00:17:33
un objeto de la clase comparar, que es la que acabamos de 00:17:38
implementar aquí, de desarrollar aquí, que implementa 00:17:51
el interfaz comparator y en el método compare hemos dado el 00:17:55
criterio por el cual comparamos dos objetos que resultan ser 00:17:59
dos personas, ¿verdad? Y para asociarlo a la colección 00:18:03
lo que hacemos ahora es, en el triset 00:18:07
comento este del otro día, lo mantengo ahí, lo que hago es pasarle 00:18:10
este objeto de esta clase al constructor 00:18:16
que tenemos en el momento en el que creamos la colección. 00:18:18
Al pasarle, digamos, el constructor del triset está 00:18:23
sobrecargado. Por un lado tiene el constructor vacío y por otro 00:18:28
un constructor que permite recibir un 00:18:32
objeto de una clase, sea la que sea, con la condición 00:18:36
de que esté implementando esa clase el interfaz 00:18:40
comparator. Con lo cual, la ordenación 00:18:44
que vamos a tener de esta colección, mi ARCOL, que es de la clase 00:18:48
persona, en principio lo que buscamos es que tenga 00:18:51
en cuenta los criterios que habíamos puesto en este objeto, que es 00:18:57
un objeto de la clase comparar. Vamos a hacer una ejecución, tengo ahora mismo dudas, no recuerdo 00:19:01
muy bien si es necesario quitar la interfaz comparable en la clase 00:19:06
persona o aunque exista, no le importa porque al haberlo 00:19:10
al haber inicializado la colección 00:19:14
con este constructor, ya va a ir a tener este criterio. 00:19:18
En caso de que no sea así, pues le quitamos el... 00:19:22
Como estamos ahora apoyándonos en el interfaz 00:19:25
implementando el interfaz comparator, quitaríamos en ese caso el interfaz 00:19:28
comparable y con lo cual haríamos desaparecer este método. Pero yo creo que no es 00:19:33
necesario. El criterio que hemos puesto aquí ha sido de edad, ¿verdad? 00:19:37
pues vamos a ver si esta colección nos funciona de esta forma. 00:19:43
Vamos a poner, por ejemplo, primero, vamos a considerar que los dos objetos 00:19:50
que metemos en la colección tienen la misma edad. Esto hará que al tener la misma edad 00:19:54
los considere por esta interfaz como la misma persona. 00:19:58
Vamos a cambiar aquí para que solamente sea la edad. 00:20:03
El nombre de una sea August, el nombre de otra Miguel, y los dos con la misma edad. 00:20:06
Según este criterio, al ser los dos con la misma edad, no entraría 00:20:12
ni por el if ni por el else nos devolvería un 0 y que nos devuelva un 0 implica 00:20:16
mismo elemento como es set 00:20:20
al ser un triset es set, no admite duplicados, pues solamente 00:20:23
debería meter uno de los elementos, esto debería decirnos que solamente tiene un elemento 00:20:28
vamos a ver, fijaros como efectivamente nos dice 00:20:32
que tiene un solo elemento, si cogemos y le cambiamos y le ponemos aquí 21 00:20:38
para que tenga edad diferente, ya tiene dos elementos 00:20:44
es decir se está apoyando en éste para que no tengamos ninguna duda de que va por ahí vamos a 00:20:50
quitar a la clase persona esto y vamos a quitarle el método también pues si lo queremos retomar lo 00:20:58
que voy a hacer va a ser comentarlo mantengo una línea con un comentario ahí arriba y esto 00:21:09
ahora lo comentas la clase persona ya no tiene de aumentar más abajo yo creo aquí quizás a ver 00:21:18
la clase persona se quedará con los dos atributos solos y aún así el programa no sigue funcionando 00:21:38
porque ahora el tríceps en realidad utiliza la clase un objeto a la clase comparar no el compare 00:21:45
tú de la clase persona vamos a ver si sigue funcionando efectivamente vale pues como ahora 00:21:52
los datos son 21 y 20 fijaros pues el criterio en la edad pues ya me dice que tenemos dos elementos 00:21:58
Y además, observad cómo, a pesar de que he insertado primero mi PER que tiene la edad 21 y en segundo lugar mi PER2 que tiene la edad 20, a la hora de mostrármelos en este iterador, me muestra primero el del 20. ¿Por qué? Por el criterio de ordenación. 00:22:05
si aquí en comparar me vengo y le cambio 00:22:22
justo el criterio, le pongo aquí el menos uno y aquí el uno 00:22:25
al ejecutar, pues ahora el criterio de ordenación es 00:22:27
de mayor edad a menor edad y ya me dice 00:22:34
que August que tiene 21 es el primero de los elementos 00:22:37
que se encuentra en esta colección. Hasta aquí 00:22:40
si tenemos una única colección, pues bueno pues 00:22:44
de personas, pues nos valen 00:22:47
por igual los dos interfaces, como lo teníamos antes 00:22:51
así como lo teníamos ahora. En un caso, en el compare tú de la clase persona, 00:22:54
metemos el criterio de ordenación por edad y en otro caso 00:22:57
lo estamos definiendo en esta otra clase. 00:23:00
Pero la principal ventaja que tiene, 00:23:02
si os apetece hacerlo más con una clase extra, 00:23:05
es que podemos tener dos colecciones 00:23:11
de la clase persona en nuestro programa 00:23:13
que a lo mejor es necesario, con criterios de ordenación distintos. 00:23:16
Entonces, si cogemos y aquí definimos 00:23:23
una segunda clase, que llamamos, por ejemplo, comparar2, comparar2, ahí la tenemos, vamos 00:23:24
a hacer copy-pega de esto, aquí el import, tengo que decirle que implemente comparator 00:23:36
también, esta nueva, ahí lo tenemos, al implementar comparator en esta nueva clase 00:24:02
nos obliga a tener el método compare. Este es el criterio de orden de mayor a menor que 00:24:11
teníamos aquí pues mirad en esta colección vamos a volver a poner el orden de mayor a menor podríamos 00:24:18
poner cualquier otro criterio que estuviera que ver por ejemplo con el nombre de la persona a la 00:24:25
hora de ordenarlo aquí por código definirse el que sea esta colección decimos que se base la 00:24:29
ordenación en este objeto que es de la clase comparar con lo cual aquí estamos manteniendo 00:24:38
el criterio de orden de mayor a menor por edad y ahora lo que vamos a hacer aquí abajo vamos a 00:24:42
voy a hacer copy-pega y ahora vamos haciendo los cambios oportunos 00:24:56
para que vaya más rápido. Digo, quiero definir un objeto de la clase 00:25:00
comparar2 que sea mi.com.2, que es esta otra, a la cual 00:25:04
os recuerdo que le hemos dado la vuelta a estos números para que la forma de ordenación 00:25:12
siga siendo por edad, que ya os digo, podría ser otro criterio, pero en este caso 00:25:16
comparar2 ordena de menor a mayor, comparar1 de mayor a menor. 00:25:20
El menos uno está aquí en este caso y el menos uno aquí en este otro. 00:25:25
creo un objeto, creo una colección diferente en mi programa 00:25:28
que también es de la clase persona, si estuviéramos utilizando 00:25:35
la forma de ordenación a través de 00:25:38
el interfaz comparable aquí, no tendríamos opción de ordenar de dos formas porque este 00:25:43
método en toda la clase persona es único, el compare tú 00:25:47
pero aquí sí que a cada una de las dos colecciones le vamos a dar 00:25:50
un criterio diferente, a pesar de que las dos colecciones son 00:25:54
de la clase persona. Bueno, pues 00:25:59
a esta nueva colección le volvemos a meter los dos 00:26:05
mismos elementos, si os parece, por no andar perdiendo mucho 00:26:08
el tiempo. MiPer y MiPer2, que son 00:26:11
los dos objetos que habíamos dado de alta aquí, 00:26:14
hemos metido información aquí, aquí se lo añadimos a una colección 00:26:17
y aquí se lo estamos añadiendo ahora a la segunda colección. 00:26:21
Fijaros el 2. Creamos un iterador 00:26:24
para mostrar los datos, no sobre la primera colección, 00:26:31
sino sobre la segunda, y ya lo tenemos, entonces si ejecutamos ahora, voy a meter aquí algo que 00:26:34
nos claramente nos separe la información de una colección y la de otra, vamos a meter aquí unos 00:26:50
asteriscos por ejemplo, entonces si ejecutamos, a ver qué he hecho, bueno me falta aquí modificar 00:26:58
ese dato, ahí estamos, ejecutamos 00:27:15
y aquí lo tenemos. Los datos son los mismos porque hemos metido los dos 00:27:20
mismos objetos, pero fijaros como esta nos ha mostrado la 00:27:25
ordenación de los elementos de mayor a menor edad y esta 00:27:28
de menor a mayor, que es justo los criterios que hemos puesto por aquí. 00:27:33
Bueno, pues esta otra técnica tenemos para los trisets. 00:27:39
No sé si hay alguna pregunta por ahí y si no, pues a lo sigo contando 00:27:46
más cosas. Dentro de las colecciones 00:27:53
tenemos, estamos hablando ahora de cómo 00:27:57
podemos trabajar con los trisets, que 00:28:01
decimos que tienen orden y no permiten duplicados, habíamos hablado de 00:28:05
luego después os hago un comentario más sobre los ArrayList o los 00:28:09
LinkedList, que lo que tienen, permiten duplicados 00:28:13
y no tienen un orden, al menos con criterio propio en el 00:28:18
programa, pero luego tenemos otras colecciones que son los set, pero que no son tree, es decir, no están 00:28:21
ordenados, pero no permiten duplicados. Por ejemplo, en este caso podríamos hablar de los, a ver, 00:28:28
de cuáles, por ejemplo, de los linked set, como son, no recuerdo cómo son estas, de los hash set, por ejemplo. 00:28:36
Estas colecciones, las colecciones Haset, que también las tenemos disponibles en las colecciones de Java, aquí tenemos uno de ellos. 00:28:49
Fijaros cómo no permite duplicados, pero al no tener el tree, no tiene una ordenación en particular. Si no tiene una ordenación en particular, aunque solo sea por nombre, no parece que tenga mucho sentido que sea el interfaz implement comparable que tiene el compare to el que nos permita hacer las comprobaciones de los duplicados. 00:28:58
duplicados. ¿Qué utilizan los set que no están ordenados? 00:29:17
Pues utilizan otros métodos diferentes. 00:29:21
Vamos a hacer un, para verlo por código, voy a comentar todo esto, 00:29:31
luego voy cogiendo código si lo necesito. Vamos a hacer, por ejemplo, un 00:29:40
has set de personas. Cada nueva persona cañada 00:29:43
habrá que comprobar si ya existe en la colección, 00:30:02
bueno, habrá que comprobar, la colección comprueba si ya existe en la colección 00:30:06
para evitar que haya duplicados. No le preocupa el orden 00:30:10
porque no es un tree, pero sí que es un conjunto, no nos permite 00:30:14
duplicados. Entonces, si tenemos aquí dos personas 00:30:18
damos de alta las dos personas de antes 00:30:22
podríamos coger y decir, bien, añado 00:30:26
una persona y otra, y luego miro el 00:30:36
tamaño que tiene la colección 00:30:49
y ejecutándolo así de primeras, pues me dice que hay dos elementos 00:30:53
en la colección. Pero según mi enunciado 00:30:58
podríamos tener un criterio para decir, oye, estas dos personas son iguales 00:31:02
si tienen la misma edad. Si, un enunciado será 00:31:07
si tienen el mismo nombre. Solamente son iguales si tienen 00:31:11
la misma edad y a la vez tienen el mismo nombre. Bueno, pues todo ese criterio 00:31:15
igual que antes hacíamos en el compare tool, lo podemos programar nosotros por código 00:31:18
y qué métodos son los que se utilizan para los set que no son tres y para los conjuntos que no 00:31:23
están ordenados pues en la clase persona igual que antes para los tres utilizábamos el compare 00:31:29
tú en este caso son otros dos métodos los con los que se trabajan que son una combinación del 00:31:35
public int hashCode y otra una combinación de estos dos métodos y otra el public boolean equals 00:31:42
que recibe un parámetro del tipo object combinando estas dos estos dos métodos el hashCode estos dos 00:32:06
métodos son luego ponemos un system out de una colección que sea por ejemplo un hashSet son los 00:32:24
que la colección desde aquel código que está en las librerías consultará para determinar si, ya que es una colección tipo set, esos dos objetos son duplicados. 00:32:29
Como son dos métodos de la clase persona, estará comparando en particular el método, el equals, porque del Hasco de ahora os voy a decir que en principio vamos a olvidarnos un poco, 00:32:39
mirará este objeto con el objeto 00:32:50
del que está haciendo la llamada. Para centralizar 00:32:56
todo en un solo método, lo que podemos hacer es directamente 00:32:59
el hashCode decir que el return 0, ya está. 00:33:03
Vamos a poner un system out aquí para luego ver que efectivamente va pasando en las comprobaciones 00:33:07
por este método, pero digamos que de esta forma nos olvidamos 00:33:12
de cualquier codificación aquí. Y todo el criterio de comparación lo podemos poner 00:33:23
aquí. Para esto lo que hacemos es, igual que antes en el compareTo, pues decimos 00:33:27
persona, mi per 00:33:31
o per aus, vamos a poner que sea igual, hacemos un casting 00:33:34
de persona del atributo que estamos recibiendo como parámetro 00:33:40
y ahora aquí hacemos la comparación que nos interesa 00:33:47
que nos interese para nuestro programa 00:33:52
la comparación que nos interese para determinar si la persona que está llamando al método 00:33:55
y la que ha recibido como parámetros son iguales. 00:34:04
Y en base a esto, la colección añadirá o no añadirá el método 00:34:07
porque al ser un set solamente lo hará en caso de que sean diferentes. 00:34:11
Como estábamos diciendo que tenga la misma edad, 00:34:15
pues podríamos decir id, sí. 00:34:17
Dis yo mi edad es igual a la edad de la persona 00:34:20
que estoy recibiendo como parámetro aquí, 00:34:26
per aus punto y edad, si es igual, 00:34:35
lo vamos a iniciar a falso, falso significa 00:34:39
no son iguales y en caso de que sea igual 00:34:53
lo ponemos a true 00:34:56
y ahora devolvemos bReturn 00:35:00
si cuando se llame a este método se determina 00:35:03
que la persona que estamos recibiendo como parámetro 00:35:08
comparándola con la persona actual bajo el criterio 00:35:11
de que sea la misma edad porque nuestro enunciado en este ejercicio 00:35:15
es el criterio que hemos tenido para que dos personas sean iguales 00:35:18
así es, lo que hago es poner la variable bReturn a true 00:35:20
para que nos devuelva true, indicador de que ambas dos son iguales 00:35:23
si no entra por aquí, pues tendremos el valor en bReturn 00:35:27
de la inicialización que es falso y nos estará devolviendo falso, es decir, son diferentes 00:35:32
para ver también que pasa por ahí cuando está haciendo 00:35:36
este criterio, vamos a poner que nos pasa equals 00:35:40
vamos a ponerlo aquí para que nos haga el mensaje de tanto cuando son iguales 00:35:51
como cuando no, que ha pasado por ahí 00:35:59
pues ya está, igual que antes el compareTool 00:36:00
el que utilizábamos en el triset, pues ahora son estas dos 00:36:05
esta la fijamos para que no tenga 00:36:07
trascendencia a la hora de hacer la comparación 00:36:10
entre las dos personas y en este caso es donde metemos el código 00:36:14
según la lógica que nos interese programar 00:36:16
entonces fijaros, aquí estamos añadiendo dos personas 00:36:19
en un hashSet, es previsible 00:36:25
que se vaya a fijar precisamente en estos métodos para determinar 00:36:28
si son iguales, vamos a hacer una ejecución a ver qué pasa. 00:36:32
Si hacemos una primera ejecución con edades diferentes, 00:36:35
como el criterio que hemos puesto para que las personas sean iguales, 00:36:38
tendría que añadir los dos. 00:36:41
Y fijaros cómo, aunque nosotros no tenemos aquí llamadas 00:36:45
a esos métodos, nos salen las trazas que hemos puesto aquí 00:36:48
porque desde el código que tenemos en las librerías 00:36:52
para el HashCode se apoyan estos métodos 00:36:58
para hacer esas comprobaciones. 00:37:01
Y si cogemos y decimos que las dos personas sean iguales, 00:37:04
fijaros como ahora efectivamente solamente añade una 00:37:06
porque el criterio que hemos programado en esos métodos es 00:37:11
que tengan la misma edad para que estén repetidos 00:37:15
en otro ejercicio, bueno pues si el criterio que fuésemos a considerar 00:37:18
fuese que dos personas con el mismo nombre 00:37:24
son aquellas que son iguales, pues lo que tendríamos que hacer 00:37:26
si vamos a utilizar un hashSet 00:37:30
sería en la clase persona aquí programar 00:37:32
para que devuelva verdadero o falso 00:37:35
en el caso en que los nombres sean iguales, simplemente 00:37:37
no voy a incidir mucho en esto porque 00:37:41
creo que ya más o menos lo sabréis hacer, pero lo único que 00:37:43
cuidado que los nombres no los podemos comparar de esta forma 00:37:50
con el igual igual los nombres hay que compararlos con 00:37:54
punto compareTo, fijaros el método compareTo 00:38:00
y aquí pondríamos 00:38:05
miper 00:38:09
peraus 00:38:12
Ah, bueno, con el equals también, sí 00:38:14
Sí, sí, vale 00:38:27
Si lo hacemos así, de hecho es más directo el equals 00:38:28
Me preguntan que 00:38:32
para la grabación si con el equals se puede comparar 00:38:33
porque esto devolvería un valor 00:38:35
numérico 0, 1, menos 1 00:38:37
Este, para que se convierta en boolean, habría que 00:38:39
hacer esto 00:38:41
Y en cambio con el equals fue mucho mejor, la verdad 00:38:42
En ese caso 00:38:45
pero el equals de la clase string 00:38:47
porque esto es un string, entonces podríamos 00:38:50
equals y aquí le diríamos 00:38:52
peraus y bueno pues aquí 00:39:05
esta sería la forma de comparar dos strings 00:39:20
el equals este nos devolvería verdadero o falso si los dos 00:39:22
strings son iguales, esto sería otra forma la verdad 00:39:26
si el compare tú las dos son iguales nos devuelve cero 00:39:28
pero este nos da más información que en este caso no necesitamos 00:39:31
si hay alguna duda para los set 00:39:35
Bueno, pues si no tenéis más dudas, os sigo contando más cosas. 00:39:42
Mirad, otro tipo de datos que, voy a seguir comentando por aquí, 00:39:57
otra estructura de datos que se da típicamente en la algoritmia 00:40:03
son las pilas y las colas. 00:40:09
¿Una pila qué es? 00:40:16
Pues siempre se comenta, se pone el ejemplo de una pila de platos cuando estamos, si no hemos puesto el lavavajillas porque lo tenemos averiado y tenemos que fregar los platos ahí a mano, pues según vamos cogiendo cada uno de los platos, lo ponemos encima, después de lavarlo, lo ponemos encima del fregadero, ¿no hay? O encima de la encimera. 00:40:17
el segundo plato va encima del primero, el tercero va encima 00:40:38
del segundo y así, vamos haciendo una pila de platos 00:40:42
cuando lo vamos a recoger, a no ser que queramos correr el riesgo 00:40:46
de que se nos rompa a todos, ¿qué es lo que hacemos? Pues el primero que cogemos es 00:40:51
el último que hemos puesto, que es el que está arriba del todo, el segundo que cogemos, para ya guardarlo 00:40:54
ahí en el cajón, el segundo que cogemos es el penúltimo que pusimos 00:40:59
entonces, las pilas 00:41:03
son estructura de datos 00:41:07
como se llaman, LIFO 00:41:10
LIFO, LAST 00:41:11
último en entrar, LAST INPUT 00:41:14
FIRST primero en salir, son estructuras 00:41:16
LIFO 00:41:18
y luego las colas 00:41:18
pues estas son cuando vamos a comprar 00:41:21
a la carnicería 00:41:28
si no hay alguno con un poquito más cara 00:41:30
o que lleva más prisa y pide permiso 00:41:32
lo normal es que el primero que llega 00:41:34
es el primero que se atiende 00:41:36
y llegas tú allí, coges tu 00:41:38
número y tienes el número 1 y llega otro, coge el número 2, otro el número 3, 00:41:40
pues cuando el carnicero quiere atender a uno, dice el número 1, el primero que llegó, 00:41:45
es el primero que atiende. Al contrario que en las pilas, que el último que llega es el primero que 00:41:48
es atendido. Esas estructuras son las FIFO. Entonces, 00:41:52
estas dos estructuras se dan en la algoritmia 00:41:56
muy habitualmente y podemos trabajar con 00:41:59
colecciones de datos un poco bajo este 00:42:04
criterio. ¿Qué colección de datos tiene métodos que nos permiten trabajar con este criterio de 00:42:08
pilas o de colas? Pues la LinkedList. Vamos a hacer una LinkedList, por ejemplo, enteros, integer. 00:42:14
La LinkedList, fijaros, son colecciones que no son ni tree ni set, es decir, admiten duplicados y en 00:42:43
principio no tiene una ordenación especial una colección linkedin leads pues tendrá el método 00:42:50
add como todas las colecciones que le viene heredado de colección pero la link el dis además 00:42:59
como se pueden comportar como en su código que a lo mejor no la tienen todas las colecciones ya que 00:43:06
no todas soportan el concepto de pilas y colas si vamos a hacer primero vamos a trabajar primero con 00:43:14
una con una pila vamos a ver la pila pues las pilas tienen el método push el método push es 00:43:23
el que nos permite ir apilando los elementos es decir saco del fregadero el plato que acabo de 00:43:34
limpiar y lo pongo sobre la encimera. Poner el plato 00:43:41
sobre la encimera es hacer un push. El segundo plato haría un segundo push 00:43:45
que lo pondría sobre el primero. Es decir, va guardando en la colección 00:43:49
los datos bajo el criterio de una 00:43:54
pila. Después, como hemos hecho 00:43:58
una linked list de integers, podría ser de cualquier tipo, igual que estamos 00:44:00
viendo en las colecciones, vamos a poner, por ejemplo, que almacenamos 00:44:05
el dato 4, el siguiente 00:44:09
vamos a poner que anotamos el 6, el siguiente el 2 00:44:14
estamos guardando la información en esta colección 00:44:21
que en particular es de elementos integer, podría ser de cualquier 00:44:26
otro y como queremos hacerlo bajo el criterio de pila 00:44:30
utilizamos el método push de la colección linked list 00:44:34
para recuperar los datos 00:44:39
es decir, ir cogiendo los platos y supuestamente el primero que tendrá que coger, ya que las pilas tienen un criterio LIFO, Last Input, First Output, el último que entra es el primero que sale, si se comporta de verdad bajo el criterio de LIFO, el primero que debería salir sería este el 2, el segundo el 6 y el tercero el 4. 00:44:42
¿Cómo podemos ir recuperando los datos? Pues con el método pop. Este método pop me devolverá un elemento de este tipo, que es el que tiene la colección, y si sigue el comportamiento de pila, tendría que ser el último elemento que hemos metido, que por la secuencia aquí de inserción de elementos sería el 2. 00:45:05
si lo que me devuelve lo voy a meter en un system.println 00:45:30
para de verdad comprobar que se comporta como 00:45:35
una pila, decimos que el método 00:45:39
pop, vamos a sacar un primer elemento y vamos a sacar 00:45:46
un segundo, el primer elemento debería sacarnos este, el segundo 00:45:52
debería sacarnos el 6, hacemos una ejecución 00:45:55
veis el primero que saca es el 2 00:45:58
y el segundo el 6, si saco un tercer 00:46:01
elemento, pues cuál sería, pues el siguiente elemento que tenemos 00:46:05
aquí el 4, 2, 6 y 4. Su comportamiento es como una pila. Sí, os cuento justo esto. Ahora, ¿en qué situación podemos trabajar con una pila? Pues bueno, podemos trabajar con una pila según nos lo demande el ejercicio. 00:46:11
Ahora tenemos una herramienta más ahí en la mochila, que es poder trabajar con pilas de elementos, en este caso, cuyo tipo es integer y en otro caso podría ser de otro tipo. 00:46:34
bueno, preguntabais que si en el momento 00:46:46
que se pierde de la pila el dato, se pierde de la pila si utilizamos el método 00:46:51
pop, si queremos trabajar con el elemento 00:46:55
que toca en la pila, pero que no se pierda de ahí 00:46:59
la colección linked list nos ofrece 00:47:02
otro método diferente que es el system 00:47:07
que es el system.out, no, este lo pongo para que lo podamos ver 00:47:10
por pantalla mi colet punto pic pic nos recupera el elemento que tenemos arriba del todo en la 00:47:15
pila pero no lo elimina de la no lo elimina de tal forma que si por ejemplo aquí cogemos vamos 00:47:26
a poner el pic aquí qué comportamiento sería el previsible del programa ahora lo comprobamos 00:47:35
Aquí hacemos un pop, nos cogerá el último elemento. Como es un pop, este elemento lo eliminará de la pila y se vendrá aquí. En este caso hacemos un pick. Este pick, al tener ahora mismo el dedito que apunta a la pila en el 6, nos devolverá un 6, pero al ser un pick y no ser un pop, no elimina el 6. 00:47:42
con lo cual aquí es previsible que nos muestre 00:48:07
el 6 y luego este pop es previsible 00:48:09
que nos vuelva a mostrar el 6 y este siguiente 00:48:11
pop que nos muestre ya el 4 00:48:13
eso es lo que yo creo que debería 00:48:15
pasar, vamos a hacer una ejecución y comprobamos 00:48:17
mirad, primero nos saca 00:48:19
este system out, el dato 00:48:23
que recogemos de aquí, que es un 2 00:48:25
el 2, el último que había entrado 00:48:27
el pick 00:48:29
recupera el siguiente, donde está 00:48:31
apuntando ahora el indicador en la pila 00:48:33
que es el 6, pero no avanza porque luego 00:48:35
el siguiente pop vuelve a ofrecernos para mostrar 00:48:37
el system out, el 6, pero en este caso sí, es un pop, entonces avanzamos 00:48:41
y el siguiente pop ya nos muestra un 4, entonces con pick 00:48:45
cogemos el dato, pero no lo muestra, mira, si fuera una pila 00:48:49
de personas 00:48:55
volver un poco más a la variedad, personas, pues aquí meteríamos en la 00:48:59
pila, mi per 1 y mi per 2, las dos personas 00:49:09
que tenemos aquí vale hemos metido dos personas entonces ahora si hacemos un pop lo que haría 00:49:16
se recupera sería recuperar esta primera persona de lo que podríamos hacer aquí fijaros en este 00:49:25
caso como no es tan directo podríamos decir persona de aus es igual y hacemos un poco esto 00:49:30
me devolverá este pop la primera de las personas la referencia a la primera de las personas que 00:49:38
apuntará a PAUS y ahora podemos hacer aquí 00:49:45
un System of Println 00:49:47
de este PAUS 00:49:50
que estará apuntando a la primera de las 00:49:51
personas que me ha devuelto la pila 00:49:53
que será la última que metimos 00:49:55
es previsible que sea PER2 00:49:56
vamos a poner los datos para poder 00:49:58
identificarlos 00:50:01
que será PER2, que PER2 00:50:02
tiene por nombre 00:50:09
Miguel, entonces si hacemos ahora aquí un System 00:50:11
of Println 00:50:13
de PAUS 00:50:14
punto ese nombre 00:50:18
lo previsible es que nos diga que ese 00:50:22
es Miguel, si luego cogemos y cogemos de la pila 00:50:26
bueno, hacemos, mira en lugar de 00:50:33
este, para ver todos los métodos vamos a hacer aquí un pick primero 00:50:41
que nos coja este, pero no avance la pila, con lo cual 00:50:44
se supone que peaus será per2, luego hacemos un pop 00:50:48
y peaus volverá a ser per2, vamos a mostrar de nuevo 00:50:52
dos veces el nombre de Miguel. Y luego 00:50:56
hacemos un nuevo pop 00:50:59
que nos muestre ya el nombre de PAUS, este nuevo pop 00:51:01
ya sería pop1 porque 00:51:06
este pop habría hecho avanzar al penúltimo 00:51:08
de los elementos que tenemos en la pila. 00:51:12
¿Veis? Entonces tenemos dos Miguel y un PAUS. 00:51:17
No sé si lo veis, pero que sí. 00:51:25
Si queremos que, avanzo si no me decís 00:51:30
nada, si queremos que el comportamiento en lugar de una pila 00:51:33
que tiene esa forma sea una cola, es decir, su comportamiento 00:51:37
sea fifo, los cambios respecto a la pila 00:51:45
son muy pocos, luego funcionalmente nos dará ese otro comportamiento 00:51:49
que será el que querremos, pero son muy pocos, a la hora de hacer las inserciones 00:51:53
lo que tenemos que hacer es en lugar de utilizar el método pub 00:51:57
push, podemos utilizar el método que tenemos 00:52:02
siempre para las colecciones el método ata porque los linked list tiene una ordenación no según 00:52:06
nuestro criterio como sería si fuera un tri pero sí según el criterio de inserción entonces el 00:52:17
hecho de cambiar esto al crítica este criterio lo que hace es que nuestra colección tenga linked 00:52:23
list tenga el comportamiento típico de cuando vamos a la carnicería que el primero que coge 00:52:29
el ticket para el turno, pues es el primero que llaman. 00:52:33
Entonces, si ahora aquí metemos Miper 00:52:39
antes que Miper2, 00:52:41
estaremos metiendo Agus antes que Miguel 00:52:45
y ahora al hacer aquí el pop o el pick 00:52:47
nos dirá Agus, Agus, Miguel, la ejecución. 00:52:51
Ahí lo tenéis. 00:52:57
Su comportamiento ya es según una cola. 00:52:58
FIFO. 00:53:01
No sé si tenéis alguna cosa por ahí. 00:53:09
No. 00:53:19
Vale, pues avanzamos un poquito más y nos vamos a, de momento vamos a dejar aparcados las colecciones y vamos a hablar un poco de los mapas. 00:53:21
¿Cuál es la diferencia principal entre una colección y un mapa? 00:53:34
Una colección almacena datos de tipos a través de grupos primitivos o referenciados, pero un solo dato. 00:53:37
el dato que almacena, pues será así, pues será de tipo string o de lo que sea. 00:53:53
Los mapas lo que hacen es que en su estructura de memoria guardan pares. 00:53:57
Y estos pares, bueno, pues son, hay un primero y separado de una coma, un segundo. 00:54:04
Cualquiera de estos dos puede ser de cualquier tipo, al igual que el tema de las colecciones. 00:54:12
Con la diferencia de que este primero se convierte en una clave que identifica el segundo de los datos. 00:54:18
Yo creo que se entiende, el otro día lo comentaba, si pensamos en un array de los que conocemos, entre los corchetes, para acceder a uno, si es un array de enteros, 00:54:24
para acceder a uno u otro, aquí lo que ponemos es un numerito que va de 0 hasta la longitud del array menos 1. 00:54:37
Pues esto en ese caso vendría a ser el criterio para acceder al elemento. El tipo de elementos en el array al que estamos accediendo sería este segundo que identificamos aquí en el mapa y el primero sería este. 00:54:48
En un array solamente este primero podría ser de tipo integer, porque los índices de los arrays son siempre posicionales, pero en un mapa puede ser cualquier tipo, puede ser la clave que no se puede nunca repetir, podrá ser un string, podrá ser lo que sea. 00:55:02
en una clase persona, si tuviéramos un mapa de la clase persona 00:55:21
¿quién podría ser un típico candidato en la mayor parte de los mapas 00:55:25
en los que trabajas en personas? Pues su DNI, los DNI son 00:55:29
números o combinaciones de números y una letra al final 00:55:33
que nos identifica a cada uno y que además no hay posibilidad 00:55:38
de repetirlo, aquí podría ser el DNI, pero ya digo que puede ser cualquier cosa 00:55:41
si nosotros definimos un mapa 00:55:45
con estas características, pues resulta que podría tener en este mapa 00:55:49
una entrada cada uno de los DNIs. 00:55:56
Yo, con mi objeto persona, con mi dato, mi edad, mi nombre, 00:55:59
los atributos que tenga la clase persona, en este mapa estoy identificado por mi DNI. 00:56:04
Cualquier otra persona está identificado por su DNI. 00:56:10
Para acceder a todos mis datos, desde el mapa puedo hacer un get 00:56:13
y decirle que lo haga y meter el dato de mi DNI 00:56:17
y que me devolverá el objeto persona que está almacenado en el mapa 00:56:22
asociado a mi clave. 00:56:26
Igual que aquí, en el array, poníamos una posición 00:56:28
y nos devolvía un objeto de la clase persona también, 00:56:31
si es un array de personas. 00:56:34
Las colecciones hablábamos de aquellas que permiten duplicados 00:56:38
y sin orden. 00:56:44
Y luego los otros criterios que teníamos eran 00:56:47
sin duplicados y sin duplicados y además y ordenados. 00:56:49
Los mapas, el tema de los duplicados no ha lugar. 00:57:03
Todos los mapas son sin duplicados. 00:57:07
Y el criterio para mirar a ver si hay duplicados es la clave, este primero. 00:57:12
Tú si pones para una persona, haces trampas y dices una misma persona con sus datos 00:57:18
tiene tres DNIs, podrás tener tres entradas ahí. 00:57:24
Lo que nunca podrás tener es, incluso siendo dos diferentes personas, 00:57:28
el mismo DNI para diferentes objetos de la clase Persona. 00:57:33
Y teniendo en consideración que nunca permite duplicados, 00:57:39
lo que sí que puede estar es ordenados o sin orden. 00:57:44
Si tienen un orden establecido a través de un criterio 00:57:50
que tengamos nosotros como requisito en el programa 00:57:54
serán los tree, otra vez, en este caso los tree map 00:57:58
pues nada, vamos a implementar un mapa 00:58:02
y vemos ahí un ejemplo de como podemos trabajar 00:58:08
un poco con él, y vamos a empezar 00:58:13
haciendo un mapa de 00:58:25
un mapa que no está ordenado, un hash map 00:58:29
Vamos a poner, por ejemplo, para empezar, que su clave sea un integer y que almacene un integer. MiMapa, metemos de la librería Java útil el HashMap y ahí lo tenemos. 00:58:35
como podemos añadir elementos a un mapa 00:59:05
pues ponemos mi mapa 00:59:09
punto put, el método put 00:59:11
fijaros que ahora me pide dos atributos, uno es la clave 00:59:15
y otro es el valor que quiero meter 00:59:18
entonces digo put y digo 00:59:21
con la clave 1 que meta un 10 00:59:24
con la clave 2 que meta un 20 00:59:27
ahora voy a decir que con la clave 1 meta un 30 00:59:34
repitiendo clave de aquí 00:59:37
con la clave 3 que meta a 40 00:59:40
estos datos por los que nos fuera pidiendo el programa 00:59:45
y con la clave 4 que meta en 50 00:59:48
si hago un system.out.println 00:59:50
del mapa, miMapa.site 00:59:57
pues es de esperar que tengamos 01:00:01
como el criterio es la clave 01:00:04
y nunca permite repetidos 01:00:06
que tengamos 1, 2, 3 y 4 01:00:08
porque este no lo considerará 01:00:10
al estar metido este 01:00:12
En realidad los mapas yo creo que nos actualizará el valor, mantendrá esta clave pero el mecanismo de actualización es a través de un put, es decir no mete un nuevo registro pero yo creo que el valor final que va a tener va a ser este, ahora después lo comprobamos. 01:00:13
Vamos a hacer una primera ejecución, me dice que tengo cuatro elementos, uno, dos, tres y cuatro, este no ha metido dos entradas con esta clave. 01:00:27
Si queremos recorrer el mapa, hay un mecanismo para hacer un iterador y otro con los for estos más rápidos, pues podemos decir for, vamos a decir que, integer, ahora repasamos justo esta instrucción que estamos metiendo, mi clave del mapa, mi mapa, tiene un método que es el kset, que es el conjunto de claves, 01:00:36
aquí lo que estamos diciendo es 01:01:10
estamos diciendo 01:01:16
para todo el conjunto 01:01:23
de claves del mapa 01:01:26
ves una a una 01:01:27
cargándolo en la variable 01:01:30
mi clave y mi clave 01:01:32
es de tipo integer porque 01:01:34
las claves que tiene el mapa 01:01:36
hemos hecho aquí que sean de tipo integer 01:01:38
entonces aquí para 01:01:40
coger el valor fijaros el mapa tiene 01:01:46
el conjunto de claves a través del método 01:01:48
case cell lo podemos recuperar para recorrer 01:01:50
todos ellos y el tipo de datos que nos devuelve fijaros es también de tipo entero en este caso 01:01:52
entonces podemos decir mira devuelve voy a cargar mi val aquí en una variable de tipo entero y vamos 01:01:57
a decir mi clave mi clave en cada una de las iteraciones del ford será una de las claves 01:02:03
que me está devolviendo el case set del mapa el conjunto de claves que tiene el mapa punto 01:02:10
.get 01:02:16
.get 01:02:18
de la variable 01:02:26
mi clave, .get 01:02:28
no, perdón 01:02:33
el mapa 01:02:42
mapa.get 01:02:43
mirad esto 01:02:45
si lo intentamos llevar 01:02:47
conceptualmente a lo que conocemos de los 01:02:50
arrays, pues imaginaos que tenemos 01:02:52
un array de integers 01:02:54
que tiene esta definición 01:02:55
bueno, le hemos hecho un new 01:03:06
le hemos metido datos vamos a suponer entonces el array sería mirar el nombre del array para 01:03:09
acceder al primero al segundo de los elementos y aquí pondríamos un 2 pues este 2 es el que 01:03:16
estamos poniendo aquí como clave la clave es cada una de las claves que tiene el mapa cuando estamos 01:03:23
recorriendo el ford que será cada una de estas que hemos metido en el punto y que nos devuelve 01:03:28
esto, el nombre del array y aquí decimos del mapa 01:03:35
para el mapa dame esta clave con el get y que me está 01:03:40
devolviendo, pues me está devolviendo el dato que tenga, en este caso es de tipo integer 01:03:44
nos está cargando aquí en una variable de tipo integer 01:03:48
ahora si hacemos aquí un system.out.println 01:03:51
de mi val, pues nada, hacemos un recorrido 01:03:56
de todos los elementos que tiene ese mapa, fijaros los datos 01:04:03
que me muestra son 30, 20, 40 y 50. 01:04:07
Es decir, para este, no ha metido un duplicado, 01:04:11
pero el dato que ha terminado metiendo es este, ¿veis? 01:04:15
Un 30. 01:04:20
Es decir, lo ha sobrescrito. 01:04:24
No permite duplicados, pero el put, en este caso, 01:04:25
lo que hace es sobrescribirlo, no ignorarlo porque ya existe 01:04:28
un elemento dentro del mapa. 01:04:31
Otro pasito más para trasladarlo a código un poco más, 01:04:35
que nos dé más alternativas. 01:04:42
Imaginaos que tenemos un mapa de, por ejemplo, íntegros, pero cuyos elementos son de la clase persona. 01:04:43
Indicamos aquí por dos sitios y ahora el put, nos volvemos a traer las dos personas que tenemos por aquí, dar de alta ya más veces. 01:05:03
Fijaros cómo ella se queja, ¿por qué? Porque es verdad que la clave es íntegro, pero el dato es de persona, entonces vamos a meterle persona aquí. 01:05:18
bueno, vamos a hacer otra cosa antes 01:05:25
no lo voy a eliminar esto 01:05:34
pero porque me vale la estructura 01:05:39
que tengo de antes, va a ser más rápido 01:05:41
que no luego volver a escribir 01:05:44
todo el código, bueno he vuelto al ejercicio 01:05:45
de antes, veis, el mapa vuelve a ser 01:05:50
de enteros y estamos 01:05:51
metiendo datos de enteros 01:05:53
estábamos trabajando con un hash map 01:05:55
no permite 01:05:57
duplicados, es verdad, por clave 01:06:00
como hemos comprobado, ningún mapa lo permite 01:06:02
este 4 es de este size, es del tamaño 01:06:03
y luego cada uno de los datos, pero si yo utilizo un tree map 01:06:06
¿qué es lo que mete el tree? pues el tree lo que nos 01:06:15
mete es orden, ¿verdad? voy a importar 01:06:19
con un tree map lo que nos mete es orden, ¿orden bajo qué criterio? 01:06:30
bajo el criterio del integer, entonces 01:06:36
justo los había puesto ordenados aquí 01:06:39
a la hora de insertarlos, voy a volver al hash map 01:06:44
y lo voy a insertar de forma desordenada para hacer una ejecución 01:06:49
con desorden, meto primero el 3 01:06:54
luego el 2, voy a quitar este 1 01:06:57
ya el tema del duplicado ya lo hemos comprobado, meto el 3, el 2, el 1 y el 4 01:07:08
con un hashMap hago una ejecución 01:07:14
vaya me lo ha sacado aquí, busca un criterio de ordenación 01:07:17
el hashMap, ah bueno porque busca un criterio de ordenación 01:07:27
propio de este. 01:07:32
Bueno, pues el HashMap 01:07:40
me lo está ordenando también según el criterio 01:07:41
este, bajo este criterio 01:07:44
de ordenación. Curioso. 01:07:46
No esperaba yo que lo fuera 01:07:50
a hacer esto. Bueno, pues 01:07:51
nos hace esto. Si le metemos un TRIMAP 01:07:53
pues nos va a dar lo mismo, porque ya estoy viendo que lo está 01:07:55
metiendo ordenado. Un TRIMAP 01:07:57
sí que claramente 01:08:05
hace esto. Vamos a meter 01:08:07
aquí 01:08:11
vamos a irnos a un HashMap 01:08:11
y a un trimap, pero de la clase persona, para intentar ver la diferencia 01:08:15
entre los dos. HisMap de la clase persona. 01:08:18
Porque con el tipo integer 01:08:28
se han comportado los dos igual. 01:08:30
Deja un poco descolocado, porque yo pensaba que el orden 01:08:36
lo iba a poner no según el dato, sino según 01:08:54
la clave. Y claro, los ha ordenado según el dato. 01:08:59
A ver, bueno, vamos a ir investigando. 01:09:05
Nos sirve para investigarlo. 01:09:07
De tal forma, si no llegamos a una conclusión definitiva, 01:09:10
luego intento echarle un ojo y os digo por el foro. Yo pensaba que desde luego el criterio de duplicado sí que está utilizando la clave, sí o sí, y yo pensaba que el criterio de orden de todo el mapa iba a ser según la clave, pero por lo que estamos viendo aquí no, está utilizando como criterio de orden el dato. 01:09:12
nos lo ha ordenado tanto con el hash map como con el tree map 01:09:32
al 10, 20, 40, 50, que no es precisamente el orden 01:09:36
en el que habíamos insertado por aquí, ah bueno, pero también tiene justo este mismo 01:09:40
orden, la clave, perdonad que estoy aquí divagando un poco 01:09:49
vamos por lo menos a comprobar que el criterio de ordenación lo hace a través 01:09:55
de clave, el hash map 01:10:03
bien, vamos a poner 01:10:05
es que justo ha coincidido que fijaros, aunque aquí nos ha mostrado un 10 01:10:19
que me estaba haciendo a mí dudar que el dato era el criterio de ordenación, resulta que el 10 01:10:24
tiene el 1, que el 20 tiene el 2, el siguiente 01:10:28
muestra es el 40 que tiene el 3 y el siguiente muestra es el 50 que tiene el 5 01:10:32
entonces coincide el orden tanto del dato como de la clave 01:10:36
entonces voy a poner aquí un 1, un 1 solo 01:10:38
y vamos a ver si el tercero que muestra es el 1, entonces es 01:10:44
el criterio de ordenación lo hace a través de la clave, no me muestra ninguno porque he comentado aquí, efectivamente, bueno, efectivamente ordena el HashMap, pero los criterios de ordenación y de duplicados son a través de la clave, porque fijaros como ahora, este que en cuanto a clave es el tercero, es el tercero que nos aparece a pesar de que uno es menor que algunos de los datos que hay por aquí y menor que el último también, y aparece por ahí, es decir, el criterio de ordenación es por clave, eso sí. 01:10:47
Vamos a ver, como el criterio de ordenación es por la persona, si queremos trabajar nosotros según nuestro criterio el orden del trimap, tendremos que poner algo aquí que sea ordenable a cuyo código podamos llegar nosotros, 01:11:23
si no siempre va a trabajar por el código que tenemos en la librería de Java en la clase integer. 01:11:44
Entonces vamos a decir lo contrario. 01:11:51
Mirad, que esté ordenado por persona, es decir, la clave sea una persona y el dato sea un integer. 01:11:53
Como se supone que va a estar ordenado por la clase persona, vamos a ponerlo aquí igual. 01:12:38
Vamos a aumentar por aquí. 01:12:57
el criterio para ver cómo el mapa ordena dos personas 01:12:58
pues volverá a ser el que tengamos aquí 01:13:12
en el compare to, entonces retomamos aquí el implement comparable 01:13:16
ahora se nos queja porque tenemos que descomentar aquí 01:13:23
el compare to, y el primer criterio que tenemos para ordenar es la edad 01:13:31
en el trimap 01:13:39
le falta por aquí una llave 01:13:41
y le falta un return 01:14:00
vale, por aquí lo tenemos, ya nos compila 01:14:13
entonces vamos a añadir ahora al mapa las dos personas 01:14:19
que tenemos, que son estas dos, que tendrán que estar por encima 01:14:29
del momento en el que las añadimos, fijaros en este 01:14:36
según la definición de este ejercicio ahora, la clave es una persona 01:14:52
y añadimos un integer como dato 01:14:56
Es una situación funcional quizás un poco rara, es más normal que sea un entero aquí, para el que sea el DNI y la persona, pero nos vamos a retorcer un poco para ver cómo trabaja. 01:15:00
Vamos a ver aquí el tamaño. 01:15:15
En principio esta persona y esta son diferentes porque aquí tenemos la misma edad, vamos a poner diferente edad, 20. 01:15:21
Entonces serían dos personas diferentes porque lo que estamos comparando en el compare aquí de las compare tú de las personas es la edad de las dos. 01:15:35
Si damos aquí una ejecución, nos dice que el tamaño es dos, es decir, se añaden las dos personas perfectamente. 01:15:43
Si ponemos aquí que sea la misma edad, nos dice dos. 01:15:50
Pues no está mirando, si pasa por aquí por el compare tú, a ver. 01:15:58
vale, lo que sucede es que 01:16:01
en caso de tener la misma edad, compara el nombre 01:16:03
lo que tenemos en el compareto, entonces si a los dos lo llamamos Agus 01:16:08
también, en la clase persona, estamos diciendo 01:16:14
que dos personas son iguales cuando tienen la misma edad 01:16:20
y tienen el mismo nombre, en ese caso se ha ido a uno 01:16:23
es decir, la clave para mirar si están duplicados 01:16:31
en un mapa va según el criterio de la clave y en la clave esta hemos dicho que dos personas son 01:16:36
iguales según lo que hemos codificado aquí al implementar igual que hacemos en las colecciones 01:16:45
el interfaz comparable dentro del código compare tú que hemos dicho que dos personas sean iguales 01:16:50
aquí se devuelve a un cero que es a lo que lo iniciamos aquí cuando dos personas con la misma 01:16:56
edad tienen el mismo nombre es el único caso en el que no se modifica el valor diva al def si ya 01:17:02
tienen diferente edad ya nos inserta las dos y fijaros como nos muestra el pasa por aquí porque 01:17:11
efectivamente la comprobación la está haciendo mediante la llamada al compare tú con esta traza 01:17:19
como es un trimap se entiende que el criterio para ordenar los mapas se basan en la clave y 01:17:30
Y al basarse en la clave, aunque el HashMap también habíamos visto que hacía algo parecido y no es un TRIMAP. 01:17:39
No sé si es por orden de inserción por lo que no lo estaba poniendo. 01:17:46
Bueno, el TRIMAP se basa en la, en principio es así que por definición la clave sí o sí. 01:17:49
Entonces al basarse en la clave, mira el compare tú y ordenará según este criterio. 01:17:56
En principio la edad y segundo el nombre. 01:18:02
Entonces, si ahora cogemos y mostramos aquí los datos, vamos a hacer un recorrido de todo el mapa, les comentamos por aquí, y decimos, vamos a recuperar cada una de las claves que tiene el mapa. 01:18:06
Pero cada una de las claves ahora ya no son Integer, son personas. 01:18:27
Entonces, para cada una de las personas que se mete aquí, 01:18:33
obtén de la clave y lo que devuelve es un entero, Integer. 01:18:37
Ahí está. 01:18:50
Y lo que hacemos es mostrarlo por pantalla. 01:18:51
Fijaros cómo para la primera de las personas, que es Agus, 01:18:53
hemos metido un valor de un 1 y para la segunda de las personas, 01:19:01
que es Miguel, hemos metido un valor 20 01:19:04
que son los dos valores que estamos intentando recuperar por aquí 01:19:10
vamos a ejecutar por aquí, bueno, me muestra 01:19:13
dice 2 el tamaño, aquí está con las comparaciones pasando por ahí 01:19:18
y me devuelve 1 y 20, este 1 y este 20 01:19:22
son estos dos datos y me los ha devuelto según el criterio de orden 01:19:26
que tenemos para mi per y mi per2 01:19:30
si cambiamos la edad aquí, fijaros que acordaros que el primer 01:19:33
criterio de ordenación era a través de la edad 01:19:38
con mi per a dos 01:19:41
de edad, me ha dicho que el primero de ellos era el que tenía 01:19:46
como dato un uno y el segundo el que tenía un veinte 01:19:50
si le cambiamos la edad aquí y ponemos aquí veintidós para que esta edad ahora sea mayor que esta 01:19:54
es de esperar que estos dos datos estén intercambiados en cuanto 01:19:58
al orden, entonces fijaros como ahora pone aquí 20 y aquí 1 01:20:02
y ahora ya lo único que nos queda es comprobar a ver que 01:20:05
hace con un HashMap, habría que ir a la teoría a ver como se comporta 01:20:13
en cuanto al orden los HashMap, vamos a ver que hace, bueno fijaros 01:20:18
aquí ya con el, cuando la clave era un entero 01:20:22
pues no sabemos muy bien lo que estaba pasando por ahí en las librerías de Java 01:20:27
seguro que tiene su explicación, otra cosa es que yo 01:20:30
contaros la hora, pero fijaros, con el trimap sí que está respondiendo 01:20:34
como estábamos viendo al criterio de ordenación que estábamos diciendo, entonces con estos datos 01:20:39
ahora, fijaros como el orden, me lo decía 01:20:43
20 y 1, cambio esta misma colección, si la pongo como hash map 01:20:47
bueno, pues ya se irá al, entiendo que se estará yendo al criterio de ordenación 01:20:51
de nada, porque es sobre la clave, pero fijaros 01:20:58
como aquí con el trimap me han mostrado 20 y 1 en el orden, y aquí me muestra 01:21:03
1 y 20. 01:21:07
Y claro, ahora por más... A ver si... 01:21:10
Porque es un HashMap 01:21:13
que ya no se preocupa de la ordenación. 01:21:15
De hecho, fijaros, ahora ya está mirando 01:21:18
en el HashMap... Vale, vale. 01:21:19
En el HashMap está mirando el método 01:21:21
Equals y el HashCode. 01:21:23
Tiene sentido. 01:21:27
Vale. 01:21:28
Creo que ya lo he entendido. 01:21:30
Vamos a intentar recapitular. 01:21:31
El TreeMap, fijaros, 01:21:33
en las colecciones, 01:21:35
cuando teníamos una colección que era una set pero no map 01:21:36
no tree, que era que métodos hemos dicho que mirábamos para ver 01:21:46
si eran iguales y sobre que métodos trabajaba, pues trabajaba 01:21:50
sobre el método hashCode y el método equals 01:21:54
y le daba un poco igual el orden 01:21:59
y cuando teníamos una colección, una que era tree, todas las comprobaciones 01:22:02
se hacían ya sobre el método compareTo 01:22:10
y en los mapas pasa algo parecido 01:22:14
fijaros ahora que tenemos un hashMap que ya no es tree 01:22:17
fijaros que traza nos está mostrando aquí, pasa por hashCode y pasa por 01:22:21
equals de la clase persona, es decir, no está utilizando el compareTo 01:22:26
y para ver si son duplicados está utilizando estas dos 01:22:30
igual que en las colecciones, en cambio cuando teníamos el treeMap 01:22:34
el criterio lo buscaba de ordenación en el compareTo 01:22:37
alguna pregunta 01:22:40
que os surja 01:22:50
alguna cosilla nos queda clara 01:22:52
por ahí 01:22:53
bueno pues nada vamos a ver 01:22:58
una cosa más que todavía nos queda un poquito 01:23:06
tiempo aunque ya vayamos 01:23:09
cerrando en realidad yo creo 01:23:11
que hemos dado un repaso grande 01:23:12
a las colecciones y los mapas 01:23:14
si tenéis más dudas luego me vais 01:23:16
preguntando por los foros en cualquier caso 01:23:18
mirad las 01:23:20
la clase colección tiene 01:23:22
algunos métodos que bueno que son interesantes para trabajar directamente con colecciones 01:23:28
directamente como como métodos estáticos de la clase colección y una de ellas por ejemplo es 01:23:33
el método sufre este que es bueno para jarno es un método que nos viene bien para la tarea 01:23:40
así si no lo habéis trabajado la estéis trabajando porque hay un momento que habla la tarea de una 01:23:48
baraja y dice barajar las cartas que las tendré guardadas en una colección pues igual con este 01:23:53
método lo podéis hacer entonces si tenemos una colección que sea una por ejemplo una linked 01:23:59
list de tipo entero enteros de ver y mi lista vamos a poner que es una lista como es una link 01:24:08
el dis amite duplicados verdad no se preocupa del orden en especial se puede estar no tiene 01:24:22
un orden definido lo cual nos va a permitir barajar o mezclar en un orden diferente sus 01:24:29
datos me falta el new por aquí y la definido de enteros pues entonces podría hacer aquí mi lista 01:24:37
punto, add 01:24:48
y voy a meter aquí enteros 01:24:50
voy a decir un 2 01:24:55
un 5 01:24:56
un 1 01:24:59
y un 3 01:25:01
en principio nos sigue un orden según los he metido 01:25:03
en particular 01:25:07
vamos a recorrer esta colección 01:25:08
voy a llevar aquí 01:25:19
la estructura de un iterador 01:25:22
por no escribir tanto 01:25:26
definimos un iterador, en este caso 01:25:27
un iterador de tipos enteros 01:25:32
la colección se llama mi lista 01:25:34
mientras haya elementos 01:25:36
y muestro el valor del iterador 01:25:40
vale 01:25:53
entonces si ejecuto por aquí 01:25:55
bueno pues fijaros como 01:25:56
me muestra los datos en el orden en los que 01:26:00
lo he introducido, no tiene un orden 01:26:03
funcional como si fuera 01:26:05
un trimap o algo de eso 01:26:06
según enteros, si esto fuese un trimap 01:26:09
pues me los habría ordenado a través de los números 01:26:11
vamos a hacerlo en un momento 01:26:15
como cambiamos muy rápido de uno a otro 01:26:16
no un trimap, no, un triset 01:26:21
para que sea una colección 01:26:27
de aquí que tiene el orden según los hemos metido 01:26:32
fijaros con un triset, pues ahora ya me salen según 01:26:35
un orden definido 01:26:38
para los enteros en las librerías de Java 01:26:41
en el integer no podemos sobreescribir el método compareTo 01:26:44
como sí que hemos hecho en la clase persona 01:26:47
volvemos al linked list y del 01:26:49
orden numérico del dato, pues ahora vemos que está 01:26:55
del orden según los hemos ido introduciendo. Pues si yo cojo aquí 01:26:58
y llamo al método estático 01:27:02
shuffle y le paso como parámetro una colección, en este 01:27:11
caso la colección con la que estoy trabajando 01:27:16
pues se supone que de este orden que es el que tiene cuando arranca 01:27:19
pues los está mezclando. Entonces si yo ahora cojo y establezco 01:27:24
otra vez el iterador y vuelvo a mostrarlo por pantalla, voy a definir dos veces 01:27:28
la variable, fijaros lo que estoy haciendo, defino 01:27:35
la colección, añado unos cuantos elementos, con el iterador los muestro 01:27:39
barajo, mezclo de forma aleatoria 01:27:42
los datos que tiene esa colección y los vuelvo a muestrar 01:27:47
entonces aquí, damos una ejecución, voy a meter aquí una separación 01:27:50
entre los dos, un momento para que se vea más claro, mirad el primer orden 01:27:58
iba 2, 5, 1, 3, que coincide con como los hemos metido 01:28:12
y después de hacer la mezcla, la mezcla que le hago aquí, 01:28:16
bueno, me saca esta línea, ¿verdad? La mezcla la hago aquí, vuelvo a meter 01:28:25
los datos y ahora saben, bueno, pues mezcla con otro orden diferente 01:28:28
el que le ha querido dar el método SAFEL. Fijaros en diferentes 01:28:32
ejecuciones. Salen aquí una vez mezclados diferentes 01:28:36
datos. 1, 2, 5, 3. 5, 3, 2, 1. 01:28:40
5, 1, 3, 2. Bueno, pues nada, un método 01:28:45
que tenemos ahí en Colesions. 01:28:48
Hay algunos métodos más 01:28:51
que están disponibles 01:28:53
para coger de una lista a una sublista 01:28:54
y algunas otras alternativas. 01:28:57
Bueno, pues echarles un ojillo 01:28:59
y si se os atascan, 01:29:01
pues ya me vais diciendo. 01:29:04
Y no sé si contaron muchas más cosas. 01:29:08
Lo siguiente que tenía por aquí apuntado, 01:29:11
pero eso es una cosa 01:29:14
que igual nos lleva una clase entera 01:29:15
y es un poco 01:29:17
por culturilla general y ver cómo se puede programar, era 01:29:19
programar nosotros, no sé si lo haremos algún día, si nos sobra 01:29:23
algún día igual lo retomamos, programar nosotros lo que podría ser 01:29:27
por ejemplo una ArrayList, una colección que en lugar 01:29:31
de estar llamando a las librerías, nos cree una lista que a medida 01:29:38
por ejemplo duplicados y que esté enlazado uno detrás de otro, a ver cómo lo podríamos 01:29:42
hacer nosotros intentando simular el código que las 01:29:46
librerías tienen para las colecciones? 01:29:50
Bueno, pues 01:29:53
no es una cosa muy 01:29:53
necesaria en el fondo, es más 01:29:56
por ahondar un poco en tema 01:29:58
de algoritmo y ver cómo se puede organizar eso 01:30:00
porque en verdad cuando necesitáis 01:30:02
una lista no la vais a programar vosotros, vais a utilizar 01:30:04
una de las que están disponibles ya en las colecciones. 01:30:06
Y en principio yo creo 01:30:12
que ya os he contado muchas cosas hoy, no sé 01:30:13
si echáis alguna cosa 01:30:15
en falta, que creéis que le demos una 01:30:17
vuelta o alguna cosa no entendéis de lo que 01:30:19
hemos hablado, o necesitáis madurar 01:30:21
o quizás un poco para que os surjan 01:30:24
las dudas. Si no tenéis 01:30:27
nada en particular, yo creo que vamos a ir terminando 01:30:35
ya por hoy. 01:30:37
Por no hacer esto ya mucho más largo. 01:30:39
¿No tenéis 01:30:43
alguna pregunta así en particular? 01:30:44
¿Qué queréis hacerme? 01:30:46
Pues nada, pues 01:30:50
os voy dejando entonces. 01:30:52
Si tenéis alguna cosita, 01:30:55
bueno, pues en Semana Santa igual 01:30:57
no soy tan ágil para responderos, pero 01:30:58
iré echando un ojo de vez en cuando, así que 01:31:00
si me preguntáis alguna cosita por ahí 01:31:02
os intentaré ir respondiendo 01:31:04
aunque también por descargar 01:31:06
descansar, cargar las pilas 01:31:08
y luego ya a la vuelta 01:31:11
seguimos dándole ahí duro 01:31:12
claro, tenemos dentro de mucho 01:31:17
porque vienen estas dos 01:31:19
que caen justo Semana Santa 01:31:22
y luego volvemos justo en un martes 01:31:23
así que sí, en tres semanitas 01:31:25
eso es 01:31:27
bueno 01:31:28
pues 01:31:33
que paséis 01:31:34
que descanséis estos días 01:31:36
descanséis o no descanséis, lo que mejor os venga 01:31:38
a cada uno 01:31:40
venga, nos vemos a la vuelta, hasta luego 01:31:41
Materias:
Programación
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Primer Curso
Autor/es:
JM
Subido por:
Jose Manuel M.
Licencia:
Dominio público
Visualizaciones:
36
Fecha:
7 de abril de 2025 - 19:06
Visibilidad:
Clave
Centro:
IES ALONSO DE AVELLANEDA
Duración:
1h′ 31′ 48″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
192.58 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid