1 00:00:01,389 --> 00:00:01,950 Vale. 2 00:00:05,870 --> 00:00:07,190 Tranquilo, no pasa nada. 3 00:00:07,309 --> 00:00:07,969 Examen sorpresa. 4 00:00:08,769 --> 00:00:09,330 Venga. 5 00:00:11,990 --> 00:00:13,910 Bueno, dentro de dos semanas 6 00:00:13,910 --> 00:00:14,689 que es casi ya. 7 00:00:17,329 --> 00:00:19,250 Bueno, relax. 8 00:00:20,269 --> 00:00:21,129 Vale, a ver. 9 00:00:22,750 --> 00:00:24,690 Es otra implementación 10 00:00:24,690 --> 00:00:25,570 de colección, 11 00:00:26,809 --> 00:00:28,609 pero sigue siendo abstracta 12 00:00:28,609 --> 00:00:30,510 porque hay que concretarla 13 00:00:30,510 --> 00:00:31,210 un poquito más. 14 00:00:31,390 --> 00:00:36,170 Para ver cómo hacemos eso de los conjuntos, cómo podemos programar conjuntos. 15 00:00:36,869 --> 00:00:45,009 No los vamos a programar nosotros, porque no sabemos hacerlos, porque es un lío, porque es un rollo patatero. 16 00:00:45,409 --> 00:00:51,909 Pero vamos a ver los conceptos teóricos sobre los que se han sustentado las tres implementaciones de SEP que hay. 17 00:00:53,170 --> 00:00:58,310 Pues de SEP, ahora ya hay tres implementaciones que se hacen así que sin instancia, para meter cositas. 18 00:00:58,310 --> 00:01:17,560 Una es el HASHET, otra es el LINKED HASHET y otra es el TRIZEL. 19 00:01:25,459 --> 00:01:27,620 Esto es lo que he dicho antes. 20 00:01:27,760 --> 00:01:32,299 Hemos dicho que Collection tiene dos formas de implementarse, listas y conjuntas. 21 00:01:32,299 --> 00:01:35,319 las listas, todo lo que hay por debajo 22 00:01:35,319 --> 00:01:37,060 de listas, sobre lo que se basa 23 00:01:37,060 --> 00:01:39,359 lo conocemos y ahora lo que se trata es de usarlo 24 00:01:39,359 --> 00:01:41,019 pues ahora vamos a ver 25 00:01:41,019 --> 00:01:42,680 lo que hay por debajo de conjuntos 26 00:01:42,680 --> 00:01:45,159 muy por encima y luego de nuevo se trata de usarlo 27 00:01:45,159 --> 00:01:45,400 ¿vale? 28 00:01:46,420 --> 00:01:47,379 bueno, pues a ver 29 00:01:47,379 --> 00:01:50,959 los conjuntos 30 00:01:50,959 --> 00:01:51,760 recordad 31 00:01:51,760 --> 00:01:55,299 que lo que le diferencia de listas 32 00:01:55,299 --> 00:01:57,120 es que los elementos 33 00:01:57,120 --> 00:01:58,920 no tienen 34 00:01:58,920 --> 00:01:59,659 posición 35 00:01:59,659 --> 00:02:03,579 toma ya 36 00:02:03,579 --> 00:02:08,580 están ahí a lo bestia 37 00:02:08,580 --> 00:02:10,659 entonces tú lo puedes hacer 38 00:02:10,659 --> 00:02:12,500 recupérame el de posición 3 39 00:02:12,500 --> 00:02:13,580 como puedes hacer una lista 40 00:02:13,580 --> 00:02:15,120 eso no lo puedes hacer 41 00:02:15,120 --> 00:02:16,759 ¿qué haces con un conjunto? 42 00:02:17,539 --> 00:02:18,379 iterar por él 43 00:02:18,379 --> 00:02:20,560 iterar y ver lo que hay 44 00:02:20,560 --> 00:02:22,539 y cuando encuentras el que estás buscando 45 00:02:22,539 --> 00:02:24,699 pues te lo quedas o lo modificas 46 00:02:24,699 --> 00:02:25,900 o lo que quieras hacer 47 00:02:25,900 --> 00:02:27,219 ¿vale? 48 00:02:27,219 --> 00:02:29,939 en una caja con posiciones 49 00:02:29,939 --> 00:02:31,919 tú puedes hacer 50 00:02:31,919 --> 00:02:33,759 voy a coger el 4, metes la mano 51 00:02:33,759 --> 00:02:35,740 sin mirar y coges el 4 52 00:02:35,740 --> 00:02:37,979 en un conjunto 53 00:02:37,979 --> 00:02:39,219 que es una caja sin posiciones 54 00:02:39,219 --> 00:02:41,719 ahí tú, no tiene sentido que tú metas la mano 55 00:02:41,719 --> 00:02:43,300 y saques porque puedes sacar cualquier cosa 56 00:02:43,300 --> 00:02:45,360 luego el método get no existe 57 00:02:45,360 --> 00:02:48,240 ¿por qué? ¿qué significa? ¿meto la mano y saco al azar? 58 00:02:48,340 --> 00:02:49,400 no, el método met no existe 59 00:02:49,400 --> 00:02:52,280 lo que existe es ir tú mirando la cajita 60 00:02:52,280 --> 00:02:53,979 ah, este quiere, pues ese 61 00:02:53,979 --> 00:02:55,120 eso es lo que existe 62 00:02:55,120 --> 00:02:57,000 y eso es lo que se llama iterar 63 00:02:57,000 --> 00:02:59,259 iterar por la cajita 64 00:02:59,259 --> 00:03:00,400 por el set, iterar 65 00:03:00,400 --> 00:03:03,300 este es el que quiero modificar, a este le pinto de verde 66 00:03:03,300 --> 00:03:05,139 ahora, este es el que quiero eliminar 67 00:03:05,139 --> 00:03:06,379 pues a este le salgo y le tiro la basura 68 00:03:06,379 --> 00:03:08,680 ese es el que quiero consultar a ver que tiene dentro 69 00:03:08,680 --> 00:03:11,099 entonces va a necesitar 70 00:03:11,099 --> 00:03:13,580 iteración dentro de la cajita 71 00:03:13,580 --> 00:03:15,319 en la lista 72 00:03:15,319 --> 00:03:17,419 podemos iterar, por supuesto, ir uno por uno 73 00:03:17,419 --> 00:03:19,199 pero también podemos sacar uno de golpe 74 00:03:19,199 --> 00:03:20,960 sacar el 3, aquí no 75 00:03:20,960 --> 00:03:23,240 esa es la diferencia esencial 76 00:03:23,240 --> 00:03:24,520 ¿vale? ahora 77 00:03:24,520 --> 00:03:27,120 eso permite que la programación 78 00:03:27,120 --> 00:03:28,479 sea más fácil 79 00:03:28,479 --> 00:03:30,620 y que computacionalmente 80 00:03:30,620 --> 00:03:32,259 el rendimiento sea mucho mejor 81 00:03:32,259 --> 00:03:34,539 entonces siempre que uno no necesite 82 00:03:34,539 --> 00:03:36,060 llevar un registro de las posiciones 83 00:03:36,060 --> 00:03:37,740 usará conjuntos 84 00:03:37,740 --> 00:03:40,020 porque computacionalmente son mejores 85 00:03:40,020 --> 00:03:42,639 pero cuando para ti la posición 86 00:03:42,639 --> 00:03:44,740 es importante, usarás vistas 87 00:03:44,740 --> 00:03:46,400 ¿vale? 88 00:03:46,960 --> 00:03:49,120 porque además el que la posición 89 00:03:49,120 --> 00:03:50,960 el llevar un registro de la posición 90 00:03:50,960 --> 00:03:53,319 tiene una implicación fundamental 91 00:03:53,319 --> 00:03:55,919 que también hemos mencionado 92 00:03:55,919 --> 00:03:56,680 que en una list 93 00:03:56,680 --> 00:03:58,840 en mi cabeza es más fácil un array que cualquier otra 94 00:03:58,840 --> 00:04:02,020 ah, ahora queréis los arrays por encima de todo 95 00:04:02,020 --> 00:04:02,659 y los char 96 00:04:02,659 --> 00:04:05,080 que no 97 00:04:05,080 --> 00:04:06,580 sobre los char 98 00:04:06,580 --> 00:04:08,919 sobre los char 99 00:04:08,919 --> 00:04:11,659 a ver, en cuanto hagamos 100 00:04:11,659 --> 00:04:14,000 dos, tres, cuatro aplicaciones con list y set 101 00:04:14,000 --> 00:04:15,800 veréis que es lo mismo una y otra vez 102 00:04:15,800 --> 00:04:17,620 y por supuesto súper útil 103 00:04:17,620 --> 00:04:19,839 no os vais a volver locos 104 00:04:19,839 --> 00:04:20,439 ni nada de eso 105 00:04:20,439 --> 00:04:23,259 entonces 106 00:04:23,259 --> 00:04:25,100 el que una lista 107 00:04:25,100 --> 00:04:27,120 lleve el registro de la posición 108 00:04:27,120 --> 00:04:29,620 ¿qué implicación tiene? 109 00:04:30,139 --> 00:04:32,160 que tú puedes meter dos objetos iguales 110 00:04:32,160 --> 00:04:33,860 porque uno va en la primera y tú en la tercera 111 00:04:33,860 --> 00:04:35,540 y no pasa nada 112 00:04:35,540 --> 00:04:37,959 porque sean iguales, porque los puedes distinguir 113 00:04:37,959 --> 00:04:40,540 en un conjunto 114 00:04:40,540 --> 00:04:42,180 no puedes meter 115 00:04:42,180 --> 00:04:44,259 dos objetos iguales 116 00:04:44,259 --> 00:04:45,319 porque 117 00:04:45,319 --> 00:04:47,560 se confundirían 118 00:04:47,560 --> 00:04:50,079 porque no hay posición, se quedarían confundidos 119 00:04:50,079 --> 00:04:52,199 luego 120 00:04:52,199 --> 00:04:54,459 el hecho de que el set no lleve 121 00:04:54,459 --> 00:04:56,519 registro de posición implica 122 00:04:56,519 --> 00:04:58,860 que no puedes 123 00:04:58,860 --> 00:05:01,120 meter duplicados, que no admite duplicados 124 00:05:01,120 --> 00:05:03,120 esa es la primera cosa que vamos a comprobar 125 00:05:03,120 --> 00:05:05,180 ahora cuando lo probemos, que si tú metes en el set 126 00:05:05,180 --> 00:05:06,959 el 3 y luego 127 00:05:06,959 --> 00:05:08,300 le vuelves a hacer otro add del 3 128 00:05:08,300 --> 00:05:10,899 ese no te lo ha metido y te dice ya tengo un 3 129 00:05:10,899 --> 00:05:11,680 lo siento mucho 130 00:05:11,680 --> 00:05:14,660 luego simplemente no lo mete, no te dice nada 131 00:05:14,660 --> 00:05:16,279 vale 132 00:05:16,279 --> 00:05:18,519 bueno 133 00:05:18,519 --> 00:05:21,759 ahora ya, ¿cómo se implementa 134 00:05:21,759 --> 00:05:22,540 esto por debajo? 135 00:05:23,259 --> 00:05:25,279 bueno, pues con unas ideas que vamos a mencionar 136 00:05:25,279 --> 00:05:27,120 muy por encima, de las cuales 137 00:05:27,120 --> 00:05:29,120 no me preguntéis muchos detalles 138 00:05:29,120 --> 00:05:31,100 porque los desconozco a nivel de 139 00:05:31,100 --> 00:05:33,000 implementación, ni siquiera los conozco 140 00:05:33,000 --> 00:05:34,740 ¿vale? entonces no me preguntéis 141 00:05:34,740 --> 00:05:37,360 ¿vale? pero las ideas sobre las que se basa 142 00:05:37,360 --> 00:05:39,240 sí, bueno, pues en sencilla, esto y esto 143 00:05:39,240 --> 00:05:40,839 como se va a lo mismo, lo metemos ahí en mosaico 144 00:05:40,839 --> 00:05:42,120 estas dos 145 00:05:42,120 --> 00:05:45,240 se basan en la idea de tabla hash 146 00:05:45,240 --> 00:05:47,180 estas dos 147 00:05:47,180 --> 00:05:47,920 implementaciones. 148 00:05:49,439 --> 00:05:51,279 Y estas dos se basan en la 149 00:05:51,279 --> 00:05:52,879 idea de árbol binario. 150 00:05:54,040 --> 00:05:55,519 Que son dos estructuras 151 00:05:55,519 --> 00:05:56,980 que no tienen nada que ver. 152 00:05:57,459 --> 00:05:58,000 Nada que ver. 153 00:05:58,939 --> 00:05:59,300 Pero 154 00:05:59,300 --> 00:06:03,060 las dos se han usado para 155 00:06:03,060 --> 00:06:05,139 implementar conjuntos. Que luego a la hora de usarse 156 00:06:05,139 --> 00:06:07,139 se usan igual. Es que me da igual que 157 00:06:07,139 --> 00:06:09,240 el conjunto sea un haset 158 00:06:09,240 --> 00:06:11,060 que sea un triset. Si es que los voy a usar igual. 159 00:06:11,139 --> 00:06:13,040 Una caja para meter cosas. Habrá 160 00:06:13,040 --> 00:06:15,040 algunas pequeñas diferencias que vamos a ver. 161 00:06:15,800 --> 00:06:17,040 Como que una va a tener orden y otra 162 00:06:17,040 --> 00:06:19,019 no, pero ya está, no va a haber más diferencias 163 00:06:19,019 --> 00:06:21,019 van a ser cajas para meter las cosas 164 00:06:21,019 --> 00:06:22,240 ahí, como voy yo 165 00:06:22,240 --> 00:06:24,779 ¿vale? bueno, pues 166 00:06:24,779 --> 00:06:27,019 la tabla hash, ¿qué es? esto es como 167 00:06:27,019 --> 00:06:28,680 de la pila, cola, vamos a mencionar qué es 168 00:06:28,680 --> 00:06:29,879 porque uno tiene que saber qué es 169 00:06:29,879 --> 00:06:35,149 para ver cómo se ha usado en estas estructuras 170 00:06:35,149 --> 00:06:44,319 ¿qué es una, más que 171 00:06:44,319 --> 00:06:46,240 una tabla hash, una función de hash? 172 00:06:47,139 --> 00:06:48,360 una función que multiplica 173 00:06:48,360 --> 00:06:50,180 para conseguir un código 174 00:06:50,180 --> 00:06:52,120 de un número determinado de caracteres 175 00:06:52,120 --> 00:06:54,220 que luego con ese mismo código puedes 176 00:06:54,220 --> 00:06:55,839 recuperar, justo 177 00:06:55,839 --> 00:07:13,000 La función de hash es una forma de facilitar la clasificación y recuperación de datos. Es decir, uno tiene, hablo de cualquier contexto, no solo en el contexto nuestro de las colecciones, uno tiene un montón de datos. 178 00:07:13,000 --> 00:07:16,519 hay todos a mogollón 179 00:07:16,519 --> 00:07:17,560 entonces 180 00:07:17,560 --> 00:07:20,899 si tú tienes que ir a buscarlos 181 00:07:20,899 --> 00:07:22,800 ahí a mogollón en los 2000 182 00:07:22,800 --> 00:07:23,680 pues 183 00:07:23,680 --> 00:07:26,139 estás ahí emborronado buscando 184 00:07:26,139 --> 00:07:28,819 vale, ¿qué hace la función de hash? 185 00:07:29,060 --> 00:07:30,899 la función de hash es una función 186 00:07:30,899 --> 00:07:32,519 que se aplica 187 00:07:32,519 --> 00:07:33,519 a un elemento 188 00:07:33,519 --> 00:07:36,199 una función que se aplica a un elemento 189 00:07:36,199 --> 00:07:37,939 y te devuelve un número 190 00:07:37,939 --> 00:07:40,139 ¿vale? 191 00:07:40,560 --> 00:07:42,759 una función de hash es como transformarte 192 00:07:42,759 --> 00:07:44,779 un elemento del tipo que sea 193 00:07:44,779 --> 00:07:46,839 un objeto alumno, un objeto profesor 194 00:07:46,839 --> 00:07:48,939 un objeto factura, te transforma 195 00:07:48,939 --> 00:07:50,180 un elemento a un numerito 196 00:07:50,180 --> 00:07:52,319 es una transformación a un numerito 197 00:07:52,319 --> 00:07:54,680 vale, entonces la función de hash 198 00:07:54,680 --> 00:07:56,779 no es 199 00:07:56,779 --> 00:07:58,040 biyectiva 200 00:07:58,040 --> 00:07:59,699 es inyectiva 201 00:07:59,699 --> 00:08:01,300 ¿qué quiero decir con esto? 202 00:08:01,300 --> 00:08:04,120 que muchos elementos 203 00:08:04,120 --> 00:08:04,959 de la caja 204 00:08:04,959 --> 00:08:06,800 de este mogollón 205 00:08:06,800 --> 00:08:08,680 pueden ir al mismo número 206 00:08:08,680 --> 00:08:10,220 no pasa nada 207 00:08:10,220 --> 00:08:13,500 entonces, lo que realmente hace la función de hash 208 00:08:13,500 --> 00:08:15,100 es como si hiciera 209 00:08:15,100 --> 00:08:16,800 una serie de subconjuntos 210 00:08:16,800 --> 00:08:19,540 es decir, me clasifica 211 00:08:19,540 --> 00:08:21,259 todos los elementos que están 212 00:08:21,259 --> 00:08:23,420 en una caja enorme, me los clasifica 213 00:08:23,420 --> 00:08:25,360 en apartaditos, solamente eso 214 00:08:25,360 --> 00:08:27,100 y cada apartadito 215 00:08:27,100 --> 00:08:29,639 está formado por todos los elementos 216 00:08:29,639 --> 00:08:30,879 que aplicada 217 00:08:30,879 --> 00:08:32,940 la función de hash correspondiente 218 00:08:32,940 --> 00:08:35,299 te llevan al mismo número, estos se llevan al 3 219 00:08:35,299 --> 00:08:37,720 estos se llevan al 4, estos se llevan al 5 220 00:08:37,720 --> 00:08:39,340 entonces es la función de hash 221 00:08:39,340 --> 00:08:41,379 una función que te permite 222 00:08:41,379 --> 00:08:43,759 clasificar un mogollón de datos 223 00:08:43,759 --> 00:08:45,019 en subconjuntos 224 00:08:45,019 --> 00:08:47,759 y todos los elementos de un subconjunto 225 00:08:47,759 --> 00:08:49,620 comparten 226 00:08:49,620 --> 00:08:51,419 que la función de hash aplicada a ellos 227 00:08:51,419 --> 00:08:52,440 se llevan al mismo numerito. 228 00:08:53,379 --> 00:08:55,980 ¿Los subconjuntos los eliges tú o es 229 00:08:55,980 --> 00:08:56,580 la de a todo? 230 00:08:56,779 --> 00:08:59,519 La función de hash la eliges tú en función 231 00:08:59,519 --> 00:09:01,179 de la aplicación a la que quieras usar eso. 232 00:09:01,919 --> 00:09:03,039 La función de hash 233 00:09:03,039 --> 00:09:05,500 la implicación que tiene lógicamente es 234 00:09:05,500 --> 00:09:07,379 cuáles van a ser los subconjuntos. 235 00:09:07,379 --> 00:09:09,620 obviamente, en función de cómo sea la función de hash 236 00:09:09,620 --> 00:09:11,600 ¿cuál sería la peor función 237 00:09:11,600 --> 00:09:12,559 de hash del mundo? 238 00:09:13,360 --> 00:09:15,639 la peor función del hash del mundo sería esta 239 00:09:15,639 --> 00:09:17,120 por ejemplo 240 00:09:17,120 --> 00:09:19,100 f de x igual a 1 241 00:09:19,100 --> 00:09:21,039 una función perfectamente matemática 242 00:09:21,039 --> 00:09:23,200 perfectamente legal, f de x igual a 1 243 00:09:23,200 --> 00:09:24,440 la función constante 244 00:09:24,440 --> 00:09:26,899 esta función de hash 245 00:09:26,899 --> 00:09:28,899 una función de hash perfectamente válida 246 00:09:28,899 --> 00:09:30,539 no ha hecho nada 247 00:09:30,539 --> 00:09:32,799 porque todos los elementos 248 00:09:32,799 --> 00:09:35,299 caen todos en un único 249 00:09:35,299 --> 00:09:36,179 subconjunto 250 00:09:36,179 --> 00:09:37,980 no he clasificado nada 251 00:09:37,980 --> 00:09:38,940 ¿vale? 252 00:09:40,340 --> 00:09:41,899 podría haber otra función de hash 253 00:09:41,899 --> 00:09:44,240 que la mitad de ellos 254 00:09:44,240 --> 00:09:46,259 por ejemplo una función de hash, pues yo que sé 255 00:09:46,259 --> 00:09:48,320 que si es positivo 256 00:09:48,320 --> 00:09:50,740 que hace una operación matemática 257 00:09:50,740 --> 00:09:52,399 que todos los positivos te da uno 258 00:09:52,399 --> 00:09:54,139 y todos los negativos te da menos uno, por ejemplo 259 00:09:54,139 --> 00:09:56,860 pues a lo mejor consigue dos subconjuntos 260 00:09:56,860 --> 00:09:58,779 entonces la función de hash 261 00:09:58,779 --> 00:10:01,000 depende de la aplicación en la que estoy trabajando 262 00:10:01,000 --> 00:10:02,580 pues se crea 263 00:10:02,580 --> 00:10:03,399 de una manera o de otra 264 00:10:03,399 --> 00:10:05,759 ¿y qué implicación tiene? 265 00:10:05,759 --> 00:10:07,860 en la cantidad de subconjuntos 266 00:10:07,860 --> 00:10:08,559 que puedes crear. 267 00:10:09,679 --> 00:10:11,860 ¿Vale? Pero claro, hay un compromiso. 268 00:10:12,639 --> 00:10:14,120 La función de hash ideal 269 00:10:14,120 --> 00:10:15,539 no es la función 270 00:10:15,539 --> 00:10:17,980 biyectiva, es decir, que cada elemento 271 00:10:17,980 --> 00:10:18,960 te lleva un número distinto. 272 00:10:19,399 --> 00:10:21,759 Porque es que entonces si no, no has ganado nada tampoco. 273 00:10:21,940 --> 00:10:23,799 ¿Me explico? Diréis, 274 00:10:23,799 --> 00:10:25,799 vale, ¿y para qué me sirve a mí hacer subconjuntos? 275 00:10:27,220 --> 00:10:27,360 Ya, 276 00:10:27,700 --> 00:10:28,940 está muy emborronado. 277 00:10:29,639 --> 00:10:32,039 Eso diréis, no diréis, ¿y para qué quiero yo hacer subconjuntos? 278 00:10:32,500 --> 00:10:33,679 Pues para facilitar 279 00:10:33,679 --> 00:10:35,919 las búsquedas, es decir 280 00:10:35,919 --> 00:10:37,080 repito 281 00:10:37,080 --> 00:10:39,600 si tú tienes aquí 282 00:10:39,600 --> 00:10:41,179 un montón de elementos y dices 283 00:10:41,179 --> 00:10:43,879 voy a buscar el elemento 284 00:10:43,879 --> 00:10:45,700 7 285 00:10:45,700 --> 00:10:47,620 depende 286 00:10:47,620 --> 00:10:49,320 el alumno de ojos azules, lo que sea 287 00:10:49,320 --> 00:10:50,960 el que sea, pues 288 00:10:50,960 --> 00:10:53,419 si no los tienes clasterizados 289 00:10:53,419 --> 00:10:55,240 es decir, en subconjuntos 290 00:10:55,240 --> 00:10:56,960 en lo que llamamos un clúster en informática 291 00:10:56,960 --> 00:10:59,340 un clúster 292 00:10:59,340 --> 00:11:00,600 es un subconjunto de algo 293 00:11:00,600 --> 00:11:03,440 por eso cuando hablamos de clústerizar 294 00:11:03,440 --> 00:11:05,360 es cuando estamos 295 00:11:05,360 --> 00:11:07,159 nosotros lo usamos mucho 296 00:11:07,159 --> 00:11:10,080 para clasterizar cualquier cosa 297 00:11:10,080 --> 00:11:11,600 ¿vale? 298 00:11:11,779 --> 00:11:13,919 pues si no los tenemos clasterizados 299 00:11:13,919 --> 00:11:16,179 o compartimentados en subconjuntos 300 00:11:16,179 --> 00:11:17,899 para buscar el alumno 301 00:11:17,899 --> 00:11:19,539 de ojos azules, tienes que ir a donde está 302 00:11:19,539 --> 00:11:21,100 lo vas sacando y todo eso 303 00:11:21,100 --> 00:11:22,500 madre mía, lo sacas 304 00:11:22,500 --> 00:11:25,500 pero si tú 305 00:11:25,500 --> 00:11:27,740 has hecho subconjuntos 306 00:11:27,740 --> 00:11:31,200 dices, a ver, ¿dónde está 307 00:11:31,200 --> 00:11:32,039 el de ojos azules? 308 00:11:32,860 --> 00:11:34,580 ¿le aplicas la función de hash? 309 00:11:34,820 --> 00:11:36,179 a uno de ojos azules 310 00:11:36,179 --> 00:11:38,700 la función de hash te dice 3 311 00:11:38,700 --> 00:11:41,519 pues tú te vas al subconjunto 3 312 00:11:41,519 --> 00:11:43,580 y ahora ya la búsqueda en la caja 313 00:11:43,580 --> 00:11:44,759 solo es en el subconjunto 314 00:11:44,759 --> 00:11:48,019 esa es la utilidad de la función de hash 315 00:11:48,019 --> 00:11:50,580 que se aplica en muchos contextos 316 00:11:50,580 --> 00:11:55,960 a ver, yo estoy hablando en términos 317 00:11:55,960 --> 00:11:57,620 conceptuales 318 00:11:57,620 --> 00:11:59,120 depende de 319 00:11:59,120 --> 00:12:02,620 a qué estamos aplicando esto 320 00:12:02,620 --> 00:12:27,379 Si estamos hablando allá del hashed, ¿en qué se basa el hashed? El hashed se basa en, yo tengo ahí todos mis elementos a mogollón, defino yo como programador una función de hash, la defino yo, y ahí ese famoso hashcode que aparecía solito, que no sabemos en qué pintaba, pues ese hashcode que aparecía solito me ahorra el trabajo, me hace una función de hash. 321 00:12:27,720 --> 00:12:30,360 ¿Para qué me sirve esa función de hash en una clase? 322 00:12:31,360 --> 00:12:33,000 Me sirve, por ejemplo, para esto. 323 00:12:33,259 --> 00:12:35,799 Entonces, yo tengo ahí un montón de elementos. 324 00:12:36,460 --> 00:12:38,519 Hago una función de hash para esos objetos, 325 00:12:38,820 --> 00:12:40,779 la que esté programada en el hash code de la clase. 326 00:12:41,860 --> 00:12:44,100 Porque ese hash code tira de las propiedades del objeto, 327 00:12:44,240 --> 00:12:47,059 luego ese hash code me consigue un número entero 328 00:12:47,059 --> 00:12:49,059 en función de las propiedades del objeto. 329 00:12:50,059 --> 00:12:53,720 Vale, pues ese hash code lo que me sirve es 330 00:12:53,720 --> 00:12:56,340 para que todos esos objetos que yo tengo en el set 331 00:12:56,340 --> 00:12:58,779 Se quedan en subconjuntos separados 332 00:12:58,779 --> 00:13:01,480 Y ahora 333 00:13:01,480 --> 00:13:03,519 Dentro de cada subconjunto 334 00:13:03,519 --> 00:13:05,639 ¿Qué hace el hash set? 335 00:13:05,820 --> 00:13:06,860 ¿Cómo decide organizar? 336 00:13:06,879 --> 00:13:08,279 El mismo tipo de objeto 337 00:13:08,279 --> 00:13:11,399 Los mete en una lista enlazada 338 00:13:11,399 --> 00:13:12,600 Fíjate en casualidad 339 00:13:12,600 --> 00:13:15,740 Todos los, claro 340 00:13:15,740 --> 00:13:17,299 Entonces cada subconjunto 341 00:13:17,299 --> 00:13:18,200 Para el hash set 342 00:13:18,200 --> 00:13:20,519 Es en realidad una lista enlazada 343 00:13:20,519 --> 00:13:21,840 O sea que la idea de un hash set 344 00:13:21,840 --> 00:13:24,440 Es meter distintos tipos de objetos 345 00:13:24,440 --> 00:13:26,039 Claro, un hash set son 346 00:13:26,039 --> 00:13:28,139 en lugar de tener 347 00:13:28,139 --> 00:13:29,720 un haset es 348 00:13:29,720 --> 00:13:32,460 la idea del haset es 349 00:13:32,460 --> 00:13:34,659 en lugar de tener un linked list 350 00:13:34,659 --> 00:13:35,980 con todos en filita 351 00:13:35,980 --> 00:13:38,559 yo los separo por apartados 352 00:13:38,559 --> 00:13:40,879 me cojo estos de ojos azules 353 00:13:40,879 --> 00:13:42,340 estos de ojos marrones 354 00:13:42,340 --> 00:13:43,820 y estos de ojos grises 355 00:13:43,820 --> 00:13:46,659 los pongo en tres listas enlazadas 356 00:13:46,659 --> 00:13:48,360 la lista enlazada de los ojos azules 357 00:13:48,360 --> 00:13:51,419 y ahora que tú me dices 358 00:13:51,419 --> 00:13:53,080 búscame el alumno 359 00:13:53,080 --> 00:13:54,580 de ojos azules que se llama Pepito 360 00:13:54,580 --> 00:13:57,720 yo me voy al subconjunto 361 00:13:57,720 --> 00:13:58,740 de ojos azules 362 00:13:58,740 --> 00:14:01,299 ¿vale? y en ese subconjunto 363 00:14:01,299 --> 00:14:02,799 no tengo que recorrer una lista en la sala entera 364 00:14:02,799 --> 00:14:04,559 recorro una sublista 365 00:14:04,559 --> 00:14:07,299 entonces en ese caso la función de hash sería 366 00:14:07,299 --> 00:14:08,860 color de tus ojos 367 00:14:08,860 --> 00:14:10,700 entonces coges uno cualquiera 368 00:14:10,700 --> 00:14:13,379 y el color de tus ojos decide a qué subconjunto 369 00:14:13,379 --> 00:14:15,059 te vas, esa sería la función de hash 370 00:14:15,059 --> 00:14:17,240 pero claro, puedes coexistir 371 00:14:17,240 --> 00:14:18,620 con otro objeto del mismo color que tú 372 00:14:18,620 --> 00:14:20,919 pues todos en la filita, en la lista 373 00:14:20,919 --> 00:14:22,860 eso optimiza 374 00:14:22,860 --> 00:14:24,519 las búsquedas 375 00:14:24,519 --> 00:14:26,379 en lugar de recorrer la lista entera 376 00:14:26,379 --> 00:14:28,200 tú primero dices 377 00:14:28,200 --> 00:14:29,899 a ver Edward tiene los ojos azules 378 00:14:29,899 --> 00:14:31,799 pues busco solo en tu parro 379 00:14:31,799 --> 00:14:32,720 ¿vale? 380 00:14:34,240 --> 00:14:35,860 esa es la idea del Hachette 381 00:14:35,860 --> 00:14:37,240 eso es lo que tiene de fondo 382 00:14:37,240 --> 00:14:44,779 claro, todos los elementos de la colección 383 00:14:44,779 --> 00:14:46,360 los separas 384 00:14:46,360 --> 00:14:48,480 en apartados 385 00:14:48,480 --> 00:14:50,179 como dices tú, o en subconjuntos 386 00:14:50,179 --> 00:14:52,740 ¿cuál es el criterio para separarlos? 387 00:14:52,860 --> 00:14:54,419 lo que te diga la función de Hachette 388 00:14:54,419 --> 00:14:55,259 para cada uno de ellos. 389 00:14:55,980 --> 00:14:57,879 Si la función de hash te lleva al 3, 390 00:14:58,360 --> 00:14:59,740 lo llevas al subapartado 3. 391 00:14:59,860 --> 00:15:01,500 Si te lleva al 4, es al subapartado 4. 392 00:15:01,659 --> 00:15:03,720 Entonces tú tendrás varios subapartados. 393 00:15:04,340 --> 00:15:05,539 ¿Quieres ver dónde está este? 394 00:15:06,179 --> 00:15:09,139 Dices, oye, tú, voy a aplicar la función de hash a este. 395 00:15:09,220 --> 00:15:09,779 Me dice 4. 396 00:15:10,000 --> 00:15:10,379 Ah, genial. 397 00:15:10,519 --> 00:15:11,759 Pues me voy al apartado 4. 398 00:15:11,940 --> 00:15:12,720 Y ahí ya lo busco. 399 00:15:13,220 --> 00:15:16,240 Lo busco en el caso de hashed en una lista, 400 00:15:16,419 --> 00:15:17,320 que es donde está guardado. 401 00:15:17,320 --> 00:15:19,039 Pero a la hora de implementar esto en tu grabación, 402 00:15:19,220 --> 00:15:19,860 ¿no te va a... 403 00:15:19,860 --> 00:15:21,460 Esto es una... 404 00:15:21,460 --> 00:15:22,639 Yo no lo he implementado nunca. 405 00:15:22,840 --> 00:15:23,200 Ah, a ver. 406 00:15:23,240 --> 00:15:23,659 Pero vamos. 407 00:15:23,659 --> 00:15:26,379 a ver, en realidad tampoco es que sea muy complicado 408 00:15:26,379 --> 00:15:27,960 porque es hacer 409 00:15:27,960 --> 00:15:29,980 llevar un registro de varias listas 410 00:15:29,980 --> 00:15:32,059 enlazadas, que seguramente 411 00:15:32,059 --> 00:15:34,059 lo lleven a un array, se podría mirar por curiosidad 412 00:15:34,059 --> 00:15:35,519 en qué estructura llevan 413 00:15:35,519 --> 00:15:37,980 bueno, no, seguramente no, sé que lo llevan a un array 414 00:15:37,980 --> 00:15:40,100 un haset por dentro es un array 415 00:15:40,100 --> 00:15:42,360 de listas enlazadas 416 00:15:42,360 --> 00:15:44,179 claro, cada posición del array 417 00:15:44,179 --> 00:15:46,039 es una lista enlazada, entonces la función 418 00:15:46,039 --> 00:15:47,899 de hash lo que define es 419 00:15:47,899 --> 00:15:48,779 cuántas posiciones tiene el array 420 00:15:48,779 --> 00:15:52,240 claro, la función de hash te lleva 421 00:15:52,240 --> 00:15:53,799 a la posición del array 422 00:15:53,799 --> 00:15:55,679 y luego ya iteras. 423 00:15:56,299 --> 00:15:56,500 Vale. 424 00:15:58,659 --> 00:16:00,279 Entonces, el hash set por dentro 425 00:16:00,279 --> 00:16:01,080 es esto, en realidad. 426 00:16:03,399 --> 00:16:04,000 Es 427 00:16:04,000 --> 00:16:06,299 un array 428 00:16:06,299 --> 00:16:08,059 y cada array 429 00:16:08,059 --> 00:16:10,059 te lleva a una lista enlazada. 430 00:16:11,940 --> 00:16:13,679 Y así están los elementos. 431 00:16:14,059 --> 00:16:16,080 Entonces, la función 432 00:16:16,080 --> 00:16:18,059 de hash te lleva a la 433 00:16:18,059 --> 00:16:19,039 posición del array. 434 00:16:20,179 --> 00:16:20,779 ¿Vale? 435 00:16:20,779 --> 00:16:23,860 claro, la función de hash te lleva a la posición 436 00:16:23,860 --> 00:16:25,700 y luego tú ya 437 00:16:25,700 --> 00:16:27,100 buscas 438 00:16:27,100 --> 00:16:29,159 el elemento en la lista 439 00:16:29,159 --> 00:16:31,200 bueno, lo buscas tú, no, lo busca el hash 440 00:16:31,200 --> 00:16:32,539 tú dices 441 00:16:32,539 --> 00:16:34,820 iteras, aceseras, lo que sea 442 00:16:34,820 --> 00:16:36,659 y él ya se ha apañado en todo esto 443 00:16:36,659 --> 00:16:38,340 está parado por dentro 444 00:16:38,340 --> 00:16:40,360 entonces 445 00:16:40,360 --> 00:16:49,450 la función de hash 446 00:16:49,450 --> 00:16:50,330 repito 447 00:16:50,330 --> 00:16:52,389 la decide uno 448 00:16:52,389 --> 00:16:55,309 la decide uno en su aplicación 449 00:16:55,309 --> 00:16:58,549 Y esa función de hash para los elementos, 450 00:16:58,649 --> 00:17:00,370 imaginaos que estos elementos que voy a guardar 451 00:17:00,370 --> 00:17:01,769 son de clase alumno. 452 00:17:01,850 --> 00:17:03,889 Los elementos que voy a guardar todos aquí son alumnos. 453 00:17:04,450 --> 00:17:07,569 Pues entonces, un segundinín en la clase alumno. 454 00:17:08,269 --> 00:17:09,849 Si yo quiero usar un hash set, 455 00:17:10,950 --> 00:17:11,990 bueno, dime antes. 456 00:17:12,309 --> 00:17:13,349 ¿Un hash qué es? 457 00:17:14,990 --> 00:17:17,170 Una función hash o una tal, 458 00:17:17,490 --> 00:17:19,910 un hash, o sea, un hash como tal, 459 00:17:20,089 --> 00:17:21,410 no sé cómo diría que prefiero con un hash. 460 00:17:22,410 --> 00:17:24,809 Una función de hash es un código hash, 461 00:17:24,809 --> 00:17:26,309 es el código que te devuelve una función de hash. 462 00:17:26,390 --> 00:17:28,410 Una función de hash es una función que te lleva a un código hash. 463 00:17:28,970 --> 00:17:30,789 Una tabla hash es una tabla de códigos 464 00:17:30,789 --> 00:17:32,789 hashes. O sea, hash a secas no se debe 465 00:17:32,789 --> 00:17:33,230 corregir. 466 00:17:36,950 --> 00:17:38,130 Eso es cuando 467 00:17:38,130 --> 00:17:40,869 cualquier objeto o dato 468 00:17:40,869 --> 00:17:41,410 que le pasa 469 00:17:41,410 --> 00:17:44,650 a la función te devuelve un número de 470 00:17:44,650 --> 00:17:45,930 128 carácteres. 471 00:17:47,869 --> 00:17:48,950 Un código hash 472 00:17:48,950 --> 00:17:50,849 es el número que te devuelve una función 473 00:17:50,849 --> 00:17:52,849 de hash. Que se supone que 474 00:17:52,849 --> 00:17:54,170 sirve para esto que estamos diciendo. 475 00:17:54,170 --> 00:17:58,029 para separar en subconjuntos 476 00:17:58,029 --> 00:17:59,029 un conjunto grande. 477 00:18:00,809 --> 00:18:01,009 ¿Vale? 478 00:18:01,369 --> 00:18:02,029 Por hasen, 479 00:18:02,710 --> 00:18:04,210 estás entendiendo tú un código, 480 00:18:04,349 --> 00:18:06,190 has el resultado de una función de hasen. 481 00:18:06,650 --> 00:18:07,829 Vale, pues entonces, 482 00:18:08,549 --> 00:18:11,049 ahora, cuando nosotros decidimos 483 00:18:11,049 --> 00:18:12,430 que vamos a guardar, por ejemplo, 484 00:18:12,509 --> 00:18:13,609 un montón de objetos a luz, 485 00:18:15,609 --> 00:18:19,430 y mi aplicación no necesita duplicados, 486 00:18:20,130 --> 00:18:21,710 es decir, no necesito que el mismo alumno 487 00:18:21,710 --> 00:18:23,230 esté en la colección repetido. 488 00:18:24,170 --> 00:18:26,150 Pues si no he ido a duplicados, no necesito llevar 489 00:18:26,150 --> 00:18:27,990 registro de la posición, no puedo olvidar del list. 490 00:18:28,509 --> 00:18:30,390 Entonces imaginaos que he decidido 491 00:18:30,390 --> 00:18:32,329 meter a mis alumnos en un 492 00:18:32,329 --> 00:18:34,190 HACER. Que el HACER es 493 00:18:34,190 --> 00:18:35,470 una de las estructuras 494 00:18:35,470 --> 00:18:37,450 que mejor rendimiento tiene, 495 00:18:37,730 --> 00:18:40,069 óptimas. Entonces un HACER 496 00:18:40,069 --> 00:18:42,289 lo usamos continuamente. Pero repito, 497 00:18:42,390 --> 00:18:43,390 si usamos un HACER, 498 00:18:44,150 --> 00:18:46,190 no puedo yo pretender 499 00:18:46,190 --> 00:18:47,809 meter el mismo objeto dos veces, 500 00:18:47,809 --> 00:18:48,750 porque no va a caer. 501 00:18:49,549 --> 00:18:51,970 ¿Por qué podría meter el mismo objeto 502 00:18:51,970 --> 00:18:53,809 y en dos objetos diferentes? 503 00:18:54,170 --> 00:18:56,009 no, a ver, es que 504 00:18:56,009 --> 00:18:58,130 lo de que por dentro está el linked list 505 00:18:58,130 --> 00:19:00,029 eso es como se ha implementado por dentro 506 00:19:00,029 --> 00:19:02,009 pero esto es un conjunto 507 00:19:02,009 --> 00:19:03,869 y el conjunto no lleva 508 00:19:03,869 --> 00:19:05,809 registro de la posición, con lo cual 509 00:19:05,809 --> 00:19:07,450 no te va a permitir 510 00:19:07,450 --> 00:19:09,829 recuperar la posición, lo cual no permite 511 00:19:09,829 --> 00:19:12,069 recuperar la posición, no te deja 512 00:19:12,069 --> 00:19:13,849 meter un objeto igual a otro 513 00:19:13,849 --> 00:19:16,130 que ya está, porque entonces no lo podrías 514 00:19:16,130 --> 00:19:17,309 distinguir en la iteración 515 00:19:17,309 --> 00:19:18,150 pero igual 516 00:19:18,150 --> 00:19:21,950 da igual 517 00:19:21,950 --> 00:19:23,690 no te deja en ningún caso 518 00:19:23,690 --> 00:19:25,890 Pero bajo qué criterio de igualdad 519 00:19:25,890 --> 00:19:27,690 Bajo el criterio que estén iguales 520 00:19:27,690 --> 00:19:28,690 ¿Vale? 521 00:19:29,190 --> 00:19:30,630 Bajo el criterio que estén iguales 522 00:19:30,630 --> 00:19:31,509 ¿Vale? 523 00:19:32,150 --> 00:19:33,829 Pero si tú decides un haset 524 00:19:33,829 --> 00:19:35,809 Por ejemplo para guardar alumnos 525 00:19:35,809 --> 00:19:37,150 ¿Vale? 526 00:19:37,410 --> 00:19:38,130 Pues entonces 527 00:19:38,130 --> 00:19:40,430 Lo que sí o sí vas a tener que hacer 528 00:19:40,430 --> 00:19:43,329 Es implementar la función de hash 529 00:19:43,329 --> 00:19:46,099 ¿Vale? 530 00:19:47,299 --> 00:19:48,400 Y para eso 531 00:19:48,400 --> 00:19:51,099 Se implementará el método de hash 532 00:19:51,099 --> 00:19:52,279 Que es este 533 00:19:52,279 --> 00:19:55,400 claro, entonces ahora ya 534 00:19:55,400 --> 00:19:57,119 este método será 535 00:19:57,119 --> 00:19:58,460 el que 536 00:19:58,460 --> 00:20:01,420 cuando lo llame cada objeto alumno 537 00:20:01,420 --> 00:20:03,180 te lleve 538 00:20:03,180 --> 00:20:05,000 aunque repito, esto es más para 539 00:20:05,000 --> 00:20:07,599 luego veremos que en el uso no hay nada de lo que preocuparse 540 00:20:07,599 --> 00:20:09,380 pero bueno, para entender 541 00:20:09,380 --> 00:20:10,599 lo que es 542 00:20:10,599 --> 00:20:12,900 este método que hagamos aquí 543 00:20:12,900 --> 00:20:15,079 será el que cuando 544 00:20:15,079 --> 00:20:16,900 se aplique para un objeto alumno 545 00:20:16,900 --> 00:20:18,720 concreto, un objeto alumno 546 00:20:18,720 --> 00:20:20,019 pues te lleve 547 00:20:20,019 --> 00:20:22,460 a la posición de esta tabla 548 00:20:22,460 --> 00:20:24,259 de códigos hashing 549 00:20:24,259 --> 00:20:25,859 que hay, te lleva a la posición 550 00:20:25,859 --> 00:20:28,380 pero con llevarte a la posición 551 00:20:28,380 --> 00:20:29,359 no lo tienes todo 552 00:20:29,359 --> 00:20:32,299 ahora el hashing 553 00:20:32,299 --> 00:20:34,420 tiene que seguir iterando hasta que lo 554 00:20:34,420 --> 00:20:36,460 encuentra, entonces ahora ya 555 00:20:36,460 --> 00:20:37,660 una vez que está en la posición 556 00:20:37,660 --> 00:20:39,740 tiene que recorrer la lista 557 00:20:39,740 --> 00:20:42,420 hasta que encuentra uno 558 00:20:42,420 --> 00:20:44,099 igual que el que está escribiendo 559 00:20:44,099 --> 00:20:46,420 claro, lo hace automáticamente 560 00:20:46,420 --> 00:20:48,500 pero ahora ya cuando 561 00:20:48,500 --> 00:20:50,859 él ya está recorriendo la lista 562 00:20:50,859 --> 00:20:52,599 como esto es una lista 563 00:20:52,599 --> 00:20:54,480 ¿qué necesita 564 00:20:54,480 --> 00:20:56,839 Java, la máquina virtual 565 00:20:56,839 --> 00:20:59,059 para ver si ha encontrado un objeto 566 00:20:59,059 --> 00:21:00,039 dentro de una lista? 567 00:21:00,839 --> 00:21:02,579 el equals, con lo cual 568 00:21:02,579 --> 00:21:04,660 no vale con el hashcode, hay que poner 569 00:21:04,660 --> 00:21:05,460 también el equals 570 00:21:05,460 --> 00:21:07,599 hay que poner los dos 571 00:21:07,599 --> 00:21:12,680 si ahora mismo os doy un ejemplo y veréis que fácil 572 00:21:12,680 --> 00:21:13,259 y que bonito 573 00:21:13,259 --> 00:21:15,119 ¿vale? 574 00:21:15,119 --> 00:21:17,720 No, no, no 575 00:21:17,720 --> 00:21:19,319 Vais a dejar de petar súper rápido 576 00:21:19,319 --> 00:21:20,099 Porque esto es 577 00:21:20,099 --> 00:21:21,039 Vale 578 00:21:21,039 --> 00:21:26,380 Si yo quiero meter alumnos en un Haset 579 00:21:26,380 --> 00:21:28,200 Tengo que tener implementado 580 00:21:28,200 --> 00:21:29,740 El Hasco y el Equal 581 00:21:29,740 --> 00:21:31,140 ¿Por qué? 582 00:21:31,980 --> 00:21:33,279 No porque los vaya a usar yo 583 00:21:33,279 --> 00:21:36,039 Porque el Haset dentro los va a necesitar 584 00:21:36,039 --> 00:21:38,079 Porque él los va a necesitar 585 00:21:38,079 --> 00:21:40,000 Y él los va a necesitar 586 00:21:40,000 --> 00:21:41,579 Porque yo me voy a limitar a hacer un Add 587 00:21:41,579 --> 00:21:43,519 Vale, yo voy a hacer un Add 588 00:21:43,519 --> 00:21:45,079 Pero es que después de que yo haga un Add 589 00:21:45,079 --> 00:21:50,940 El por dentro va a hacer el hashCode para ver en qué elemento está. 590 00:21:51,619 --> 00:21:53,640 Luego, para ver en qué posición está de la tabla. 591 00:21:54,079 --> 00:21:57,119 Y luego irá recorriendo la lista, ¿vale? 592 00:21:57,279 --> 00:21:59,640 Para ver si hay uno igual a ese o no. 593 00:22:00,319 --> 00:22:03,299 Porque si hay uno igual te va a decir, no, yo no admito duplicados. 594 00:22:04,339 --> 00:22:04,519 ¿Vale? 595 00:22:04,539 --> 00:22:06,099 Y para eso va a necesitar el equals. 596 00:22:10,240 --> 00:22:13,700 Luego, estos dos métodos van a tener que estar implementados. 597 00:22:14,359 --> 00:22:15,579 Ahora, antes de ver un ejemplo. 598 00:22:17,680 --> 00:22:19,099 ¿Cómo implementamos el equals? 599 00:22:19,579 --> 00:22:20,519 Eso ya lo sabemos. 600 00:22:21,640 --> 00:22:24,279 Implementamos el equals de tal manera que refleje 601 00:22:24,279 --> 00:22:27,619 la igualdad que nos interesa a nosotros, claro, en nuestra aplicación. 602 00:22:27,700 --> 00:22:28,480 Eso lo tenemos clarísimo. 603 00:22:29,000 --> 00:22:32,019 Si mis alumnos son iguales a igualdad de NIR, mi equals se basa en NIR. 604 00:22:32,480 --> 00:22:35,759 Si mis mesas son iguales a igualdad de color, el equals se basa en color. 605 00:22:35,759 --> 00:22:40,400 Eso yo lo implemento reflejando la situación real, claro. 606 00:22:40,400 --> 00:22:43,140 esto, ¿cómo lo implemento? 607 00:22:43,200 --> 00:22:44,700 pero si no sabemos ni lo que es 608 00:22:44,700 --> 00:22:47,400 esto es un tema que me ha pedido 609 00:22:47,400 --> 00:22:49,440 el Haset, pero es que yo no sé 610 00:22:49,440 --> 00:22:51,279 ni de qué va esto, ¿cómo lo implemento? 611 00:22:53,039 --> 00:22:53,799 claro, entonces 612 00:22:53,799 --> 00:22:55,240 normalmente 613 00:22:55,240 --> 00:22:57,480 optamos a lo que él te ofrece 614 00:22:57,480 --> 00:22:59,299 ¿vale? pero claro 615 00:22:59,299 --> 00:23:00,680 podríamos implementar a nosotros 616 00:23:00,680 --> 00:23:03,440 si tuviéramos el tino 617 00:23:03,440 --> 00:23:05,579 de decir, a ver, como yo sé la cantidad 618 00:23:05,579 --> 00:23:06,880 de objetos que tengo 619 00:23:06,880 --> 00:23:09,380 para optimizar que no haya subconjuntos 620 00:23:09,380 --> 00:23:11,259 demasiado grandes, demasiado pequeños 621 00:23:11,259 --> 00:23:12,420 lo podríamos dar a mano a vosotros 622 00:23:12,420 --> 00:23:14,680 pero bueno, hay que tener muchísimo control 623 00:23:14,680 --> 00:23:17,220 de todos los objetos que van a acabar llegando 624 00:23:17,220 --> 00:23:19,220 por ejemplo, no podría hacer esto 625 00:23:19,220 --> 00:23:21,019 lo que yo he dicho antes, podría hacer return 1 626 00:23:21,019 --> 00:23:23,099 y esa es una función de hash 627 00:23:23,099 --> 00:23:24,640 perfectamente válida, return 1 628 00:23:24,640 --> 00:23:26,339 pero ¿qué habríamos conseguido? 629 00:23:26,519 --> 00:23:29,380 una tabla hash así, con una única posición 630 00:23:29,380 --> 00:23:31,200 y todos los objetos 631 00:23:31,200 --> 00:23:33,380 colgando en una única lista enlazada 632 00:23:33,380 --> 00:23:34,579 ¡qué tontería! 633 00:23:34,920 --> 00:23:36,539 no hemos ganado nada en eficiencia 634 00:23:36,539 --> 00:23:38,359 para eso hacemos un linked list 635 00:23:38,359 --> 00:23:42,640 podríamos hacer un hash code 636 00:23:42,640 --> 00:23:44,500 que me diera un código 637 00:23:44,500 --> 00:23:47,059 único, que me diera la propia clave primaria 638 00:23:47,059 --> 00:23:48,099 el propio NIF 639 00:23:48,099 --> 00:23:50,099 o sea un código entero 640 00:23:50,099 --> 00:23:52,380 claro, pero entonces 641 00:23:52,380 --> 00:23:55,000 ostras, tengo una tabla hash 642 00:23:55,000 --> 00:23:56,380 tan grandota 643 00:23:56,380 --> 00:23:58,799 tan grandota como objetos tengo 644 00:23:58,799 --> 00:24:00,660 pues para eso hago un array 645 00:24:00,660 --> 00:24:02,279 que tontería, para eso hago un array 646 00:24:02,279 --> 00:24:04,720 lo que yo quiero es un compromiso entre ambas cosas 647 00:24:04,720 --> 00:24:05,720 quiero 648 00:24:05,720 --> 00:24:08,640 la flexibilidad de los arrays 649 00:24:08,640 --> 00:24:10,460 a los que accedo rápido 650 00:24:10,460 --> 00:24:11,660 con código 651 00:24:11,660 --> 00:24:14,240 y la ventaja de las listas enlazadas 652 00:24:14,240 --> 00:24:16,519 entonces la forma de mezclar las dos 653 00:24:16,519 --> 00:24:18,799 cosas es el 654 00:24:18,799 --> 00:24:20,859 haset que te da la ventaja 655 00:24:20,859 --> 00:24:22,440 de los arrays porque una vez que has sacado 656 00:24:22,440 --> 00:24:23,500 el código hash 657 00:24:23,500 --> 00:24:25,680 llegas de buenas a primeras 658 00:24:25,680 --> 00:24:28,339 pero claro, un array con todos los elementos 659 00:24:28,339 --> 00:24:30,859 es demasiado, pues un array intermedio 660 00:24:30,859 --> 00:24:32,720 y los que te rebosan 661 00:24:32,720 --> 00:24:34,299 los que te rebosan 662 00:24:34,299 --> 00:24:35,519 en listas enlazadas 663 00:24:35,519 --> 00:24:39,079 es una mezcla de las dos ideas 664 00:24:39,079 --> 00:24:45,039 pero que os gusta 665 00:24:45,039 --> 00:24:48,259 lo disfrutáis o no lo disfrutáis 666 00:24:48,259 --> 00:24:50,480 pero cuando tú le haces generar métodos 667 00:24:50,480 --> 00:24:52,799 que lo generan los mismos criterios 668 00:24:52,799 --> 00:24:57,420 yo creo que tampoco se lo veo 669 00:24:57,420 --> 00:24:58,240 vamos a ver 670 00:24:58,240 --> 00:24:59,759 vamos a hacer un ejemplito 671 00:24:59,759 --> 00:25:04,980 no, si quieres sin ejemplos 672 00:25:04,980 --> 00:25:10,960 claro, pero si vosotros podéis con todo 673 00:25:10,960 --> 00:25:11,440 hombre 674 00:25:11,440 --> 00:25:17,200 examen sorpresa 675 00:25:17,200 --> 00:25:18,839 el viernes, después del recreo 676 00:25:18,839 --> 00:25:23,700 el que si le da un examen en huelga 677 00:25:23,700 --> 00:25:26,460 mira, las legalidades 678 00:25:26,460 --> 00:25:27,880 no las pasamos nosotros 679 00:25:27,880 --> 00:25:42,619 está grabado 680 00:25:42,619 --> 00:25:46,859 vale, bueno 681 00:25:46,859 --> 00:25:52,400 venga 682 00:25:52,400 --> 00:25:55,200 antes ya de empezar ejercicios, ya que lo mezclen 683 00:25:55,200 --> 00:25:56,859 todo, vamos a hacer 684 00:25:56,859 --> 00:25:58,920 un pequeño esto de hashet, que es con el que más 685 00:25:58,920 --> 00:26:16,210 Quizá os habéis... Vale. Venga. A ver, ¿tengo ya algún proyecto que sea ejemplo, colecciones? 686 00:26:16,210 --> 00:26:32,950 Vale, pues a ver, por ejemplo 687 00:26:32,950 --> 00:26:35,170 en nuestro proyecto Ejemplo Colecciones 688 00:26:35,170 --> 00:26:37,650 vamos a hacer 689 00:26:37,650 --> 00:26:38,549 una aplicación 690 00:26:38,549 --> 00:26:40,769 para trabajar con alumnos 691 00:26:40,769 --> 00:26:42,789 es que es la clase más fácil de hacer 692 00:26:42,789 --> 00:26:44,890 pero como tiene notas, que baje el cacharro 693 00:26:44,890 --> 00:26:46,250 y encienda la luz. Bien. 694 00:26:48,549 --> 00:26:49,470 Buen apunte. 695 00:26:56,470 --> 00:27:04,730 Ya, porque igual no se acercan tanto. 696 00:27:06,869 --> 00:27:07,309 Venga. 697 00:27:10,849 --> 00:27:12,990 Bueno, yo tengo aquí un proyecto, Ejemplo Colecciones, 698 00:27:12,990 --> 00:27:14,990 donde el viernes pasado rápidamente 699 00:27:14,990 --> 00:27:17,250 vimos lo de que las listas 700 00:27:17,250 --> 00:27:18,990 parametrizarlos, cómo funciona 701 00:27:18,990 --> 00:27:21,069 el Contents y el RunMove, todavía voy a reutilizar esto 702 00:27:21,069 --> 00:27:22,450 pero vamos, da igual, ya lo subiré 703 00:27:22,450 --> 00:27:25,049 vale, entonces, este main 704 00:27:25,049 --> 00:27:27,029 me da un poco igual, es lo único 705 00:27:27,029 --> 00:27:28,690 que tenía este proyecto, vale 706 00:27:28,690 --> 00:27:30,730 una aplicación que trabaja con alumnos 707 00:27:30,730 --> 00:27:32,890 entonces como son muchos los tengo que meter en algún lado 708 00:27:32,890 --> 00:27:33,950 el array no me gusta 709 00:27:33,950 --> 00:27:36,769 entonces vamos a hacernos nuestra 710 00:27:36,769 --> 00:27:38,470 clase alumno 711 00:27:38,470 --> 00:27:43,710 Sí, pero es que ya lo tengo hecho entero 712 00:27:43,710 --> 00:27:45,509 Y no quiero rellenarlo de basurilla 713 00:27:45,509 --> 00:27:50,690 Porque ese está solo con listas 714 00:27:50,690 --> 00:27:56,390 Esto es solo para ver lo del Hasco, del Equals y poco más 715 00:27:56,390 --> 00:27:57,670 Vale, pues tenemos 716 00:27:57,670 --> 00:28:03,450 Nuestra clase alumno 717 00:28:03,450 --> 00:28:06,329 Nuestra aplicación trabaja con alumnos 718 00:28:06,329 --> 00:28:07,329 Quiere ver 719 00:28:07,329 --> 00:28:10,250 Las notas que tienen 720 00:28:10,250 --> 00:28:11,990 Para suspenderles 721 00:28:11,990 --> 00:28:14,690 Y todo lo que haga falta 722 00:28:14,690 --> 00:28:22,210 Eso no 723 00:28:22,210 --> 00:28:26,730 Ostras 724 00:28:26,730 --> 00:28:28,910 O sea, ahí estás peligroso 725 00:28:28,910 --> 00:28:30,769 Conviene que no te pongamos 726 00:28:30,769 --> 00:28:35,829 Venga, pues nos hacemos nuestro constructor 727 00:28:35,829 --> 00:28:41,589 Y nuestros getty set 728 00:28:47,289 --> 00:28:54,509 Vale, venga 729 00:28:54,509 --> 00:28:58,089 Pero si no he hecho nada todavía 730 00:28:58,089 --> 00:29:00,809 Nif, nombre y nota 731 00:29:00,809 --> 00:29:06,410 Nuestro alumno con Nif, nombre y nota 732 00:29:06,410 --> 00:29:09,049 Venga, pues vamos a jugar con él 733 00:29:09,049 --> 00:29:13,029 Y vamos a putearle un poco aquí 734 00:29:13,029 --> 00:29:13,970 A este alumno 735 00:29:13,970 --> 00:29:18,089 Venga, esto fuera 736 00:29:18,089 --> 00:29:20,170 Vale, pues tenemos ahora 737 00:29:20,170 --> 00:29:23,289 Yo quiero trabajar con un montón de alumnos 738 00:29:23,289 --> 00:29:24,950 Para hacer las medias de sus notas 739 00:29:24,950 --> 00:29:25,410 Todo eso 740 00:29:25,410 --> 00:29:27,710 Claro, mi montón de alumnos 741 00:29:27,710 --> 00:29:33,589 No quiero meter al mismo alumno dos veces 742 00:29:33,589 --> 00:29:35,109 No tengo ninguna necesidad 743 00:29:35,109 --> 00:29:36,069 De meter al mismo alumno dos veces 744 00:29:36,069 --> 00:29:39,029 Con lo cual el registrar la posición 745 00:29:39,029 --> 00:29:39,970 En la que los voy metiendo 746 00:29:39,970 --> 00:29:41,589 No aporta nada a mi aplicación 747 00:29:41,589 --> 00:29:44,329 Podría haber aplicaciones en las que sí aporta 748 00:29:44,329 --> 00:29:45,950 Registrar la posición en la que lo meto 749 00:29:45,950 --> 00:29:47,049 Pero en esta no aporta nada 750 00:29:47,049 --> 00:29:50,009 pues decido que voy a guardarlos en un set 751 00:29:50,009 --> 00:29:50,910 vale 752 00:29:50,910 --> 00:29:54,069 el set es una clase genérica 753 00:29:54,069 --> 00:29:55,710 claro 754 00:29:55,710 --> 00:29:57,049 yo la podría usar así 755 00:29:57,049 --> 00:29:58,750 set alumnos 756 00:29:58,750 --> 00:30:01,509 y ahora cuando la implemento 757 00:30:01,509 --> 00:30:03,450 aquí ya sí que tengo que decidir la implementación 758 00:30:03,450 --> 00:30:05,569 lógicamente, porque set es la clase abstracta 759 00:30:05,569 --> 00:30:06,210 o interfaz 760 00:30:06,210 --> 00:30:09,210 vale, pues voy a decidir un haset 761 00:30:09,210 --> 00:30:11,690 porque me han dicho que es la más 762 00:30:11,690 --> 00:30:12,849 eficiente y la más guay 763 00:30:12,849 --> 00:30:15,589 venga, pues importo set 764 00:30:15,589 --> 00:30:17,710 De Java útil 765 00:30:17,710 --> 00:30:20,009 Y Hachette también 766 00:30:20,009 --> 00:30:20,690 De Java útil 767 00:30:20,690 --> 00:30:24,230 Y yo puedo trabajar 768 00:30:24,230 --> 00:30:25,890 Con el conjunto así a lo bestia 769 00:30:25,890 --> 00:30:27,950 Ya 770 00:30:27,950 --> 00:30:29,849 Esa raya amarilla me dice 771 00:30:29,849 --> 00:30:32,509 Jode, que mal hacen las cosas 772 00:30:32,509 --> 00:30:35,769 No, no, no, no 773 00:30:35,769 --> 00:30:36,650 No es eso lo que me está diciendo 774 00:30:36,650 --> 00:30:38,930 Que está sin parametrizar 775 00:30:38,930 --> 00:30:40,430 Vale 776 00:30:40,430 --> 00:30:42,210 Vale, entonces 777 00:30:42,210 --> 00:30:43,930 Tiene el hash que es el de equals 778 00:30:43,930 --> 00:30:47,970 entonces 779 00:30:47,970 --> 00:30:50,009 yo ahora podría trabajar con alumnos 780 00:30:50,009 --> 00:30:52,069 y decir, venga pues me voy a hacer un nuevo alumno 781 00:30:52,069 --> 00:30:55,859 venga pues 782 00:30:55,859 --> 00:30:56,160 hala 783 00:30:56,160 --> 00:30:59,900 add new 784 00:30:59,900 --> 00:31:01,880 alumno 785 00:31:01,880 --> 00:31:04,140 pues nada, nif1 786 00:31:04,140 --> 00:31:06,640 nombre 787 00:31:06,640 --> 00:31:08,980 alumno1 788 00:31:09,579 --> 00:31:10,980 y nota1 789 00:31:11,500 --> 00:31:12,700 vale 790 00:31:12,700 --> 00:31:15,200 y me deja meter el alumno en la colección 791 00:31:15,200 --> 00:31:15,960 perfectamente 792 00:31:15,960 --> 00:31:18,980 pero claro, yo estoy en otro punto 793 00:31:18,980 --> 00:31:19,299 de 794 00:31:19,299 --> 00:31:22,640 de la aplicación 795 00:31:22,640 --> 00:31:24,579 tengo otra clase alumno 796 00:31:24,579 --> 00:31:26,720 y ya no sé lo que estoy haciendo 797 00:31:26,720 --> 00:31:28,839 y con esta colección alumnos 798 00:31:28,839 --> 00:31:30,720 pues estoy metiendo de repente 799 00:31:30,720 --> 00:31:32,619 ah vale, pues voy a meter en mis alumnos 800 00:31:32,619 --> 00:31:34,920 un alumno que se llame Pepito 801 00:31:34,920 --> 00:31:37,079 ¿por qué no? voy a meter a uno que se llame Pepito 802 00:31:37,079 --> 00:31:38,400 yo quiero meter a uno que se llame Pepito 803 00:31:38,400 --> 00:31:40,859 claro, me deja 804 00:31:40,859 --> 00:31:42,619 meter lo que me dé a mí la gana 805 00:31:42,619 --> 00:31:44,720 como si quiero meter ahí 806 00:31:44,720 --> 00:31:47,339 lo que sea 807 00:31:47,339 --> 00:31:48,819 claro, entonces 808 00:31:48,819 --> 00:31:51,059 este no es el uso adecuado 809 00:31:51,059 --> 00:31:52,319 y profesional de los set 810 00:31:52,319 --> 00:31:54,720 ¿por qué? porque yo no me pongo a iterar 811 00:31:54,720 --> 00:31:57,079 a veces saco un objeto alumno, a veces saco 812 00:31:57,079 --> 00:31:58,519 un string, a veces saco un número 813 00:31:58,519 --> 00:32:00,859 como lo casteo, no tengo ni idea 814 00:32:00,859 --> 00:32:02,839 como me hago instance of de todos los tipos 815 00:32:02,839 --> 00:32:04,599 de universo, un desastre 816 00:32:04,599 --> 00:32:07,339 entonces, pues no es la forma de usarlo 817 00:32:07,339 --> 00:32:09,079 ¿cuál es la forma 818 00:32:09,079 --> 00:32:11,400 de usar las clases que son genéricas? 819 00:32:11,539 --> 00:32:12,160 porque set 820 00:32:12,160 --> 00:32:14,059 si la abrimos 821 00:32:14,059 --> 00:32:17,349 vemos que efectivamente 822 00:32:17,349 --> 00:32:18,589 es genérica 823 00:32:18,589 --> 00:32:21,309 en lugar de T lo han llamado E 824 00:32:21,309 --> 00:32:23,190 pues SET 825 00:32:23,190 --> 00:32:24,890 te dice 826 00:32:24,890 --> 00:32:27,410 espérate, dime el tipo 827 00:32:27,410 --> 00:32:29,210 de dato que te interesa para este 828 00:32:29,210 --> 00:32:30,910 conjunto en concreto, dímelo 829 00:32:30,910 --> 00:32:33,450 veis que hereda de colección, con lo cual colección 830 00:32:33,450 --> 00:32:34,509 es clase, no es interfaz 831 00:32:34,509 --> 00:32:35,730 vale 832 00:32:35,730 --> 00:32:38,809 y SET es interfaz, me lo afirmas 833 00:32:38,809 --> 00:32:39,890 vale 834 00:32:39,890 --> 00:32:43,289 bueno pues vamos a 835 00:32:43,289 --> 00:32:44,670 oye si yo quiero alumnos 836 00:32:44,670 --> 00:32:46,990 ojo voy a darle 837 00:32:46,990 --> 00:32:49,269 ya el valor al parámetro 838 00:32:49,269 --> 00:32:49,950 alumno 839 00:32:49,950 --> 00:32:51,589 vale 840 00:32:51,589 --> 00:32:54,950 entonces aquí podéis poner alumno 841 00:32:54,950 --> 00:32:56,869 podéis no ponerlo, da igual, con que pongáis las dos 842 00:32:56,869 --> 00:32:58,049 cositas ya se queda claro 843 00:32:58,049 --> 00:33:00,829 da igual, en este caso 844 00:33:00,829 --> 00:33:02,769 da igual, aquí es donde sí que hay que ponerlo 845 00:33:02,769 --> 00:33:04,710 vale, y de nuevo 846 00:33:04,710 --> 00:33:06,589 aquí podríais poner haset también 847 00:33:06,589 --> 00:33:09,109 da igual, da lo mismo 848 00:33:09,109 --> 00:33:12,609 porque como haset hereda 849 00:33:12,609 --> 00:33:14,809 a ver, la única diferencia es que si luego yo quiero usar 850 00:33:14,809 --> 00:33:16,509 la referencia con un tricep 851 00:33:16,509 --> 00:33:17,890 pues no, vale 852 00:33:17,890 --> 00:33:20,130 pero bueno, yo tengo la manía 853 00:33:20,130 --> 00:33:21,410 de la superclase 854 00:33:21,410 --> 00:33:23,230 hacerla siempre lo más 855 00:33:23,230 --> 00:33:26,829 arriba de la jerarquía posible para dejarla abierta 856 00:33:26,829 --> 00:33:28,589 que a veces me paso 857 00:33:28,589 --> 00:33:30,029 porque luego me faltan métodos 858 00:33:30,029 --> 00:33:31,809 entonces tengo que hacer un casting que tampoco mola 859 00:33:31,809 --> 00:33:33,769 pero bueno, tengo esa manía de 860 00:33:33,769 --> 00:33:36,509 las colecciones, instanciarlas como la superclase 861 00:33:37,130 --> 00:33:38,710 perdón, declararlas 862 00:33:38,710 --> 00:33:40,329 como la superclase y luego instanciarlas 863 00:33:40,329 --> 00:33:41,730 como ya quieran, vale 864 00:33:41,730 --> 00:33:44,609 ahora ya como ya le he dado el parámetro 865 00:33:44,609 --> 00:33:46,670 lógicamente esta ya me dice 866 00:33:46,670 --> 00:33:47,049 no 867 00:33:47,049 --> 00:33:50,410 no puedes meter un stream 868 00:33:50,410 --> 00:33:51,609 luego bien 869 00:33:51,609 --> 00:33:55,049 primera el compilador 870 00:33:55,049 --> 00:33:56,589 ya nos está protegiendo 871 00:33:56,589 --> 00:33:57,509 de hacer alguna burrada 872 00:33:57,509 --> 00:33:58,569 nos está protegiendo 873 00:33:58,569 --> 00:34:01,109 vamos a meter 874 00:34:01,109 --> 00:34:03,109 otro alumno 875 00:34:03,109 --> 00:34:08,130 el mismito 876 00:34:08,130 --> 00:34:10,510 el mismito 877 00:34:10,510 --> 00:34:12,710 alumnos, add, el mismo 878 00:34:12,710 --> 00:34:15,250 su unif es uno, se llama alumno uno y su nota es uno 879 00:34:15,250 --> 00:34:15,929 el mismito 880 00:34:15,929 --> 00:34:19,349 y ahora voy a iterar por la colección 881 00:34:19,349 --> 00:34:20,590 a ver que tengo 882 00:34:20,590 --> 00:34:23,170 vale, ahora ya 883 00:34:23,170 --> 00:34:24,590 vamos a iterar 884 00:34:24,590 --> 00:34:26,750 por una colección, iterar que es 885 00:34:26,750 --> 00:34:29,130 recorrerla y ver que hay en cada 886 00:34:29,130 --> 00:34:30,590 posición, vale 887 00:34:30,590 --> 00:34:37,199 entonces, como podemos 888 00:34:37,199 --> 00:34:38,559 iterar por una colección 889 00:34:38,559 --> 00:34:40,360 de muchas maneras 890 00:34:40,360 --> 00:34:42,860 si, de muchas maneras distintas 891 00:34:42,860 --> 00:34:45,179 la más simple 892 00:34:45,179 --> 00:34:47,019 es el for each 893 00:34:47,019 --> 00:34:49,659 la más simple, que lo usábamos también para los arrays 894 00:34:49,659 --> 00:34:51,619 la más simple es esta 895 00:34:51,619 --> 00:34:53,639 que es 896 00:34:53,639 --> 00:34:55,860 para cada tipo de dato mío en el set 897 00:34:55,860 --> 00:34:56,880 que es alumno 898 00:34:56,880 --> 00:34:59,400 dentro 899 00:34:59,400 --> 00:35:01,460 de mi set de alumnos 900 00:35:01,460 --> 00:35:02,659 si hubiera muchos tipos de datos 901 00:35:02,659 --> 00:35:04,599 como lo hubieras hecho al principio 902 00:35:04,599 --> 00:35:07,000 tendría que poner object 903 00:35:07,000 --> 00:35:08,659 solo me dejaría poner ahí object 904 00:35:08,659 --> 00:35:10,599 si no lo hubiera parametrizado 905 00:35:10,599 --> 00:35:12,840 aquí iría object 906 00:35:12,840 --> 00:35:15,579 porque como en la colección cae cualquier 907 00:35:15,579 --> 00:35:17,940 object, es decir, no parametrizar 908 00:35:17,940 --> 00:35:19,860 sería idéntico 909 00:35:19,860 --> 00:35:20,500 hacer esto 910 00:35:20,500 --> 00:35:22,920 hacer esto 911 00:35:22,920 --> 00:35:25,340 y no poner nada es la misma cosa 912 00:35:25,340 --> 00:35:27,719 es lo mismo, porque object es la superclase 913 00:35:27,719 --> 00:35:29,599 que es cualquier cosa, cualquiera 914 00:35:29,599 --> 00:35:30,559 es object, cualquiera 915 00:35:30,559 --> 00:35:31,679 ¿vale? 916 00:35:35,179 --> 00:35:36,039 object sí 917 00:35:36,039 --> 00:35:39,900 bueno, te lo he dicho 918 00:35:39,900 --> 00:35:40,480 muy rápido 919 00:35:40,480 --> 00:35:42,559 no sé si object 920 00:35:42,559 --> 00:35:45,139 no, yo creo que 921 00:35:45,139 --> 00:35:46,219 no lo sé, a ver 922 00:35:46,219 --> 00:35:49,159 creo que puedes instanciar 923 00:35:49,159 --> 00:35:50,960 un objeto, aunque es un objeto 924 00:35:50,960 --> 00:35:52,179 que no va a tener nada dentro 925 00:35:52,179 --> 00:35:54,099 lo que pasa es que abrir objetos tarda un montón 926 00:35:54,099 --> 00:35:56,260 es un rollo 927 00:35:56,260 --> 00:35:58,480 es más fácil buscar la mano 928 00:35:58,480 --> 00:36:01,000 pero bueno, me voy a parar 929 00:36:01,000 --> 00:36:02,139 ya está 930 00:36:02,139 --> 00:36:03,960 voy a pararlo también 931 00:36:03,960 --> 00:36:07,320 ah, pues mira, ya me había salido 932 00:36:07,320 --> 00:36:09,139 bueno, no lo sé 933 00:36:09,139 --> 00:36:10,199 míralo por curiosidad 934 00:36:10,199 --> 00:36:13,559 vale, pero en nuestro caso 935 00:36:13,559 --> 00:36:15,559 no queremos instanciar object 936 00:36:15,559 --> 00:36:16,579 sino alumno 937 00:36:16,579 --> 00:36:18,900 vamos a iterar 938 00:36:18,900 --> 00:36:21,739 esta es la forma más sencilla de iterar 939 00:36:21,739 --> 00:36:23,039 con un for each 940 00:36:23,039 --> 00:36:25,440 voy a ver cada alumno 941 00:36:25,440 --> 00:36:27,599 al que llamo a de esa colección 942 00:36:27,599 --> 00:36:31,969 vamos a ponerle 943 00:36:31,969 --> 00:36:33,469 un toString a 944 00:36:33,469 --> 00:36:36,030 alumno, vamos a ponerle 945 00:36:36,030 --> 00:36:38,090 un toString, vale, para que 946 00:36:38,090 --> 00:36:39,909 así el sistema println me muestre 947 00:36:39,909 --> 00:36:42,250 todo el objeto y no me muestre ese código extraño 948 00:36:42,250 --> 00:36:44,130 que tiene el toString de object. 949 00:36:45,190 --> 00:36:46,050 ¿Vale? Para poder 950 00:36:46,050 --> 00:36:48,349 metérselo al System.out, vamos a ponerle un toString. 951 00:36:49,889 --> 00:36:50,289 Venga. 952 00:36:55,860 --> 00:36:57,119 ¡Hala! Ya tengo un toString 953 00:36:57,119 --> 00:36:58,599 de object y cada vez que le pase 954 00:36:58,599 --> 00:37:01,059 al System.out del object me va a sacar alumno 955 00:37:01,059 --> 00:37:02,260 con nip, nombre, no sé qué. 956 00:37:03,460 --> 00:37:04,679 Venga, pues vamos a iterar. 957 00:37:04,860 --> 00:37:06,320 Por este set que acabo de hacer. 958 00:37:11,690 --> 00:37:12,989 Pues se han metido los dos. 959 00:37:14,389 --> 00:37:14,789 Claro, 960 00:37:15,110 --> 00:37:16,929 porque para él no son duplicados. 961 00:37:17,550 --> 00:37:18,989 Para él son objetos distintos. 962 00:37:18,989 --> 00:37:21,269 ¿por qué? son objetos distintos 963 00:37:21,269 --> 00:37:23,389 porque como en alumno 964 00:37:23,389 --> 00:37:25,829 no hay hasco de equals 965 00:37:25,829 --> 00:37:27,730 él tira 966 00:37:27,730 --> 00:37:29,429 del hasco de equals de object 967 00:37:29,429 --> 00:37:31,789 y ese se genera 968 00:37:31,789 --> 00:37:33,369 en base a la dirección de memoria 969 00:37:33,369 --> 00:37:36,050 con lo cual para el set 970 00:37:36,050 --> 00:37:37,809 este y este 971 00:37:37,809 --> 00:37:39,829 son distintos porque su dirección de memoria 972 00:37:39,829 --> 00:37:40,409 es distinta 973 00:37:40,409 --> 00:37:43,730 pero claro, este no es el uso que yo le quiero dar 974 00:37:43,730 --> 00:37:45,969 claro, yo no quiero 975 00:37:45,969 --> 00:37:47,989 darle, la aplicación tiene que tener un sentido 976 00:37:47,989 --> 00:37:50,409 real, tiene que tener una coherencia, tiene que tener una semántica 977 00:37:50,409 --> 00:37:51,449 que signifique algo 978 00:37:51,449 --> 00:37:53,710 no tiene que ser un absurdo 979 00:37:53,710 --> 00:37:55,369 vale, pues entonces 980 00:37:55,369 --> 00:38:00,070 ahora ya en el 981 00:38:00,070 --> 00:38:02,190 sour le decimos, oye, generame el jasco 982 00:38:02,190 --> 00:38:02,869 de equals 983 00:38:02,869 --> 00:38:04,429 vale 984 00:38:04,429 --> 00:38:08,469 ¿cuál es el parámetro clave primaria 985 00:38:08,469 --> 00:38:08,989 para ti? 986 00:38:09,590 --> 00:38:11,949 en nuestro caso, lo que decidamos 987 00:38:11,949 --> 00:38:14,190 si decidimos que nif, que dos alumnos 988 00:38:14,190 --> 00:38:15,849 a igualdad de nif son iguales 989 00:38:15,849 --> 00:38:18,369 pues nif, que es lo que decidiríamos 990 00:38:18,369 --> 00:38:19,130 obviamente 991 00:38:19,130 --> 00:38:21,650 porque a menos que seamos Brian 992 00:38:21,650 --> 00:38:23,590 no duplicamos las documentaciones 993 00:38:23,590 --> 00:38:24,550 personales de la gente 994 00:38:24,550 --> 00:38:26,090 ¿verdad? 995 00:38:28,250 --> 00:38:29,909 bueno, o sea que habrá algunos cuantos 996 00:38:29,909 --> 00:38:30,789 que lo habréis hecho seguro 997 00:38:30,789 --> 00:38:33,590 para meteros vuestras litronas con 17 998 00:38:33,590 --> 00:38:34,869 supongo 999 00:38:34,869 --> 00:38:37,849 bueno, tú porque 1000 00:38:37,849 --> 00:38:39,730 pero aquí debe haber 1001 00:38:39,730 --> 00:38:41,530 mucho bandarra mimetizado 1002 00:38:41,530 --> 00:38:43,769 sí, la verdad 1003 00:38:43,769 --> 00:38:47,750 no bebo, no fumo 1004 00:38:47,750 --> 00:38:48,989 solo como 1005 00:38:48,989 --> 00:38:51,349 pues 1006 00:38:51,349 --> 00:38:54,010 esa es la mejor elección 1007 00:38:54,010 --> 00:38:55,789 eso es lo que hay que hacer, no fumar, no beber 1008 00:38:55,789 --> 00:38:57,070 y comer, claro que sí 1009 00:38:57,070 --> 00:38:59,150 enhorabuena 1010 00:38:59,150 --> 00:39:01,909 porque no sabrá 1011 00:39:01,909 --> 00:39:03,750 que coman, pero además de comer 1012 00:39:03,750 --> 00:39:05,130 fuman y beban, y eso ya 1013 00:39:05,130 --> 00:39:07,289 venga 1014 00:39:07,289 --> 00:39:10,070 vale, pues me ha hecho el jasco de equals 1015 00:39:10,070 --> 00:39:12,929 del equals 1016 00:39:12,929 --> 00:39:17,090 Delicuas no tenemos nada que aportar 1017 00:39:17,090 --> 00:39:21,010 Silencio 1018 00:39:21,010 --> 00:39:22,829 Que os estáis poniendo nerviositos 1019 00:39:22,829 --> 00:39:27,010 Ana, que te estás alterando 1020 00:39:27,010 --> 00:39:28,630 Te estás alterando 1021 00:39:28,630 --> 00:39:32,929 Ay, que finas sos 1022 00:39:32,929 --> 00:39:37,210 Venga 1023 00:39:37,210 --> 00:39:38,349 ¿Eh? 1024 00:39:40,349 --> 00:39:40,690 Claro 1025 00:39:40,690 --> 00:39:42,730 No sois nada delicadas 1026 00:39:42,730 --> 00:39:46,130 bueno, a ver 1027 00:39:46,130 --> 00:39:49,349 ya hemos respirado