1 00:00:03,310 --> 00:00:05,790 vale, que hace que sea más fácil de gestionar 2 00:00:05,790 --> 00:00:07,669 porque no hay que llevar a cuenta 3 00:00:07,669 --> 00:00:09,189 la posición en la que está cada elemento 4 00:00:09,189 --> 00:00:11,509 bueno, pues dentro de la jerarquía 5 00:00:11,509 --> 00:00:13,269 set sigue siendo otra interfaz 6 00:00:13,269 --> 00:00:15,330 otra interfaz que lo que dice 7 00:00:15,330 --> 00:00:17,649 es los métodos que tienen que tener los conjuntos 8 00:00:17,649 --> 00:00:19,010 vale 9 00:00:19,010 --> 00:00:21,429 set conjunto, ya sabéis que es lo mismo, claro 10 00:00:21,429 --> 00:00:22,329 es la traducción 11 00:00:22,329 --> 00:00:26,769 entonces, cualquier cosa 12 00:00:26,769 --> 00:00:27,910 que sea conjunto 13 00:00:27,910 --> 00:00:30,750 cualquier cosa que sea conjunto, como esta variable 14 00:00:30,750 --> 00:00:31,489 de aquí nombres 15 00:00:31,489 --> 00:00:46,950 cualquier cosa que sea conjunto 16 00:00:46,950 --> 00:00:48,450 como esta variable de aquí nombres 17 00:00:48,450 --> 00:00:51,549 tiene que ofrecer una implementación 18 00:00:51,549 --> 00:00:52,570 para estos métodos 19 00:00:52,570 --> 00:00:55,009 añadir a un conjunto 20 00:00:55,009 --> 00:00:57,789 añadir un montón de elementos a la vez 21 00:00:57,789 --> 00:00:59,429 que a su vez están en una colección 22 00:00:59,429 --> 00:01:02,570 limpiar el conjunto enterito de elementos 23 00:01:02,570 --> 00:01:03,990 no dejarlo a nul 24 00:01:03,990 --> 00:01:05,989 simplemente dejarlo sin elementos 25 00:01:05,989 --> 00:01:09,670 ver si en un conjunto está 26 00:01:09,670 --> 00:01:11,969 un objeto igual 27 00:01:11,969 --> 00:01:13,730 al que yo le paso por parámetro 28 00:01:13,730 --> 00:01:16,269 ver si en un conjunto 29 00:01:16,269 --> 00:01:16,849 están 30 00:01:16,849 --> 00:01:20,250 todos los, hay elementos 31 00:01:20,250 --> 00:01:22,450 iguales a todos estos 32 00:01:22,450 --> 00:01:24,569 que yo le paso una colección por parámetro 33 00:01:24,569 --> 00:01:26,370 entonces como veis 34 00:01:26,370 --> 00:01:28,129 cualquier cosa que sea conjunto 35 00:01:28,129 --> 00:01:30,209 los métodos que tiene que implementar 36 00:01:30,209 --> 00:01:32,609 son mucho menos que los de las listas 37 00:01:32,609 --> 00:01:34,730 cualquier cosa que sea lista tiene que implementar 38 00:01:34,730 --> 00:01:36,530 pues el adfers, el atlas 39 00:01:36,530 --> 00:01:37,849 el get 40 00:01:37,849 --> 00:01:40,750 por posición, muchas más cosas, cualquier cosa que sea conjunto 41 00:01:40,750 --> 00:01:42,549 tiene que implementar 42 00:01:42,549 --> 00:01:44,510 muchas menos, veis aquí hay muy poquitos 43 00:01:44,510 --> 00:01:45,409 métodos en realidad 44 00:01:45,409 --> 00:01:48,329 ¿vale? en realidad 45 00:01:48,329 --> 00:01:50,870 tiene añadir, limpiarlo 46 00:01:50,870 --> 00:01:52,430 ver si contiene un objeto o no 47 00:01:52,430 --> 00:01:54,549 lo contiene, no hay un get 48 00:01:54,549 --> 00:01:56,790 por posición, efectivamente, un iterador 49 00:01:56,790 --> 00:01:58,689 para iterar por él, un iterador 50 00:01:58,689 --> 00:01:59,510 para iterar 51 00:01:59,510 --> 00:02:02,030 borrar un objeto 52 00:02:02,030 --> 00:02:04,150 que pasamos por parámetro 53 00:02:04,150 --> 00:02:06,430 en ese conjunto, si se le pasa 54 00:02:06,430 --> 00:02:08,550 ese objeto por parámetro, se borrará 55 00:02:08,550 --> 00:02:11,849 aquel igual 56 00:02:11,849 --> 00:02:14,210 el primero que se encuentre igual a él 57 00:02:14,210 --> 00:02:16,330 ¿vale? ante las dudas 58 00:02:16,330 --> 00:02:18,169 siempre uno puede mirar la documentación 59 00:02:18,169 --> 00:02:19,810 del método, bien en oracle 60 00:02:19,810 --> 00:02:22,090 o bien esta que es la misma 61 00:02:22,090 --> 00:02:23,650 o bien esta que es la misma 62 00:02:23,650 --> 00:02:25,750 ¿vale? 63 00:02:26,250 --> 00:02:28,389 aquí te dice borra el elemento 64 00:02:28,389 --> 00:02:30,629 de este conjunto si está presente 65 00:02:30,629 --> 00:02:32,270 entonces aquí 66 00:02:32,270 --> 00:02:34,370 yo he dicho borra la 67 00:02:34,370 --> 00:02:35,669 primera aparición 68 00:02:35,669 --> 00:02:37,550 de un 69 00:02:37,550 --> 00:02:40,349 objeto igual a este 70 00:02:40,349 --> 00:02:42,409 igual a este 71 00:02:42,409 --> 00:02:44,569 dentro del conjunto 72 00:02:44,569 --> 00:02:46,090 ¿vale? 73 00:02:46,169 --> 00:02:47,969 ese método remove ya lo vimos con las listas 74 00:02:47,969 --> 00:02:50,310 si queríamos que borrara todos los que fueran 75 00:02:50,310 --> 00:02:52,150 iguales, no solo el primero, ¿qué poníamos? 76 00:02:52,629 --> 00:02:53,069 delante 77 00:02:53,069 --> 00:02:55,699 ¿eh? 78 00:02:57,039 --> 00:03:00,000 vale, ese método remove que ya lo hemos visto en listas 79 00:03:00,000 --> 00:03:01,139 ¿verdad? 80 00:03:01,460 --> 00:03:03,639 este método, tú le pasabas un objeto 81 00:03:03,639 --> 00:03:06,000 y dentro de la colección 82 00:03:06,000 --> 00:03:08,099 que llamaba el método, en este caso el conjunto 83 00:03:08,099 --> 00:03:10,919 pues borra el elemento 84 00:03:10,919 --> 00:03:12,580 que encuentra igual a este 85 00:03:12,580 --> 00:03:13,560 eso hacía el remove 86 00:03:13,560 --> 00:03:16,500 ¿vale? pero solamente 87 00:03:16,500 --> 00:03:18,620 borraba el primero que encontraba 88 00:03:18,620 --> 00:03:20,719 igual a ese, entonces si queríamos 89 00:03:20,719 --> 00:03:22,780 que borrara todos los que había iguales 90 00:03:22,780 --> 00:03:24,680 a ese, le poníamos un while 91 00:03:24,680 --> 00:03:26,960 porque como este devuelve boolean diciéndote si ha borrado 92 00:03:26,960 --> 00:03:28,620 de forma efectiva o no ha borrado 93 00:03:28,620 --> 00:03:30,400 si notemos esto en un while 94 00:03:30,400 --> 00:03:32,500 pues volverá a hacer otro remove, otro remove 95 00:03:32,500 --> 00:03:33,439 es este que no encuentro en ningún 96 00:03:33,439 --> 00:03:36,719 ¿vale? pues aquí funcionará igual 97 00:03:36,719 --> 00:03:42,430 como que si no puede 98 00:03:42,430 --> 00:03:44,229 funcionar igual, es una burrada lo que he dicho 99 00:03:44,229 --> 00:03:45,969 esto es un conjunto 100 00:03:45,969 --> 00:03:48,389 no puede haber dos elementos iguales 101 00:03:48,389 --> 00:03:49,370 es imposible 102 00:03:49,370 --> 00:03:51,509 entonces, el remove 103 00:03:51,509 --> 00:03:54,270 en caso de existir un objeto igual a este 104 00:03:54,270 --> 00:03:55,590 es que solo va a existir uno 105 00:03:55,590 --> 00:03:58,169 no puede existir dos iguales a este 106 00:03:58,169 --> 00:04:00,389 en las listas sí, aquí no 107 00:04:00,389 --> 00:04:02,110 por eso 108 00:04:02,110 --> 00:04:04,449 si uno mira la ayuda del remove de conjunto 109 00:04:04,449 --> 00:04:05,270 no te dice 110 00:04:05,270 --> 00:04:08,590 borra la primera ocurrencia de este 111 00:04:08,590 --> 00:04:10,289 en las listas si que te decía 112 00:04:10,289 --> 00:04:11,849 borra la primera ocurrencia 113 00:04:11,849 --> 00:04:14,490 de un objeto cuyo equals 114 00:04:14,490 --> 00:04:15,849 da true 115 00:04:15,849 --> 00:04:18,069 aquí no te dice la primera ocurrencia porque 116 00:04:18,069 --> 00:04:20,290 un objeto solo puede estar 117 00:04:20,290 --> 00:04:21,689 una vez en un conjunto 118 00:04:21,689 --> 00:04:24,290 entonces aquí no tendría sentido 119 00:04:24,290 --> 00:04:26,009 poner el while porque 120 00:04:26,009 --> 00:04:28,009 solo puede haber un objeto 121 00:04:28,009 --> 00:04:29,509 igual a este 122 00:04:29,509 --> 00:04:32,370 luego pues seguimos 123 00:04:32,370 --> 00:04:34,250 cualquier implementación de set 124 00:04:34,250 --> 00:04:36,269 tiene que implementar pues remove all 125 00:04:36,269 --> 00:04:38,569 que este borra todos los que sean iguales 126 00:04:38,569 --> 00:04:40,829 a todos los de la colección 127 00:04:40,829 --> 00:04:41,910 que tú le pases 128 00:04:41,910 --> 00:04:44,730 ¿vale? bueno, esto remueve, borra 129 00:04:44,730 --> 00:04:46,529 los que cumplen una condición 130 00:04:46,529 --> 00:04:48,970 o sea, puesta en forma de predicado 131 00:04:48,970 --> 00:04:50,509 pero los predicados pues 132 00:04:50,509 --> 00:04:52,930 no sabemos hacerlos, entonces nos podemos olvidar 133 00:04:52,930 --> 00:04:54,490 ¿vale? el tamaño de la colección 134 00:04:54,490 --> 00:04:56,629 este es para 135 00:04:56,629 --> 00:04:58,569 generar otro tipo de iterador 136 00:04:58,569 --> 00:05:00,589 otro tipo de iterador distinto 137 00:05:00,589 --> 00:05:02,529 con una forma distinta que podemos pasar de él 138 00:05:02,529 --> 00:05:04,250 bueno, pues poquitos métodos 139 00:05:04,250 --> 00:05:05,490 para convertir en un array 140 00:05:05,490 --> 00:05:07,350 ¿vale? cualquier colección 141 00:05:07,350 --> 00:05:08,649 tiene también este método 142 00:05:08,649 --> 00:05:11,310 para convertir 143 00:05:11,310 --> 00:05:13,389 esa colección en 144 00:05:13,389 --> 00:05:15,290 un array, por si uno prefiere 145 00:05:15,290 --> 00:05:17,050 trabajar con esos elementos en un array 146 00:05:17,050 --> 00:05:19,290 pues tenemos esto, bueno pues aquí 147 00:05:19,290 --> 00:05:21,449 hay muchos menos métodos en set 148 00:05:21,449 --> 00:05:23,029 que en list 149 00:05:23,029 --> 00:05:24,250 muchos menos 150 00:05:24,250 --> 00:05:27,629 cuando tenemos sin embargo una lista de lo que sea 151 00:05:27,629 --> 00:05:38,379 aquí hay muchos 152 00:05:38,379 --> 00:05:40,199 más métodos, un montón más 153 00:05:40,199 --> 00:05:42,300 hay un montón más que en set 154 00:05:42,300 --> 00:05:42,800 ¿vale? 155 00:05:42,800 --> 00:05:45,500 Bueno, ¿qué quiero decir con esto? 156 00:05:46,800 --> 00:05:50,819 Que las implementaciones de la interfaz set son más sencillas 157 00:05:50,819 --> 00:05:53,079 Y más eficientes computacionalmente 158 00:05:53,079 --> 00:05:56,000 Tienen que hacer menos cosas, no gestionan las posiciones 159 00:05:56,000 --> 00:05:59,500 Pero si necesitamos elementos duplicados, pues no nos valen 160 00:05:59,500 --> 00:06:00,860 Pero si no lo necesitamos, son las mejores 161 00:06:00,860 --> 00:06:02,199 Bueno, pues ahora ya sí 162 00:06:02,199 --> 00:06:07,459 ¿Qué implementaciones de hash set tenemos? 163 00:06:08,639 --> 00:06:11,639 Pues tenemos estas tres 164 00:06:11,639 --> 00:06:13,579 que vimos aquí 165 00:06:13,579 --> 00:06:14,040 el 166 00:06:14,040 --> 00:06:16,899 bueno, no merece la pena 167 00:06:16,899 --> 00:06:19,740 que conecte internet para ver otra vez 168 00:06:19,740 --> 00:06:20,300 la 169 00:06:20,300 --> 00:06:22,899 jerarquía 170 00:06:22,899 --> 00:06:36,860 vale, entonces 171 00:06:36,860 --> 00:06:42,069 esta, esta 172 00:06:42,069 --> 00:06:48,370 y esta 173 00:06:48,370 --> 00:06:51,290 esto ya sí que son tres clases 174 00:06:51,290 --> 00:06:53,430 ya hechas, ya no son clases abstractas 175 00:06:53,430 --> 00:06:54,610 ni interfaces, ni nada 176 00:06:54,610 --> 00:06:57,250 esto ya sí que son tres implementaciones de set 177 00:06:57,250 --> 00:06:58,810 que implementan 178 00:06:58,810 --> 00:07:01,410 esos métodos cada uno a su manera 179 00:07:01,410 --> 00:07:05,410 bueno, pues vamos a ver un poquito 180 00:07:05,410 --> 00:07:06,689 por encima 181 00:07:06,689 --> 00:07:09,470 cómo funcionan 182 00:07:09,470 --> 00:07:11,509 en que se basan para usarlas correctamente 183 00:07:11,509 --> 00:07:13,870 pero luego el uso de todas las colecciones 184 00:07:13,870 --> 00:07:15,790 en última instancia siempre viene a ser el mismo 185 00:07:15,790 --> 00:07:16,509 como ya sabéis 186 00:07:16,509 --> 00:07:20,350 insertar, borrar un elemento que sea igual a otro 187 00:07:20,350 --> 00:07:21,990 recorrer 188 00:07:21,990 --> 00:07:24,110 de eso se trata, de insertar elementos 189 00:07:24,110 --> 00:07:26,430 de recorrer, de borrar elementos 190 00:07:26,430 --> 00:07:28,189 ya está, de eso se trata, nada más 191 00:07:28,189 --> 00:07:36,569 bueno, pues aquí por ejemplo 192 00:07:36,569 --> 00:07:37,350 ya el otro día 193 00:07:37,350 --> 00:07:40,870 probamos el hash set 194 00:07:40,870 --> 00:07:42,449 pero vamos, lo probamos 195 00:07:42,449 --> 00:07:44,149 pues nada, para usar una colección 196 00:07:44,149 --> 00:07:45,470 para meter cadenas 197 00:07:45,470 --> 00:07:49,029 entonces, como es de cadenas 198 00:07:49,029 --> 00:07:50,629 pues decimos, oye 199 00:07:50,629 --> 00:07:54,790 la parametrizo a que sea cadenas 200 00:07:54,790 --> 00:07:56,470 igual que hacíamos con las listas 201 00:07:56,470 --> 00:07:58,889 recordad que no es obligatorio 202 00:07:58,889 --> 00:08:00,490 indicar 203 00:08:00,490 --> 00:08:04,509 el tipo de dato que va a ir en una colección 204 00:08:04,509 --> 00:08:06,550 no es obligatorio, las clases genéricas 205 00:08:06,550 --> 00:08:08,550 no te obligan 206 00:08:08,550 --> 00:08:10,449 a que tú digas en el momento de 207 00:08:10,449 --> 00:08:12,310 instanciarlas qué tipo de dato vas a meter 208 00:08:12,310 --> 00:08:14,470 no te obligan, tú puedes dejarla 209 00:08:14,470 --> 00:08:14,949 abierta 210 00:08:14,949 --> 00:08:18,089 si la dejas abierta, ¿qué significa? 211 00:08:18,589 --> 00:08:20,470 que puedes meter lo que te dé la gana 212 00:08:20,470 --> 00:08:22,089 cualquier cosa que sea object 213 00:08:22,089 --> 00:08:23,250 sería como hacer esto 214 00:08:23,250 --> 00:08:26,470 si tú la dejas abierta, sería como 215 00:08:26,470 --> 00:08:27,230 hacer esto de aquí 216 00:08:27,230 --> 00:08:32,179 y en object ¿qué cae? en object cae cualquier 217 00:08:32,179 --> 00:08:33,940 dato, en object cae cualquier 218 00:08:33,940 --> 00:08:35,539 cosa, sería como hacer esto 219 00:08:35,539 --> 00:08:37,080 vale 220 00:08:37,080 --> 00:08:38,740 entonces hombre 221 00:08:38,740 --> 00:08:41,759 a la hora de programar es magnífico 222 00:08:41,759 --> 00:08:43,779 porque no te va a salir ningún error 223 00:08:43,779 --> 00:08:44,559 de compilación 224 00:08:44,559 --> 00:08:47,539 yo le meto una cadena, hola, estupendo 225 00:08:47,539 --> 00:08:48,960 pero le voy a meter un numerito 226 00:08:48,960 --> 00:08:51,779 genial, también coge el numerito 227 00:08:51,779 --> 00:08:53,480 y ahora le voy a meter 228 00:08:53,480 --> 00:08:55,539 un objeto 229 00:08:55,539 --> 00:08:57,820 alumno que tengo por ahí 230 00:08:57,820 --> 00:09:00,100 por ejemplo, este en que proyecto estábamos 231 00:09:00,100 --> 00:09:01,799 estructuras dinámicas 232 00:09:01,799 --> 00:09:03,320 a ver si tiene alguna clase por ahí 233 00:09:03,320 --> 00:09:15,889 Pues eso, imaginaos que yo tengo aquí 234 00:09:15,889 --> 00:09:23,070 Aquí tengo en el main 235 00:09:23,070 --> 00:09:24,909 Tengo este objeto cliente 236 00:09:24,909 --> 00:09:26,690 ¿Qué ahora le quiero meter un objeto cliente? 237 00:09:27,210 --> 00:09:28,470 A esta colección 238 00:09:28,470 --> 00:09:42,279 Vale, cliente, tenía constructor 239 00:09:42,279 --> 00:09:43,519 Sin parámetros, no 240 00:09:43,519 --> 00:09:46,059 Le voy a poner un constructor sin parámetros 241 00:09:46,059 --> 00:09:46,740 Para que 242 00:09:46,740 --> 00:09:51,480 Para que 243 00:09:51,480 --> 00:09:54,419 Me deje instanciarlo así 244 00:09:54,419 --> 00:10:05,190 Sin más, vale 245 00:10:05,190 --> 00:10:07,149 Entonces, pues eso 246 00:10:07,149 --> 00:10:08,789 ¿Qué ahora le meto un objeto cliente? 247 00:10:08,789 --> 00:10:10,429 o le meto un objeto cliente 248 00:10:10,429 --> 00:10:12,809 esto ocurre con una colección si yo no decido 249 00:10:12,809 --> 00:10:14,450 el tipo de dato aquí, que puedo hacerlo 250 00:10:14,450 --> 00:10:16,629 si yo no lo decido, entonces le puedo meter 251 00:10:16,629 --> 00:10:17,889 cualquier cosa que sea object 252 00:10:17,889 --> 00:10:20,389 y cualquier objeto en Java 253 00:10:20,389 --> 00:10:22,649 es object, porque cualquier clase 254 00:10:22,649 --> 00:10:24,029 hereda de object, como ya sabéis 255 00:10:24,029 --> 00:10:26,830 entonces, claro, a la hora de 256 00:10:26,830 --> 00:10:28,470 desarrollar esto 257 00:10:28,470 --> 00:10:30,730 en el momento en el que estás escribiendo 258 00:10:30,730 --> 00:10:32,309 el código, en el momento de escribirlo 259 00:10:32,309 --> 00:10:34,230 es que no te sale ningún error de compilación 260 00:10:34,230 --> 00:10:36,789 no te sale ninguno, si en este set 261 00:10:36,789 --> 00:10:37,730 cabe cualquier cosa 262 00:10:37,730 --> 00:10:40,070 y si fuera una lista lo mismo 263 00:10:40,070 --> 00:10:41,789 claro, me da igual, como si esto es una lista 264 00:10:41,789 --> 00:10:43,070 cualquier tipo de colección 265 00:10:43,070 --> 00:10:48,120 y yo decido no darle el parámetro 266 00:10:48,120 --> 00:10:53,519 como si es una lista 267 00:10:53,519 --> 00:10:55,360 yo decido en ese momento no comprometer 268 00:10:55,360 --> 00:10:57,299 el tipo de dato, pues cabe cualquier cosa 269 00:10:57,299 --> 00:10:58,799 pero claro 270 00:10:58,799 --> 00:11:01,399 que no salgan errores de compilación 271 00:11:01,399 --> 00:11:01,740 aquí 272 00:11:01,740 --> 00:11:05,740 luego seguramente se traduzca 273 00:11:05,740 --> 00:11:07,500 en que a la hora de ejecutarse las cosas 274 00:11:07,500 --> 00:11:08,480 aquí empiezo a cascar 275 00:11:08,480 --> 00:11:10,480 porque en esta colección hay de todo 276 00:11:10,480 --> 00:11:12,740 hay una cadena, luego hay un número 277 00:11:12,740 --> 00:11:13,700 Luego hay un cliente 278 00:11:13,700 --> 00:11:15,240 ¿Y qué pasa cuando yo itere por aquí? 279 00:11:16,700 --> 00:11:18,399 Imaginaos que yo ahora itero por la colección 280 00:11:18,399 --> 00:11:23,570 Tendría que iterar de esta manera 281 00:11:23,570 --> 00:11:30,600 Para cada cosa que sea object 282 00:11:30,600 --> 00:11:32,320 Porque es que yo no sé 283 00:11:32,320 --> 00:11:33,700 Qué es cada cosa de la colección 284 00:11:33,700 --> 00:11:34,360 No tengo ni idea 285 00:11:34,360 --> 00:11:36,200 Puede ser de lo que sea 286 00:11:36,200 --> 00:11:37,159 Solo sé que es object 287 00:11:37,159 --> 00:11:39,600 Pues tendríamos que iterar por la colección así 288 00:11:39,600 --> 00:11:41,519 ¿Y ahora con este objeto yo qué hago? 289 00:11:42,019 --> 00:11:44,039 A saber, tendría que empezar 290 00:11:44,039 --> 00:11:45,500 Con los get instance 291 00:11:45,500 --> 00:11:46,679 Viendo a ver qué es 292 00:11:46,679 --> 00:11:49,419 Con el instance of, perdón 293 00:11:49,419 --> 00:11:51,700 no os olvidéis del instansoft ni de nada de lo que hemos visto 294 00:11:51,700 --> 00:11:53,600 claro, si instansoft.do 295 00:11:53,600 --> 00:11:55,639 es un cliente hago no sé qué, si es un 296 00:11:55,639 --> 00:11:57,720 string hago no sé cuánto, o sea esto se convierte en una 297 00:11:57,720 --> 00:12:00,120 locura, por eso no es recomendable 298 00:12:00,120 --> 00:12:00,879 usar una lista 299 00:12:00,879 --> 00:12:03,919 sin parametrizar, porque entonces cuando la recorramos 300 00:12:03,919 --> 00:12:05,779 lo que hay aquí 301 00:12:05,779 --> 00:12:07,360 está declarado como object 302 00:12:07,360 --> 00:12:09,399 yo tengo que hacerle un casting 303 00:12:09,399 --> 00:12:11,779 cuando le haga el casting vete a saber 304 00:12:11,779 --> 00:12:13,340 si ha acertado o no ha acertado 305 00:12:13,340 --> 00:12:15,659 porque este en la primera iteración 306 00:12:15,659 --> 00:12:17,440 es un string, pero en la siguiente es un número 307 00:12:17,440 --> 00:12:19,659 el día siguiente es un cliente, entonces vete a saber 308 00:12:19,659 --> 00:12:21,799 con ese casting si luego un tiempo de ejecución 309 00:12:21,799 --> 00:12:23,480 me peta porque me dice, pero ¿qué estás 310 00:12:23,480 --> 00:12:24,279 convirtiendo a qué? 311 00:12:25,620 --> 00:12:27,679 entonces, aunque se pueden usar las colecciones 312 00:12:27,679 --> 00:12:29,460 sin comprometer ahí el tipo de datos y meter 313 00:12:29,460 --> 00:12:31,120 object, pues esto 314 00:12:31,120 --> 00:12:33,559 no es recomendable 315 00:12:33,559 --> 00:12:35,659 a menos que tenga uno muy controlado lo que va ahí 316 00:12:35,659 --> 00:12:37,539 y por eso es por lo que nos salen los 317 00:12:37,539 --> 00:12:39,620 avisos en amarillo, el aviso en amarillo 318 00:12:39,620 --> 00:12:41,580 no es un error de compilación, como ya sabéis 319 00:12:41,580 --> 00:12:43,179 me dice, cuidado 320 00:12:43,179 --> 00:12:44,519 hay un cuidado 321 00:12:44,519 --> 00:12:46,279 que 322 00:12:46,279 --> 00:12:49,159 deberías, de hecho te dice 323 00:12:49,159 --> 00:12:51,200 deberías parametrizarlo, te lo dice 324 00:12:51,200 --> 00:12:53,720 te lo recomienda, deberías parametrizarlo 325 00:12:53,720 --> 00:12:55,179 porque si no ahí cabe cualquier cosa 326 00:12:55,179 --> 00:12:57,340 que sea object, y luego tú ya 327 00:12:57,340 --> 00:12:59,220 vete a saber lo que es eso, como hagas 328 00:12:59,220 --> 00:13:01,139 casting, vale 329 00:13:01,139 --> 00:13:03,120 entonces no es este el uso habitual 330 00:13:03,120 --> 00:13:05,080 entonces 331 00:13:05,080 --> 00:13:14,679 vale 332 00:13:14,679 --> 00:13:15,720 entonces si yo ya 333 00:13:15,720 --> 00:13:18,759 he analizado bien la aplicación, la tengo ya bien 334 00:13:18,759 --> 00:13:19,840 analizada y diseñada 335 00:13:19,840 --> 00:13:22,480 pues entonces ya he visto, oye esta colección 336 00:13:22,480 --> 00:13:24,159 va a tener solamente alumnos 337 00:13:24,159 --> 00:13:25,580 pues la parametricio de alumnos 338 00:13:25,580 --> 00:13:27,340 esta colección va a tener solo cadenas 339 00:13:27,340 --> 00:13:28,460 pues la parametricio de cadenas 340 00:13:28,460 --> 00:13:31,360 si voy a tener alumnos y cadenas en mi aplicación 341 00:13:31,360 --> 00:13:33,179 pues me hago dos colecciones distintas 342 00:13:33,179 --> 00:13:34,779 como para los alumnos y dos para las cadenas 343 00:13:34,779 --> 00:13:37,639 no mezclo, aunque pueda no mezclo 344 00:13:37,639 --> 00:13:40,000 porque se nos va a complicar muchísimo el programa 345 00:13:40,000 --> 00:13:41,960 bueno pues en este caso 346 00:13:41,960 --> 00:13:43,620 que 347 00:13:43,620 --> 00:13:45,899 hicimos como una primera prueba 348 00:13:45,899 --> 00:13:46,379 de headset 349 00:13:46,379 --> 00:13:49,340 pues decidimos que no van a ser cadenas 350 00:13:49,340 --> 00:13:51,360 pues le pongo string y aquí no se me olvida 351 00:13:51,360 --> 00:13:53,460 también ponerle los corchetillos 352 00:13:53,460 --> 00:13:55,879 si no se los pongo me va a seguir dando ahí el aviso 353 00:13:55,879 --> 00:13:57,000 vale 354 00:13:57,000 --> 00:13:59,679 entonces 355 00:13:59,679 --> 00:14:01,440 se los pongo 356 00:14:01,440 --> 00:14:03,639 más que nada para que se me quite el aviso ese 357 00:14:03,639 --> 00:14:04,440 en amarillo ahí 358 00:14:04,440 --> 00:14:06,159 vale 359 00:14:06,159 --> 00:14:09,759 y ahora en cuanto hemos decidido que esto sea 360 00:14:09,759 --> 00:14:11,960 string, cuando hemos decidido que esto sea string 361 00:14:11,960 --> 00:14:14,059 pues automáticamente el compilador 362 00:14:14,059 --> 00:14:15,879 dice, ah lo siento solamente puedes 363 00:14:15,879 --> 00:14:18,059 meter un string, no puedes meter un numerito 364 00:14:18,059 --> 00:14:20,059 ni puedes meter un cliente, ni puedes meter nada 365 00:14:20,059 --> 00:14:20,860 que no sea un string 366 00:14:20,860 --> 00:14:22,779 vale 367 00:14:22,779 --> 00:14:24,639 bueno pues 368 00:14:24,639 --> 00:14:27,000 siempre y cuando metamos cosas 369 00:14:27,000 --> 00:14:29,159 que sean stream 370 00:14:29,159 --> 00:14:30,620 pues ya está, yo las meto 371 00:14:30,620 --> 00:14:32,159 y lo que estuvimos haciendo 372 00:14:32,159 --> 00:14:35,919 pues fue recorrer esta colección 373 00:14:35,919 --> 00:14:37,320 aquí para 374 00:14:37,320 --> 00:14:38,980 mostrarlos y no hicimos más 375 00:14:38,980 --> 00:14:40,279 el otro día de conjuntos 376 00:14:40,279 --> 00:14:41,519 vale 377 00:14:41,519 --> 00:14:44,320 bueno vamos a ver un pelín más 378 00:14:44,320 --> 00:14:46,279 pero solo muy por encima 379 00:14:46,279 --> 00:14:49,620 sobre que conceptos teóricos 380 00:14:49,620 --> 00:14:51,659 están basados, sobre qué conceptos libres están basados 381 00:14:51,659 --> 00:14:53,919 y luego ya las implicaciones 382 00:14:53,919 --> 00:14:55,100 prácticas de su uso 383 00:14:55,100 --> 00:14:57,360 que tienen alguna que hay que conocer 384 00:14:57,360 --> 00:14:58,639 para usarlas correctamente 385 00:14:58,639 --> 00:15:00,799 vale, entonces 386 00:15:00,799 --> 00:15:03,480 pues vamos a empezar 387 00:15:03,480 --> 00:15:05,379 con el headset, vale, vamos a empezar 388 00:15:05,379 --> 00:15:06,539 con el headset, para lo cual 389 00:15:06,539 --> 00:15:08,960 me vendría muy bien un 390 00:15:08,960 --> 00:15:11,519 vale, pues ya está 391 00:15:11,519 --> 00:15:28,830 bueno, a ver, pues entonces, la primera que decimos 392 00:15:29,370 --> 00:15:33,039 tampoco es que pinte mucho 393 00:15:33,039 --> 00:15:34,500 pero bueno, mira que me lo había imaginado 394 00:15:34,500 --> 00:15:35,360 cuando me lo habían dicho 395 00:15:35,360 --> 00:15:37,679 cuando me lo habían dado que este no iba a pintar 396 00:15:37,679 --> 00:15:40,399 vale, el hashed 397 00:15:40,399 --> 00:15:42,179 el hashed 398 00:15:42,179 --> 00:15:43,940 está relacionado 399 00:15:43,940 --> 00:15:45,840 con el concepto de 400 00:15:45,840 --> 00:15:47,559 tabla hash, vale 401 00:15:47,559 --> 00:15:53,129 voy a coger el otro, perdonadme 402 00:15:53,129 --> 00:15:55,029 porque con este no hacemos nada 403 00:15:55,029 --> 00:15:57,730 vale, ahora sí 404 00:15:57,730 --> 00:16:10,440 este es mucho mejor 405 00:16:12,240 --> 00:16:20,259 ¿Vale? Pues la implementación 406 00:16:20,259 --> 00:16:21,200 de este 407 00:16:21,200 --> 00:16:27,860 A ver, no sé si se va a ver escrito al revés 408 00:16:27,860 --> 00:16:29,080 pero bueno, da igual en la cámara 409 00:16:29,080 --> 00:16:33,879 La implementación del haset 410 00:16:33,879 --> 00:16:36,100 este entonces está basado en 411 00:16:36,100 --> 00:16:40,039 el concepto de tabla hash 412 00:16:40,039 --> 00:16:44,639 que es una idea 413 00:16:44,639 --> 00:16:46,980 con la que se trabaja en informática 414 00:16:46,980 --> 00:16:48,799 de toda la vida, bueno, en otros ámbitos también 415 00:16:48,799 --> 00:16:50,779 que en realidad no es nada, que es 416 00:16:50,779 --> 00:16:52,299 yo tengo un conjunto de cosas 417 00:16:52,299 --> 00:16:55,120 que pueden ser 418 00:16:55,120 --> 00:16:56,580 de más o menos complejidad 419 00:16:56,580 --> 00:16:58,799 cada una de ellas, vete a saber lo que puede ser cada una 420 00:16:58,799 --> 00:17:00,720 de ellas, desde un objeto 421 00:17:00,720 --> 00:17:02,860 como es en nuestro caso, a cualquier otro 422 00:17:02,860 --> 00:17:04,779 concepto, en función de donde esté yo 423 00:17:04,779 --> 00:17:06,680 trabajando, bueno, pues una 424 00:17:06,680 --> 00:17:07,819 función de hash 425 00:17:07,819 --> 00:17:09,900 es 426 00:17:09,900 --> 00:17:15,599 una función a la que tú le pasas 427 00:17:15,599 --> 00:17:17,279 uno de estos elementos 428 00:17:17,279 --> 00:17:18,920 y te la transforma 429 00:17:18,920 --> 00:17:20,240 en un número entero 430 00:17:20,240 --> 00:17:23,980 simplemente 431 00:17:23,980 --> 00:17:26,279 la función de hash 432 00:17:26,279 --> 00:17:29,079 te transforma los elementos 433 00:17:29,079 --> 00:17:30,319 a los que está aplicado 434 00:17:30,319 --> 00:17:32,039 en un número entero 435 00:17:32,039 --> 00:17:35,380 entonces la idea de fondo de esta transformación 436 00:17:35,380 --> 00:17:36,980 es poder 437 00:17:36,980 --> 00:17:38,660 trabajar de forma más fácil 438 00:17:38,660 --> 00:17:41,380 con esta colección de números 439 00:17:41,380 --> 00:17:46,319 que con los objetos en sí, no para todas las tareas 440 00:17:46,319 --> 00:17:50,160 solo para algunas, claro, porque la tabla hash 441 00:17:50,160 --> 00:17:53,400 de cada elemento solo tiene un número asociado 442 00:17:53,400 --> 00:17:58,460 pero para tareas del tipo de distinguir si son iguales, ver proximidades 443 00:17:58,460 --> 00:18:02,019 hacer agrupaciones, pues a través del numerito asociado 444 00:18:02,019 --> 00:18:06,579 se pueden ya hacer cosas, se pueden hacer funciones solamente con ese numerito asociado 445 00:18:06,579 --> 00:18:10,119 sin que haga falta el resto 446 00:18:10,119 --> 00:18:11,819 de la información del objeto 447 00:18:11,819 --> 00:18:14,500 y a veces también en función de cómo esta 448 00:18:14,500 --> 00:18:16,660 función de hash esté hecha 449 00:18:16,660 --> 00:18:18,579 en función de cómo esté hecha 450 00:18:18,579 --> 00:18:20,599 este numerito entero también puede dar información 451 00:18:20,599 --> 00:18:23,000 de cosas de dentro del objeto 452 00:18:23,000 --> 00:18:24,940 tiene aplicaciones en seguridad 453 00:18:24,940 --> 00:18:25,640 en cosas 454 00:18:25,640 --> 00:18:28,400 entonces una función de hash es simplemente una función 455 00:18:28,400 --> 00:18:30,359 que coge elementos 456 00:18:30,359 --> 00:18:32,500 de un sistema y los transforma en un número entero 457 00:18:32,500 --> 00:18:33,599 porque si yo tengo 458 00:18:33,599 --> 00:18:36,160 esos elementos convertidos en números enteros 459 00:18:36,160 --> 00:18:37,819 hay cosas que las puedo hacer más fácil 460 00:18:37,819 --> 00:18:38,900 más fácilmente 461 00:18:38,900 --> 00:18:41,000 entonces 462 00:18:41,000 --> 00:18:42,940 ¿cómo es la función de hash? 463 00:18:43,519 --> 00:18:44,960 como a uno le dé la gana 464 00:18:44,960 --> 00:18:47,380 cualquier función que transforma 465 00:18:47,380 --> 00:18:49,359 un elemento en número entero ya es una función 466 00:18:49,359 --> 00:18:49,839 de hash 467 00:18:49,839 --> 00:18:52,900 incluso una función que lo que hace es 468 00:18:52,900 --> 00:18:54,380 cualquier elemento 469 00:18:54,380 --> 00:18:57,039 lo transforma en el 470 00:18:57,039 --> 00:18:57,980 número 1 471 00:18:57,980 --> 00:19:00,500 también es una función de hash, es decir 472 00:19:00,500 --> 00:19:02,980 no todas las funciones de hash tienen que transformar 473 00:19:02,980 --> 00:19:04,420 los elementos en números distintos 474 00:19:04,420 --> 00:19:07,240 no tienen por qué, lo pueden transformar en el 475 00:19:07,240 --> 00:19:09,000 mismo, a lo mejor estos dos van al 3 476 00:19:09,000 --> 00:19:10,859 este va al 5 477 00:19:10,859 --> 00:19:13,119 vamos, que la función de hash se puede 478 00:19:13,119 --> 00:19:14,500 hacer como a uno le dé la gana 479 00:19:14,500 --> 00:19:17,240 pero claro, la tendría que hacer 480 00:19:17,240 --> 00:19:18,759 adaptada a qué 481 00:19:18,759 --> 00:19:20,940 espera, qué quiere hacer con esos 482 00:19:20,940 --> 00:19:22,299 numeritos, ¿vale? 483 00:19:23,200 --> 00:19:24,980 entonces muchas veces la función de hash 484 00:19:24,980 --> 00:19:26,480 se usa para cosas de dispersión 485 00:19:26,480 --> 00:19:28,980 para facilitar separar los elementos 486 00:19:28,980 --> 00:19:31,160 entonces son elementos que si tú los tratas 487 00:19:31,160 --> 00:19:33,339 así, es más confuso tratarlos 488 00:19:33,339 --> 00:19:35,059 pero si tú les aplicas una 489 00:19:35,059 --> 00:19:36,680 función de hash que los dispersa 490 00:19:36,680 --> 00:19:38,500 a números muy separados 491 00:19:38,500 --> 00:19:41,259 pues computacionalmente igual es más fácil 492 00:19:41,259 --> 00:19:43,240 manejarlo, entonces a veces es una especie 493 00:19:43,240 --> 00:19:44,380 de función de dispersión 494 00:19:44,380 --> 00:19:47,180 para muchas cosas se usa, depende 495 00:19:47,180 --> 00:19:49,259 de la aplicación, para un montón de cosas 496 00:19:49,259 --> 00:19:51,160 se usa, ¿vale? pero es simplemente eso 497 00:19:51,160 --> 00:19:53,000 bueno 498 00:19:53,000 --> 00:19:54,460 pues el hash set 499 00:19:54,460 --> 00:19:57,180 utiliza internamente una tabla hash 500 00:19:57,180 --> 00:19:59,079 para cada objeto 501 00:19:59,079 --> 00:20:01,000 de la colección le hace corresponder 502 00:20:01,000 --> 00:20:01,640 un numerito 503 00:20:01,640 --> 00:20:04,940 le hace corresponder un número entero 504 00:20:04,940 --> 00:20:07,839 y cuando tiene que trabajar dentro 505 00:20:07,839 --> 00:20:09,920 para ver si dos elementos son iguales 506 00:20:09,920 --> 00:20:11,839 si un elemento está, que son cosas 507 00:20:11,839 --> 00:20:13,500 que el hash set tiene que hacer todo el rato 508 00:20:13,500 --> 00:20:15,680 cuando hacemos un add 509 00:20:15,680 --> 00:20:17,960 de un elemento cualquiera a la colección 510 00:20:17,960 --> 00:20:20,180 o cuando hacemos un remove 511 00:20:20,180 --> 00:20:23,660 pues el hash set tiene que mirar 512 00:20:23,660 --> 00:20:25,279 si este elemento está o no está 513 00:20:25,279 --> 00:20:27,160 para hacer el add o no hacerlo 514 00:20:27,160 --> 00:20:29,660 cuando hacemos un remove tiene que mirar 515 00:20:29,660 --> 00:20:30,859 si este elemento está o no está 516 00:20:30,859 --> 00:20:32,019 para eliminarlo o no 517 00:20:32,019 --> 00:20:33,440 entonces 518 00:20:33,440 --> 00:20:35,740 le va a ser más rápido 519 00:20:35,740 --> 00:20:38,660 ver si un elemento está o no está en la tabla hash 520 00:20:38,660 --> 00:20:40,019 a través del código hash 521 00:20:40,019 --> 00:20:41,960 que a través del propio elemento 522 00:20:41,960 --> 00:20:43,859 porque se hace 523 00:20:43,859 --> 00:20:46,359 aplica la función de hash a este 524 00:20:46,359 --> 00:20:48,299 y dice, a ver 525 00:20:48,299 --> 00:20:49,740 este se corresponde con el 3 526 00:20:49,740 --> 00:20:50,839 ah, pues sí 527 00:20:50,839 --> 00:20:54,460 el elemento que se corresponde con el 3 lo tengo 528 00:20:54,460 --> 00:20:55,619 entonces 529 00:20:55,619 --> 00:20:56,940 lo borro 530 00:20:56,940 --> 00:21:00,140 entonces si tiene una especie de asociación de números 531 00:21:00,140 --> 00:21:01,319 a los elementos 532 00:21:01,319 --> 00:21:03,460 la gestión de algunas cosas 533 00:21:03,460 --> 00:21:04,359 va a ser muy rápida 534 00:21:04,359 --> 00:21:07,299 bueno, pues eso es lo que se basa 535 00:21:07,299 --> 00:21:08,279 de fondo, esto 536 00:21:08,279 --> 00:21:10,859 y ya está, el haset 537 00:21:10,859 --> 00:21:13,599 en los elementos que están en el conjunto 538 00:21:13,599 --> 00:21:14,460 que son estos 539 00:21:14,460 --> 00:21:16,400 les asocia un numerito 540 00:21:16,400 --> 00:21:18,380 y algunas de las cosas 541 00:21:18,380 --> 00:21:20,960 de gestión interna suya 542 00:21:20,960 --> 00:21:23,279 las hace directamente sobre los numeritos 543 00:21:23,279 --> 00:21:25,480 porque va a ser mucho más rápido en un array de números 544 00:21:25,480 --> 00:21:27,420 que directamente 545 00:21:27,420 --> 00:21:28,880 navegar por los objetos 546 00:21:28,880 --> 00:21:31,240 que va a ser mucho más rápido trabajar en un array de números 547 00:21:31,240 --> 00:21:34,299 esa es la idea 548 00:21:34,299 --> 00:21:35,480 de cómo funciona por dentro 549 00:21:35,480 --> 00:21:37,819 y de hecho 550 00:21:37,819 --> 00:21:40,319 es la colección 551 00:21:40,319 --> 00:21:42,480 prácticamente la más 552 00:21:42,480 --> 00:21:43,740 rápida que hay 553 00:21:43,740 --> 00:21:45,819 la más rápida 554 00:21:45,819 --> 00:21:47,160 y la más eficiente 555 00:21:47,160 --> 00:21:50,220 entonces si uno tiene que hacer una colección de cosas 556 00:21:50,220 --> 00:21:52,180 y la posición no le importa 557 00:21:52,180 --> 00:21:53,660 y no necesita 558 00:21:53,660 --> 00:21:55,559 que se repitan elementos 559 00:21:55,559 --> 00:21:57,640 pues directamente ni se lo piensa 560 00:21:57,640 --> 00:21:59,819 hace un hashet y ya está 561 00:21:59,819 --> 00:22:01,720 que es la más eficiente 562 00:22:01,720 --> 00:22:03,200 por estar hecha por dentro 563 00:22:03,200 --> 00:22:04,680 con una tabla hash, la más eficiente 564 00:22:04,680 --> 00:22:06,880 vale 565 00:22:06,880 --> 00:22:09,700 bueno, pues entonces, más cosas 566 00:22:09,700 --> 00:22:13,119 internamente 567 00:22:13,119 --> 00:22:15,259 el hash set, como he dicho, lo que lleva 568 00:22:15,259 --> 00:22:17,180 es los códigos hash de cada elemento 569 00:22:17,180 --> 00:22:18,240 a un array de numeritos 570 00:22:18,240 --> 00:22:20,559 y trabaja con ese array para algunas cosas 571 00:22:20,559 --> 00:22:21,920 que es muy rápido y muy eficiente 572 00:22:21,920 --> 00:22:24,480 pero claro, los arrays 573 00:22:24,480 --> 00:22:26,420 vale, están muy bien 574 00:22:26,420 --> 00:22:29,019 hasta cierto punto, cuando el array 575 00:22:29,019 --> 00:22:30,519 ya empieza a ser muy grandote 576 00:22:30,519 --> 00:22:32,920 es decir, si yo tuviera un set 577 00:22:32,920 --> 00:22:34,740 un hash set de muchas cosas 578 00:22:34,740 --> 00:22:36,980 el array de códigos hash 579 00:22:36,980 --> 00:22:38,299 empezaría a ser ya muy grande 580 00:22:38,299 --> 00:22:41,099 entonces ya no sería tan eficiente ese hash set 581 00:22:41,099 --> 00:22:43,019 porque los arrays son muy engorrosos 582 00:22:43,019 --> 00:22:44,380 también para 583 00:22:44,380 --> 00:22:46,900 si yo tengo que insertar 584 00:22:46,900 --> 00:22:48,420 uno nuevo, ya sabéis que un array 585 00:22:48,420 --> 00:22:50,700 tengo que hacer otro, y copiar y pegar 586 00:22:50,700 --> 00:22:52,240 entonces si tengo 10.000 587 00:22:52,240 --> 00:22:54,680 y quiero insertar el 10.001, tengo que hacer 588 00:22:54,680 --> 00:22:56,680 un array de 10.001 y copiar 589 00:22:56,680 --> 00:22:57,559 10.000 en ese 590 00:22:57,559 --> 00:23:00,680 entonces, llegados a cierto tamaño 591 00:23:00,680 --> 00:23:02,380 de Arrays, pues esto ya 592 00:23:02,380 --> 00:23:04,660 tener un Array de números tampoco es tan bueno 593 00:23:04,660 --> 00:23:06,599 entonces el hash es lo que hace 594 00:23:06,599 --> 00:23:07,539 es una especie de 595 00:23:07,539 --> 00:23:09,000 intermedio 596 00:23:09,000 --> 00:23:11,200 y se hace una tablita 597 00:23:11,200 --> 00:23:14,920 de un tamaño razonable 598 00:23:14,920 --> 00:23:16,599 de un tamaño razonable 599 00:23:16,599 --> 00:23:20,660 y ahí es donde va a llevar los códigos 600 00:23:20,660 --> 00:23:22,500 hash de los elementos que se van metiendo 601 00:23:22,500 --> 00:23:29,599 ¿vale? y entonces 602 00:23:29,599 --> 00:23:31,539 ¿qué pasa? 603 00:23:31,539 --> 00:23:33,039 cuando yo meta 604 00:23:33,039 --> 00:23:34,779 silencio por favor 605 00:23:34,779 --> 00:23:36,500 cuando yo meta uno más 606 00:23:36,500 --> 00:23:39,279 y ya no quepa aquí en mi tabla 607 00:23:39,279 --> 00:23:40,339 ¿qué hace? 608 00:23:41,119 --> 00:23:43,279 pues lo que hace es empezar a colgarlos 609 00:23:43,279 --> 00:23:44,859 en una lista enlazada desde aquí 610 00:23:44,859 --> 00:23:47,380 luego el hashed lo que tiene 611 00:23:47,380 --> 00:23:48,799 dentro en realidad es esto 612 00:23:48,799 --> 00:23:58,069 tiene una array 613 00:23:58,069 --> 00:23:59,990 una array donde tiene 614 00:23:59,990 --> 00:24:01,549 unos cuantos elementos 615 00:24:01,549 --> 00:24:03,369 o más bien el código de esos elementos 616 00:24:03,369 --> 00:24:06,089 y luego los que ya van desbordando 617 00:24:06,089 --> 00:24:08,009 porque ya estamos metidos los que ya van desbordando 618 00:24:08,009 --> 00:24:09,930 van colgando desde una lista enlazada 619 00:24:09,930 --> 00:24:18,000 desde la posición del array que sea 620 00:24:18,000 --> 00:24:23,079 entonces esto es lo que es 621 00:24:23,079 --> 00:24:25,140 un hasher por dentro, que no lo vamos a programar 622 00:24:25,140 --> 00:24:26,940 nosotros y nos da igual, pero sí 623 00:24:26,940 --> 00:24:28,700 está bien que lo sepamos 624 00:24:28,700 --> 00:24:30,619 para ver luego como tenemos que usarlo 625 00:24:30,619 --> 00:24:32,500 entonces 626 00:24:32,500 --> 00:24:34,920 el hasher cuando le damos un elemento 627 00:24:34,920 --> 00:24:37,039 a meter con el add 628 00:24:37,039 --> 00:24:37,539 x 629 00:24:37,539 --> 00:24:41,119 el que hace, primero le aplica 630 00:24:41,119 --> 00:24:42,619 el código, la función de hash 631 00:24:42,619 --> 00:24:44,619 le aplica la función, bueno 632 00:24:44,619 --> 00:24:46,579 lo primero que tiene que ver es ver si ese elemento está o no 633 00:24:46,579 --> 00:24:47,920 antes de insertar 634 00:24:47,920 --> 00:24:49,960 vale, pues para ver si está 635 00:24:49,960 --> 00:24:53,160 lo primero que hace es meterle la función de hash 636 00:24:53,160 --> 00:24:53,819 a este elemento 637 00:24:53,819 --> 00:24:56,279 para ver a qué posición de la tabla cae 638 00:24:56,279 --> 00:24:59,140 entonces la función de hash a lo mejor le lleva 639 00:24:59,140 --> 00:24:59,400 aquí 640 00:24:59,400 --> 00:25:02,920 si aquí no hay nadie, fenomenal 641 00:25:02,920 --> 00:25:04,720 ese elemento no está, pues lo insertamos 642 00:25:04,720 --> 00:25:07,039 pero si aquí si hay alguien 643 00:25:07,039 --> 00:25:09,319 ahora ya 644 00:25:09,319 --> 00:25:11,140 lo que tiene 645 00:25:11,140 --> 00:25:13,380 puede ocurrir que haya solo uno 646 00:25:13,380 --> 00:25:14,619 o que haya varios 647 00:25:14,619 --> 00:25:15,579 porque haya desbordado 648 00:25:15,579 --> 00:25:17,900 entonces tiene que recorrer toda la lista 649 00:25:17,900 --> 00:25:18,480 enlazada 650 00:25:18,480 --> 00:25:21,160 tiene que recorrer toda la lista enlazada 651 00:25:21,160 --> 00:25:23,660 para ver si es igual a este 652 00:25:23,660 --> 00:25:24,740 o si es igual a este 653 00:25:24,740 --> 00:25:25,779 o si es igual a este 654 00:25:25,779 --> 00:25:29,079 entonces para ver si es igual y si es igual 655 00:25:29,079 --> 00:25:31,019 lo que aplica ya es el equals 656 00:25:31,019 --> 00:25:33,180 entonces el hashSet 657 00:25:33,180 --> 00:25:35,259 cuando le pasamos un elemento 658 00:25:35,259 --> 00:25:37,140 le aplica 659 00:25:37,140 --> 00:25:38,799 dos pasos 660 00:25:38,799 --> 00:25:40,220 para ver si está o no está 661 00:25:40,220 --> 00:25:42,559 primero la función de hash 662 00:25:42,559 --> 00:25:44,420 que es el famoso hashCode que nos generaba 663 00:25:44,420 --> 00:25:45,500 que lo hemos ignorado hasta ahora 664 00:25:45,500 --> 00:25:47,920 primero la función de hash que le lleva a la posición 665 00:25:47,920 --> 00:25:50,059 y luego aplicando el equals 666 00:25:50,059 --> 00:25:52,359 hasta que 667 00:25:52,359 --> 00:25:53,940 lo encuentre 668 00:25:53,940 --> 00:25:55,299 ¿vale? luego 669 00:25:55,299 --> 00:25:58,420 cuando usamos un hashSet de elementos 670 00:25:58,420 --> 00:26:00,299 la clase 671 00:26:00,299 --> 00:26:02,480 a la que pertenecen los elementos del hashSet 672 00:26:02,480 --> 00:26:04,519 tiene que tener implementado el hashCode y el equals 673 00:26:04,519 --> 00:26:06,680 porque si no tiene implementado 674 00:26:06,680 --> 00:26:07,819 el hashSet 675 00:26:07,819 --> 00:26:09,799 su criterio de igualdad 676 00:26:09,799 --> 00:26:11,380 no va a funcionar correctamente 677 00:26:11,380 --> 00:26:13,980 porque para el hashSet el criterio de igualdad es 678 00:26:13,980 --> 00:26:16,460 primero llamo a la función de hash 679 00:26:16,460 --> 00:26:18,119 y ahora voy llamando al equals 680 00:26:18,119 --> 00:26:19,980 esa es la idea 681 00:26:19,980 --> 00:26:21,640 vamos a ver ahora cómo se aplica 682 00:26:21,640 --> 00:26:23,259 pero bueno, más o menos está claro, ¿no? 683 00:26:23,259 --> 00:26:23,940 cómo lo ubica 684 00:26:23,940 --> 00:26:28,119 se hace una tablita de numeritos asociados a cada uno 685 00:26:28,119 --> 00:26:29,960 cuando tengo más 686 00:26:29,960 --> 00:26:31,759 de los que me caben en la tablita 687 00:26:31,759 --> 00:26:34,519 voy colgándolos en listas enlazadas 688 00:26:34,519 --> 00:26:36,819 y que van desbordando 689 00:26:36,819 --> 00:26:38,660 y ahí ya no hay tamaño máximo límite 690 00:26:38,660 --> 00:26:40,880 porque estas listas enlazadas pueden crecer hasta el infinito 691 00:26:40,880 --> 00:26:43,220 entonces uno puede 692 00:26:43,220 --> 00:26:45,619 configurar el hasset 693 00:26:45,619 --> 00:26:47,339 uno puede configurarlo para decidir 694 00:26:47,339 --> 00:26:49,140 qué tamaño de tabla quiere, que eso sería 695 00:26:49,140 --> 00:26:51,119 lo ideal, claro, y lo óptimo 696 00:26:51,119 --> 00:26:53,619 en función de la cantidad 697 00:26:53,619 --> 00:26:55,380 de elementos que tú estimas 698 00:26:55,380 --> 00:26:57,500 que va a haber en el hasset prácticamente 699 00:26:57,500 --> 00:26:59,480 siempre, yo creo que casi siempre va a haber 7 700 00:26:59,480 --> 00:27:01,259 a lo mejor hay veces que hay más 701 00:27:01,259 --> 00:27:03,359 y hay veces que hay menos, pero la mayor parte 702 00:27:03,359 --> 00:27:05,460 del tiempo hay 7, pues uno puede 703 00:27:05,460 --> 00:27:06,660 hacer una tabla de 7 704 00:27:06,660 --> 00:27:09,099 ¿vale? pues 705 00:27:09,099 --> 00:27:11,339 estimo que casi todo el tiempo 706 00:27:11,339 --> 00:27:13,319 va a haber en torno a 10 707 00:27:13,319 --> 00:27:15,359 a veces más, a veces menos 708 00:27:15,359 --> 00:27:17,140 pues uno puede establecer una tabla de 10 709 00:27:17,140 --> 00:27:18,660 entonces eso es configurable en el hashing 710 00:27:18,660 --> 00:27:21,099 pero normalmente uno se mete a configurar eso 711 00:27:21,099 --> 00:27:23,039 primero porque no es 712 00:27:23,039 --> 00:27:24,440 que sea especialmente sencillo 713 00:27:24,440 --> 00:27:27,180 y segundo porque tendría que tener 714 00:27:27,180 --> 00:27:28,900 perfectamente estudiado su problema 715 00:27:28,900 --> 00:27:30,519 para ver en tiempo real 716 00:27:30,519 --> 00:27:32,740 realmente cuántos datos va a haber 717 00:27:32,740 --> 00:27:34,799 la mayor parte del tiempo y eso es muy complicado de saber 718 00:27:34,799 --> 00:27:36,240 entonces normalmente 719 00:27:36,240 --> 00:27:38,900 uno no configura la tabla 720 00:27:38,900 --> 00:27:40,680 de hash con los valores que quiera 721 00:27:40,680 --> 00:27:43,400 sino que le deja al hash set 722 00:27:43,400 --> 00:27:45,039 que lo haga él con su configuración 723 00:27:45,039 --> 00:27:46,500 por defecto 724 00:27:46,500 --> 00:27:48,839 y él pues bueno 725 00:27:48,839 --> 00:27:51,259 ya veremos, hace ya una configuración 726 00:27:51,259 --> 00:27:52,259 por defecto y ya está 727 00:27:52,259 --> 00:27:54,940 o sea los dos extremos 728 00:27:54,940 --> 00:27:57,160 serían una tabla de hash 729 00:27:57,160 --> 00:27:59,160 solo con una posición, ese sería un 730 00:27:59,160 --> 00:28:00,920 extremo, pero entonces 731 00:28:00,920 --> 00:28:02,880 todos los elementos estarían colgando 732 00:28:02,880 --> 00:28:05,099 desbordando de aquí, luego una tabla 733 00:28:05,099 --> 00:28:06,480 de hash con una única posición 734 00:28:06,480 --> 00:28:08,740 en realidad es como una lista enlazada, no hemos cambiado nada 735 00:28:08,740 --> 00:28:10,099 es igual que una lista enlazada 736 00:28:10,099 --> 00:28:12,619 luego no hemos ganado en eficiencia 737 00:28:12,619 --> 00:28:14,539 un hash set 738 00:28:14,539 --> 00:28:15,539 con una tabla de hash 739 00:28:15,539 --> 00:28:18,359 donde hay tantos 740 00:28:18,359 --> 00:28:20,039 elementos 741 00:28:20,039 --> 00:28:22,079 tantas posiciones como elementos 742 00:28:22,079 --> 00:28:24,480 sería como un array, luego tampoco hemos ganado 743 00:28:24,480 --> 00:28:24,799 nada 744 00:28:24,799 --> 00:28:28,660 entonces el hash set es una especie 745 00:28:28,660 --> 00:28:30,680 de intermedio 746 00:28:30,680 --> 00:28:32,500 entre lo bueno que es el array 747 00:28:32,500 --> 00:28:34,339 y luego 748 00:28:34,339 --> 00:28:36,019 cuando ya no quiero estirar más el array 749 00:28:36,019 --> 00:28:37,779 porque es pesado, voy desbordando 750 00:28:37,779 --> 00:28:39,559 en listas enlazadas 751 00:28:39,559 --> 00:28:41,660 es una especie de mezcla de las dos cosas 752 00:28:41,660 --> 00:28:42,420 ni una ni otra 753 00:28:42,420 --> 00:28:46,039 y repito, lo ideal sería adaptar esta tabla 754 00:28:46,039 --> 00:28:47,180 a mi situación real 755 00:28:47,180 --> 00:28:48,680 pero eso no es fácil 756 00:28:48,680 --> 00:28:51,359 se hace una configuración por defecto y ya está 757 00:28:51,359 --> 00:28:55,099 bueno, esta es la idea de cómo funciona por dentro 758 00:28:55,099 --> 00:28:57,059 y de lo que es una tabla hash 759 00:28:57,059 --> 00:28:58,519 que se aplica en un montón de casos 760 00:28:58,519 --> 00:29:01,059 y de por qué tiene interés esta 761 00:29:01,059 --> 00:29:03,259 esta estructura 762 00:29:03,259 --> 00:29:06,339 vale, pues 763 00:29:06,339 --> 00:30:02,960 Vale, pues bueno, para no liarlo mucho 764 00:30:02,960 --> 00:30:04,339 Vamos a hacer un proyecto 765 00:30:04,339 --> 00:30:09,539 Ejemplo de conjuntos 766 00:30:09,539 --> 00:30:30,809 Vale, pues venga, vamos a hacerle un paquete 767 00:30:30,809 --> 00:30:33,829 Para el modelo de datos 768 00:30:33,829 --> 00:30:35,670 Como solo un ejemplo, una cosa sencilla 769 00:30:35,670 --> 00:30:39,150 Y luego ya en ejercicios, aplicaciones 770 00:30:39,150 --> 00:30:41,349 Ya lo aplicáis vosotros con más clases 771 00:30:41,349 --> 00:30:51,430 Pues venga, vamos a 772 00:30:51,430 --> 00:30:55,750 Lo primero que se nos ocurre siempre 773 00:30:55,750 --> 00:30:57,009 Bueno, venga, no vamos a cambiar 774 00:30:57,009 --> 00:30:59,589 Pues yo que sé, una clase 775 00:30:59,589 --> 00:31:00,890 Jugador 776 00:31:00,890 --> 00:31:02,910 Cualquiera 777 00:31:02,910 --> 00:31:11,609 El número 778 00:31:11,609 --> 00:31:21,099 El nombre y el equipo, por ejemplo 779 00:31:21,099 --> 00:31:22,839 Porque tenga tres propiedades 780 00:31:22,839 --> 00:31:28,710 Vamos a hacerle el constructor 781 00:31:28,710 --> 00:31:52,480 Y un constructor 782 00:31:52,480 --> 00:31:54,059 Sin parámetros, que siempre 783 00:31:54,059 --> 00:31:56,500 Nos gusta 784 00:31:56,500 --> 00:31:57,779 Bueno, a mí por lo menos 785 00:31:57,779 --> 00:32:05,160 ¡Hala! 786 00:32:05,559 --> 00:32:06,000 Ya está 787 00:32:06,000 --> 00:32:11,579 Bueno, pues vamos a hacer un main cualquiera 788 00:32:11,579 --> 00:32:14,259 que con un conjunto de jugadores 789 00:32:14,259 --> 00:32:15,380 y ya está 790 00:32:15,380 --> 00:32:53,460 vale, pues si vamos a trabajar 791 00:32:53,460 --> 00:32:54,859 con un montón de jugadores 792 00:32:54,859 --> 00:32:56,400 pues un montón de jugadores 793 00:32:56,400 --> 00:33:01,329 si el mismo jugador no va a estar dos veces 794 00:33:01,329 --> 00:33:03,150 en mi conjunto de datos 795 00:33:03,150 --> 00:33:05,529 pues puedo elegir 796 00:33:05,529 --> 00:33:07,430 un conjunto y ya está 797 00:33:07,430 --> 00:33:16,039 ¿qué implementación? 798 00:33:16,339 --> 00:33:21,140 bueno, pues podemos elegir 799 00:33:21,140 --> 00:33:22,940 esta implementación que por ahora es la única 800 00:33:22,940 --> 00:33:24,079 que conocemos 801 00:33:24,079 --> 00:33:26,140 ¿vale? 802 00:33:26,140 --> 00:33:29,240 Entonces yo tengo mucha manía 803 00:33:29,240 --> 00:33:31,359 De en el momento de declararlo 804 00:33:31,359 --> 00:33:33,119 Decir simplemente 805 00:33:33,119 --> 00:33:34,599 La interfaz a la que pertenece 806 00:33:34,599 --> 00:33:36,519 Y luego cuando lo instancio 807 00:33:36,519 --> 00:33:38,299 Ya tengo que decir el tipo de dato 808 00:33:38,299 --> 00:33:40,119 Pero a ver, uno puede 809 00:33:40,119 --> 00:33:43,220 También podéis hacer esto 810 00:33:43,220 --> 00:33:46,460 ¿Vale? 811 00:33:46,539 --> 00:33:48,319 También podéis desde ya decir 812 00:33:48,319 --> 00:33:49,660 Es que esto va a ser un hashet 813 00:33:49,660 --> 00:33:50,799 Si o si 814 00:33:50,799 --> 00:33:54,220 Vamos a importar jugador 815 00:33:54,220 --> 00:33:59,680 ¿Vale? 816 00:33:59,759 --> 00:34:01,940 A efectos prácticos 817 00:34:01,940 --> 00:34:02,779 da un poco igual 818 00:34:02,779 --> 00:34:06,019 ya sabéis la diferencia, claro, la diferencia 819 00:34:06,019 --> 00:34:07,740 es que en esta variable jugadores 820 00:34:07,740 --> 00:34:09,980 ahora ya, de aquí para 821 00:34:09,980 --> 00:34:12,019 todo el futuro, solamente 822 00:34:12,019 --> 00:34:14,199 pueden ir haset, porque está declarada así 823 00:34:14,199 --> 00:34:16,420 pero si la declaráis así 824 00:34:16,420 --> 00:34:20,139 vale, pues entonces en esta variable 825 00:34:20,139 --> 00:34:21,059 cabe cualquier cosa 826 00:34:21,059 --> 00:34:24,300 aquí se nota menos 827 00:34:24,300 --> 00:34:26,059 las implicaciones de esto, pero 828 00:34:26,059 --> 00:34:27,500 ahora un segundo y ahora paramos 829 00:34:27,500 --> 00:34:29,699 pero imaginaos que tengo yo aquí un método 830 00:34:29,699 --> 00:34:31,320 para mostrar 831 00:34:31,320 --> 00:34:34,440 Vamos a mostrar 832 00:34:34,440 --> 00:34:35,840 Nombres de jugadores 833 00:34:35,840 --> 00:34:36,719 Por ejemplo 834 00:34:36,719 --> 00:34:39,920 Imaginaos que me hago yo aquí 835 00:34:39,920 --> 00:34:41,179 Un método dentro de mi main 836 00:34:41,179 --> 00:34:47,010 Con el único objetivo de mostrar por consola 837 00:34:47,010 --> 00:34:51,349 Los nombres 838 00:34:51,349 --> 00:34:52,949 De un montón de jugadores 839 00:34:52,949 --> 00:34:59,730 Vale, entonces yo aquí le tengo que pasar 840 00:34:59,730 --> 00:35:01,230 Un conjunto de jugadores 841 00:35:01,230 --> 00:35:02,789 Entonces esto yo lo puedo 842 00:35:02,789 --> 00:35:04,829 Declarar así 843 00:35:04,829 --> 00:35:16,619 Si lo declaro así 844 00:35:16,619 --> 00:35:18,860 Yo ahora ya pues haría 845 00:35:18,860 --> 00:35:20,780 Recorrer el set de jugadores 846 00:35:20,780 --> 00:35:22,000 etcétera, lo que hiciera falta 847 00:35:22,000 --> 00:35:22,679 vale 848 00:35:22,679 --> 00:35:26,860 entonces aquí 849 00:35:26,860 --> 00:35:29,340 en el momento de declarar un conjunto 850 00:35:29,340 --> 00:35:30,500 como parámetro de un método 851 00:35:30,500 --> 00:35:32,539 aquí sí que es recomendable 852 00:35:32,539 --> 00:35:33,539 y tiene su interés 853 00:35:33,539 --> 00:35:35,739 que yo lo deje abierto y diga 854 00:35:35,739 --> 00:35:37,179 con que sea un conjunto me vale 855 00:35:37,179 --> 00:35:39,619 porque así luego a este método 856 00:35:39,619 --> 00:35:41,300 imaginaos que yo lo quiero llamar por aquí 857 00:35:41,300 --> 00:35:46,360 si no le pongo lo static 858 00:35:46,360 --> 00:35:47,400 no me va a dejar llamarle 859 00:35:47,400 --> 00:36:02,989 vale, porque ahora imaginaos que yo llamo a este método 860 00:36:02,989 --> 00:36:04,730 perfectamente 861 00:36:04,730 --> 00:36:06,510 en este método le puedo llamar 862 00:36:06,510 --> 00:36:07,570 con la colección de arriba 863 00:36:07,570 --> 00:36:09,289 porque es un hash set 864 00:36:09,289 --> 00:36:12,610 y este necesita un set 865 00:36:12,610 --> 00:36:13,409 luego estupendo 866 00:36:13,409 --> 00:36:15,690 que ahora cambio y digo 867 00:36:15,690 --> 00:36:18,349 ha cambiado mi código 868 00:36:18,349 --> 00:36:19,269 ha cambiado mi main 869 00:36:19,269 --> 00:36:22,489 y esto ahora ya no va a ser un hash set 870 00:36:22,489 --> 00:36:24,590 sino que es un tree set porque ha cambiado mi main 871 00:36:24,590 --> 00:36:28,929 genial, este método le da igual 872 00:36:28,929 --> 00:36:30,989 este método le da exactamente 873 00:36:30,989 --> 00:36:32,389 lo mismo, entonces la idea es 874 00:36:32,389 --> 00:36:34,949 cuando yo tengo que incorporar alguna modificación en un código 875 00:36:34,949 --> 00:36:37,530 que eso afecte lo menos posible a lo demás 876 00:36:37,530 --> 00:36:39,510 eso es un principio básico 877 00:36:39,510 --> 00:36:41,670 del desarrollo, si tengo que modificar algo 878 00:36:41,670 --> 00:36:43,449 que salpique lo menos posible 879 00:36:43,449 --> 00:36:45,570 a los demás, entonces si yo 880 00:36:45,570 --> 00:36:47,849 aquí hubiera decidido 881 00:36:47,849 --> 00:36:49,090 declarar este parámetro 882 00:36:49,090 --> 00:36:51,010 ya como haset 883 00:36:51,010 --> 00:36:53,530 pues entonces aquí ya era lío 884 00:36:53,530 --> 00:36:55,530 porque si yo he cambiado mi código 885 00:36:55,530 --> 00:36:56,909 y digo ahora me interesa un triset 886 00:36:56,909 --> 00:36:59,030 pues no puedo llamar a este método 887 00:36:59,030 --> 00:37:01,449 entonces le tengo que decir al que ha hecho 888 00:37:01,449 --> 00:37:03,170 el método, oye cambia esto 889 00:37:03,170 --> 00:37:04,710 entonces 890 00:37:04,710 --> 00:37:07,570 cuando declaro parámetros de métodos 891 00:37:07,570 --> 00:37:09,869 ahí es donde sí que es 892 00:37:09,869 --> 00:37:11,449 especialmente relevante 893 00:37:11,449 --> 00:37:13,690 importante que lo deje lo más abierto 894 00:37:13,690 --> 00:37:15,010 posible, que yo diga 895 00:37:15,010 --> 00:37:17,170 este parámetro pertenece a esta interfaz 896 00:37:17,170 --> 00:37:19,809 luego pásame la implementación que quieras 897 00:37:19,809 --> 00:37:21,289 pertenece a esta interfaz 898 00:37:21,289 --> 00:37:23,389 porque si yo desde aquí ya 899 00:37:23,389 --> 00:37:24,489 comprometo el tipo 900 00:37:24,489 --> 00:37:26,730 como luego cambia aquí 901 00:37:26,730 --> 00:37:29,650 pues tengo que cambiar el método también 902 00:37:29,650 --> 00:37:31,650 cuando es haset 903 00:37:31,650 --> 00:37:36,039 fenomenal, pero cuando es 904 00:37:36,039 --> 00:37:37,980 triset, porque he decidido cambiar 905 00:37:37,980 --> 00:37:40,219 este punto, pues este ya no vale, entonces tengo que cambiarlo 906 00:37:40,219 --> 00:37:40,980 entonces aquí 907 00:37:40,980 --> 00:37:43,900 sí que tiene relevancia y es recomendable 908 00:37:43,900 --> 00:37:46,039 oye, pásame cualquier cosa que sea un conjunto 909 00:37:46,039 --> 00:37:47,840 luego tú ya en tu main 910 00:37:47,840 --> 00:37:50,039 ya hagas lo que quieras, que quieres esto, vale 911 00:37:50,039 --> 00:37:51,260 que luego quieres lo otro, lo que sea 912 00:37:51,260 --> 00:37:53,920 ¿vale? bueno, pues esto venía 913 00:37:53,920 --> 00:37:56,059 a cuento de que yo tengo mucha manía 914 00:37:56,059 --> 00:37:57,980 general de cuando 915 00:37:57,980 --> 00:38:00,219 declaro una colección en cualquier punto 916 00:38:00,219 --> 00:38:01,900 fijo el tipo 917 00:38:01,900 --> 00:38:03,519 claro, si es conjunto, si es lista 918 00:38:03,519 --> 00:38:05,739 y... 919 00:38:05,739 --> 00:38:07,480 Pero la dejo abierta 920 00:38:07,480 --> 00:38:08,619 Y luego ya decir 921 00:38:08,619 --> 00:38:10,300 Pero esto ya es una manía mía 922 00:38:10,300 --> 00:38:13,139 Donde realmente tiene implicaciones es aquí 923 00:38:13,139 --> 00:38:15,059 Cuando es parámetro de método 924 00:38:15,059 --> 00:38:16,820 Aquí arriba da un poco igual 925 00:38:16,820 --> 00:38:19,360 Que si la queréis declarar de partida 926 00:38:19,360 --> 00:38:20,960 Así, pues la declaráis de partida así 927 00:38:20,960 --> 00:38:22,500 Lo que pasa es que luego ya jugadores 928 00:38:22,500 --> 00:38:24,659 Nunca va a poder ir ningún conjunto 929 00:38:24,659 --> 00:38:27,039 Que no sea haset, no va a poder ir luego un triset ni nada 930 00:38:27,039 --> 00:38:29,440 Vale, pues entonces 931 00:38:29,440 --> 00:38:31,719 Esto lo vamos a quitar ya 932 00:38:31,719 --> 00:38:33,820 Y hemos dicho que íbamos a parar un momentajo 933 00:38:33,820 --> 00:38:35,800 pues venga