1 00:00:00,000 --> 00:00:03,359 Bueno, muy breve, muy conciso. 2 00:00:04,040 --> 00:00:05,799 Vale, recordad en qué estábamos. 3 00:00:09,679 --> 00:00:11,960 De list sabemos todo lo que hay que saber, 4 00:00:12,160 --> 00:00:13,939 es cuestión de practicar, ¿vale? 5 00:00:14,339 --> 00:00:17,980 Y de set sabemos casi todo lo que hay que saber, ¿vale? 6 00:00:18,800 --> 00:00:25,039 Set son colecciones de datos para guardar objetos a mogollón 7 00:00:25,039 --> 00:00:29,320 en los cuales no necesito tener duplicados 8 00:00:29,320 --> 00:00:32,939 y en los cuales el orden tampoco me importa especialmente. 9 00:00:33,100 --> 00:00:35,259 van ahí a mogollón, yo luego 10 00:00:35,259 --> 00:00:37,340 itero y van saliendo en orden que sea, ¿vale? 11 00:00:38,320 --> 00:00:39,200 Luego siempre va a ser 12 00:00:39,200 --> 00:00:41,259 más eficiente a priori, un set 13 00:00:41,259 --> 00:00:43,179 que un list, porque 14 00:00:43,179 --> 00:00:44,979 se evita toda esa gestión, ¿vale? 15 00:00:46,119 --> 00:00:47,119 Implementaciones de set, 16 00:00:47,439 --> 00:00:47,880 ¡hala! 17 00:00:50,780 --> 00:00:51,340 Implementaciones 18 00:00:51,340 --> 00:00:51,820 de set, 19 00:00:52,640 --> 00:00:57,929 de set, has set, 20 00:00:58,270 --> 00:00:58,450 ¿vale? 21 00:00:59,750 --> 00:01:01,429 Vimos ayer cómo funcionaba, 22 00:01:01,869 --> 00:01:04,129 cómo funciona, internamente 23 00:01:04,129 --> 00:01:05,310 aunque eso 24 00:01:05,310 --> 00:01:08,329 podemos obviarlo de cara a su uso 25 00:01:08,329 --> 00:01:12,090 pero bueno, siempre está bien ser los mejores 26 00:01:12,090 --> 00:01:14,569 vale, pues internamente 27 00:01:14,569 --> 00:01:17,370 ¿cómo guarda un hashet los datos? 28 00:01:18,750 --> 00:01:20,609 pues se hace una tablita 29 00:01:20,609 --> 00:01:24,459 para guardar códigos 30 00:01:24,459 --> 00:01:26,560 y cada objeto 31 00:01:26,560 --> 00:01:29,219 va asociado 32 00:01:29,219 --> 00:01:32,439 a una de esas entradas de la tabla 33 00:01:32,439 --> 00:01:34,859 cada objeto va asociado a una de esas entradas 34 00:01:34,859 --> 00:01:40,040 ¿Cómo se llega del objeto a la entrada que tiene asociada a ese objeto? 35 00:01:40,159 --> 00:01:41,780 Pues a través de una función de hash 36 00:01:41,780 --> 00:01:44,219 Que tiene que estar implementada 37 00:01:44,219 --> 00:01:46,180 Que es esta, ¿vale? 38 00:01:47,000 --> 00:01:48,439 Entonces esa función de hash 39 00:01:48,439 --> 00:01:52,060 Pues bueno, tiene que seguir ciertas reglas 40 00:01:52,060 --> 00:01:53,700 Para que sea más o menos eficiente 41 00:01:53,700 --> 00:01:58,019 Luego a la hora de hacer las operaciones, la CPU 42 00:01:58,019 --> 00:01:59,560 ¿Vale? 43 00:01:59,760 --> 00:02:01,739 Pero bueno, esas reglas nos importan ahora poco 44 00:02:01,739 --> 00:02:03,159 Porque es que el propio Eclipse 45 00:02:03,159 --> 00:02:07,439 nos genera ya una implementación relativamente óptima, ¿vale? 46 00:02:07,719 --> 00:02:10,360 Entonces las implementaciones de esta función de hash 47 00:02:10,360 --> 00:02:12,460 lógicamente hay condiciones que tienen que cumplir. 48 00:02:12,879 --> 00:02:14,580 Como que objetos distintos 49 00:02:14,580 --> 00:02:19,259 tienen que darme siempre códigos distintos, ¿vale? 50 00:02:20,520 --> 00:02:21,979 Es decir, una función de hash 51 00:02:21,979 --> 00:02:26,199 que me llevara a la misma entrada dos objetos distintos 52 00:02:26,199 --> 00:02:29,219 sería una función inválida, por supuesto, 53 00:02:29,219 --> 00:02:30,360 sería una función inválida. 54 00:02:30,360 --> 00:02:36,159 las funciones de hash a objetos distintos, entradas de la tabla distintas 55 00:02:36,159 --> 00:02:38,500 ¿vale? se supone que tiene que llevar 56 00:02:38,500 --> 00:02:44,259 principios de dispersión, es decir, que los códigos 57 00:02:44,259 --> 00:02:48,259 de hash no se parezcan mucho entre sí, bueno, principios 58 00:02:48,259 --> 00:02:51,860 que nos importan poco, lo que nos importa a nosotros es 59 00:02:51,860 --> 00:02:56,419 que el hash set a cada objeto le aplicará esta función 60 00:02:56,419 --> 00:02:58,599 para asociarlo a una entrada de la tabla 61 00:02:58,599 --> 00:03:01,960 Y ya a partir de esta entrada de la tabla 62 00:03:01,960 --> 00:03:04,219 Puede hacer muchas operaciones más fácilmente 63 00:03:04,219 --> 00:03:05,680 Que directamente con el objeto 64 00:03:05,680 --> 00:03:10,840 Entonces como la tabla no puede ser arbitrariamente grande 65 00:03:10,840 --> 00:03:13,280 Porque la tabla no puede ser arbitrariamente grande 66 00:03:13,280 --> 00:03:16,039 Si empieza a haber muchos objetos 67 00:03:16,039 --> 00:03:23,280 Pues muchos de ellos pueden llevarte 68 00:03:23,280 --> 00:03:26,379 A partir de cierta cantidad a la misma cajita 69 00:03:26,379 --> 00:03:29,500 y ahora ya de cada cajita 70 00:03:29,500 --> 00:03:34,349 tengo una lista 71 00:03:34,349 --> 00:03:36,550 con todos los que van a esa caja 72 00:03:36,550 --> 00:03:39,370 ¿vale? así es como funciona internamente 73 00:03:39,370 --> 00:03:42,430 una lista de códigos manejable 74 00:03:42,430 --> 00:03:46,069 ¿vale? y si hay colisión 75 00:03:46,069 --> 00:03:50,169 es decir, la función de hash ha empezado a hacer colisiones 76 00:03:50,169 --> 00:03:51,710 ha empezado a hacerlos 77 00:03:51,710 --> 00:03:54,110 porque ya la tabla no puede crecer indefinidamente 78 00:03:54,110 --> 00:03:56,189 ha empezado a hacerlo, ya ha empezado a pasar esto 79 00:03:56,189 --> 00:03:59,270 que dos objetos me llevan 80 00:03:59,270 --> 00:04:01,330 a la misma entrada 81 00:04:01,330 --> 00:04:03,610 pues entonces de esa entrada 82 00:04:03,610 --> 00:04:05,569 colgarán todos 83 00:04:05,569 --> 00:04:07,150 no es que se ha olvidado 84 00:04:07,150 --> 00:04:08,150 que ya está enlazada 85 00:04:08,150 --> 00:04:11,250 tiene diferentes implementaciones 86 00:04:11,250 --> 00:04:13,229 hace árboles balanceados, hace cosas 87 00:04:13,229 --> 00:04:14,930 dependiendo de la implementación de Java 88 00:04:14,930 --> 00:04:16,490 se han ido incorporando nuevas formas 89 00:04:16,490 --> 00:04:19,589 ¿vale? y entonces a partir de aquí 90 00:04:19,589 --> 00:04:20,629 ¿cómo sabe 91 00:04:20,629 --> 00:04:23,709 cuál de los objetos es? 92 00:04:23,709 --> 00:04:27,149 a través de virtuales. 93 00:04:27,649 --> 00:04:28,910 Bueno, la idea es esa, por dentro. 94 00:04:30,449 --> 00:04:32,649 Entonces, el hash set es la más eficiente que hay. 95 00:04:33,029 --> 00:04:34,149 ¿Vale? Es la más eficiente que hay. 96 00:04:34,949 --> 00:04:37,750 Lo único que nos importa a nosotros para usarla 97 00:04:37,750 --> 00:04:39,550 es que cuando hagamos el add, 98 00:04:40,449 --> 00:04:43,550 si ese objeto ya existe, no se va a insertar. 99 00:04:44,470 --> 00:04:46,629 Cuando usamos el contains y el remove, 100 00:04:47,769 --> 00:04:50,110 el hash set necesita el criterio de igualdad 101 00:04:50,110 --> 00:04:52,129 y el criterio de igualdad del hash set 102 00:04:52,129 --> 00:04:55,410 implica tener las dos funciones 103 00:04:55,410 --> 00:04:56,430 implementadas 104 00:04:56,430 --> 00:04:58,250 el hashcode y el IP 105 00:04:58,250 --> 00:05:00,829 luego, que no se nos olvide nunca 106 00:05:00,829 --> 00:05:02,110 cuando usamos un hashed 107 00:05:02,110 --> 00:05:03,790 en las clases 108 00:05:03,790 --> 00:05:06,490 en la clase 109 00:05:06,490 --> 00:05:08,769 a la cual pertenezcan los objetos 110 00:05:08,769 --> 00:05:10,949 de mi hashed, tener los dos 111 00:05:10,949 --> 00:05:11,910 implementados 112 00:05:11,910 --> 00:05:13,709 tener los dos 113 00:05:13,709 --> 00:05:16,750 por el criterio clave primaria que yo necesite 114 00:05:16,750 --> 00:05:18,769 por el nombre, por el nick, por los dos 115 00:05:18,769 --> 00:05:20,209 por lo que sea, tener los dos 116 00:05:20,209 --> 00:05:23,129 si tengo los dos implementados 117 00:05:23,129 --> 00:05:25,050 en la clase a la que pertenecen 118 00:05:25,050 --> 00:05:26,790 automáticamente ya HashSet 119 00:05:26,790 --> 00:05:28,350 funciona por dentro sin problemas 120 00:05:28,350 --> 00:05:30,769 con esta especie de estructura extraña 121 00:05:30,769 --> 00:05:32,569 una tablita de códigos 122 00:05:32,569 --> 00:05:34,350 cuando hay desbordamiento y colisión 123 00:05:34,350 --> 00:05:36,870 pues de cada código los tengo aquí todos 124 00:05:36,870 --> 00:05:37,910 almacenados 125 00:05:37,910 --> 00:05:42,680 vale 126 00:05:42,680 --> 00:05:44,379 entonces el HashSet 127 00:05:44,379 --> 00:05:46,300 no tiene sentido en él plantearse 128 00:05:46,300 --> 00:05:48,180 orden, no hay orden aquí 129 00:05:48,180 --> 00:05:50,100 aquí están todos donde van cayendo 130 00:05:50,100 --> 00:05:51,079 aquí no hay ningún orden 131 00:05:51,079 --> 00:05:55,910 si yo quiero orden, en principio debería usar una lista 132 00:05:55,910 --> 00:05:57,350 repito, la lista 133 00:05:57,350 --> 00:05:59,970 todos caen en una posición, sobre una filita 134 00:05:59,970 --> 00:06:01,610 y yo ahí me puedo plantear 135 00:06:01,610 --> 00:06:03,110 reordenar según un criterio 136 00:06:03,110 --> 00:06:05,550 como vimos con el comparable, el comparator, lo que quiera 137 00:06:05,550 --> 00:06:06,910 en un hased 138 00:06:06,910 --> 00:06:09,110 aquí no tiene sentido orden 139 00:06:09,110 --> 00:06:10,370 lo uso para entidades 140 00:06:10,370 --> 00:06:12,670 en las cuales el orden no importa 141 00:06:12,670 --> 00:06:15,290 para guardar pues un montón 142 00:06:15,290 --> 00:06:17,689 de muebles 143 00:06:17,689 --> 00:06:19,089 de mi casa, vale 144 00:06:19,089 --> 00:06:20,470 pues me hago un hased de mueble 145 00:06:20,470 --> 00:06:22,930 a un hasher de mueble y ahí meto 146 00:06:22,930 --> 00:06:24,970 pues la silla, mesa 147 00:06:24,970 --> 00:06:25,569 lo que sea 148 00:06:25,569 --> 00:06:28,170 ¿necesito yo algún orden? 149 00:06:28,449 --> 00:06:31,050 ¿mi aplicación le aporta algo que esos muebles 150 00:06:31,050 --> 00:06:32,949 tengan algún orden? pues no le aporta 151 00:06:32,949 --> 00:06:34,910 nada, pues un hasher 152 00:06:34,910 --> 00:06:36,629 la opción siempre ideal 153 00:06:36,629 --> 00:06:37,350 ¿vale? 154 00:06:38,670 --> 00:06:40,850 que ahora queremos hacer colecciones 155 00:06:40,850 --> 00:06:42,629 de cosas en las cuales 156 00:06:42,629 --> 00:06:44,310 que haya un orden si me aporta algo 157 00:06:44,310 --> 00:06:46,810 por ejemplo una colección donde yo meto a todos 158 00:06:46,810 --> 00:06:48,970 mis alumnos, anda pues aquí 159 00:06:48,970 --> 00:06:51,189 el orden sí que me puede importar 160 00:06:51,189 --> 00:06:52,829 porque a lo mejor yo quiero un listado 161 00:06:52,829 --> 00:06:54,430 ordenado alfabéticamente 162 00:06:54,430 --> 00:06:56,970 o quiero un listado ordenado por nota 163 00:06:56,970 --> 00:06:59,149 lo que sea, bueno siempre podría coger 164 00:06:59,149 --> 00:07:00,970 una lista y ya está y hacerlo como 165 00:07:00,970 --> 00:07:02,569 lo hemos hecho hasta ahora, una lista 166 00:07:02,569 --> 00:07:05,290 pero hay una estructura 167 00:07:05,290 --> 00:07:07,050 en cuanto a eficiencia 168 00:07:07,050 --> 00:07:09,209 intermedia que tiene todas las ventajas 169 00:07:09,209 --> 00:07:10,209 del set 170 00:07:10,209 --> 00:07:12,509 en cuanto a que es más eficiente 171 00:07:12,509 --> 00:07:16,839 pero que permite 172 00:07:16,839 --> 00:07:18,959 establecer un criterio de orden 173 00:07:18,959 --> 00:07:20,300 y que por tanto 174 00:07:20,300 --> 00:07:22,819 las cosas que se metan ahí 175 00:07:22,819 --> 00:07:24,300 van a tener un orden 176 00:07:24,300 --> 00:07:26,379 y eso puede que me sea a mi útil 177 00:07:26,379 --> 00:07:28,339 para algunas funcionalidades 178 00:07:28,339 --> 00:07:30,339 del tipo sácame un listado, por ejemplo 179 00:07:30,339 --> 00:07:31,740 ¿vale? 180 00:07:32,279 --> 00:07:34,540 bueno, pues, esa es el tríceps 181 00:07:34,540 --> 00:07:35,439 ¿vale? 182 00:07:36,220 --> 00:07:37,500 que mencionamos rápidamente 183 00:07:37,500 --> 00:07:40,139 que va y ya está, porque el uso es el mismo 184 00:07:40,139 --> 00:07:40,519 en realidad 185 00:07:40,519 --> 00:07:46,540 de implementaciones de set, luego hay otra 186 00:07:46,540 --> 00:07:48,579 que es el 187 00:07:48,579 --> 00:07:48,899 link 188 00:07:48,899 --> 00:07:51,480 haset 189 00:07:51,480 --> 00:07:56,459 que 190 00:07:56,459 --> 00:07:59,079 es un haset 191 00:07:59,079 --> 00:08:01,680 es exactamente un haset 192 00:08:01,680 --> 00:08:03,500 se usa exactamente igual 193 00:08:03,500 --> 00:08:05,019 todo igual, es un haset 194 00:08:05,019 --> 00:08:07,540 la única diferencia es que si yo le pongo el link 195 00:08:07,540 --> 00:08:08,079 en delante 196 00:08:08,079 --> 00:08:10,399 esta implementación 197 00:08:10,399 --> 00:08:12,500 cuando yo itero 198 00:08:12,500 --> 00:08:15,279 los elementos me van saliendo 199 00:08:15,279 --> 00:08:17,000 por el orden en que los inserté 200 00:08:17,000 --> 00:08:18,240 ya está, es lo que aporta 201 00:08:18,240 --> 00:08:21,100 entonces si eso me es útil por algo 202 00:08:21,100 --> 00:08:21,899 en mi aplicación 203 00:08:21,899 --> 00:08:24,019 pues puedo usar un linker hashet 204 00:08:24,019 --> 00:08:26,439 entonces cada vez que itere con un for, con un iterator 205 00:08:26,439 --> 00:08:27,600 con lo que sea, cada vez que itere 206 00:08:27,600 --> 00:08:30,519 los elementos van a salir en el mismo orden 207 00:08:30,519 --> 00:08:31,379 en que lo inserté 208 00:08:31,379 --> 00:08:34,340 ¿significa eso que hay 209 00:08:34,340 --> 00:08:36,600 que los elementos tienen orden, que yo puedo hacer 210 00:08:36,600 --> 00:08:38,139 un sort para ordenar? no, no, no 211 00:08:38,139 --> 00:08:40,659 es simplemente que el linker hashet 212 00:08:40,659 --> 00:08:43,279 conserva el orden de inserción 213 00:08:43,279 --> 00:08:44,600 para luego las iteraciones 214 00:08:44,600 --> 00:08:47,139 ya está, es lo único que aporta 215 00:08:47,139 --> 00:08:49,740 que a alguien le importa eso 216 00:08:49,740 --> 00:08:52,039 porque en la aplicación le interesa 217 00:08:52,039 --> 00:08:53,460 que el orden en que yo inserté 218 00:08:53,460 --> 00:08:55,840 se conserve en las iteraciones porque eso me da 219 00:08:55,840 --> 00:08:57,899 información, bueno, pues 220 00:08:57,899 --> 00:08:59,960 entonces un linked haset en lugar del haset 221 00:08:59,960 --> 00:09:04,039 normal, la estructura más 222 00:09:04,039 --> 00:09:05,240 usada en general 223 00:09:05,240 --> 00:09:07,860 es esta porque es la más eficiente 224 00:09:07,860 --> 00:09:10,340 salvo cuando necesitamos duplicados 225 00:09:10,340 --> 00:09:12,399 o reordenar, si necesitamos duplicados 226 00:09:12,399 --> 00:09:14,279 o reordenar nos vamos a ir a listas siempre 227 00:09:14,279 --> 00:09:20,299 ¿cuándo es mejor el linked haset? 228 00:09:20,299 --> 00:09:22,820 el LinkedHashSet te aporta 229 00:09:22,820 --> 00:09:23,899 respecto al HashSet 230 00:09:23,899 --> 00:09:26,759 que conserva el orden en que tú 231 00:09:26,759 --> 00:09:27,759 fuiste insertando 232 00:09:27,759 --> 00:09:30,720 con el HashSet ya vimos ayer, tú ibas insertando 233 00:09:30,720 --> 00:09:32,700 nombres, Ana, Juan, y luego iterabas 234 00:09:32,700 --> 00:09:34,720 con el for y te salían de cualquier 235 00:09:34,720 --> 00:09:36,679 manera, pues en el 236 00:09:36,679 --> 00:09:39,139 LinkedHashSet se conserva 237 00:09:39,139 --> 00:09:40,940 el orden en el que los insertaste 238 00:09:40,940 --> 00:09:42,759 con lo cual cuando tú 239 00:09:42,759 --> 00:09:44,840 hagas un for, te van a salir 240 00:09:44,840 --> 00:09:46,899 en el mismo orden en el que los insertaste 241 00:09:46,899 --> 00:09:48,639 eso puede ser 242 00:09:48,639 --> 00:09:50,720 que sea útil a ti, por lo que sea 243 00:09:50,720 --> 00:09:52,019 que quieres hacer en esa aplicación. 244 00:09:52,679 --> 00:09:54,700 Claro, añade un pelinín más de complejidad 245 00:09:54,700 --> 00:09:56,620 interna, lo cual siempre va a ser un pelín 246 00:09:56,620 --> 00:09:58,740 menos eficiente. Entonces, si eso 247 00:09:58,740 --> 00:10:00,700 no te importa, nunca jamás vas a usar un 248 00:10:00,700 --> 00:10:02,240 LinkedHaset, siempre un Haset. 249 00:10:02,840 --> 00:10:08,450 ¿Vale? No, no, no. 250 00:10:08,509 --> 00:10:10,309 Sigue sin admitir objetos iguales. Simplemente 251 00:10:10,309 --> 00:10:12,409 si tú haces en un LinkedHaset un 252 00:10:12,409 --> 00:10:12,629 ad 253 00:10:12,629 --> 00:10:16,330 de uno que ya está, no lo va 254 00:10:16,330 --> 00:10:18,269 a meter. ¿Vale? Y no se asume 255 00:10:18,269 --> 00:10:20,409 que hay una posición. Tampoco hay un get por posición. 256 00:10:20,409 --> 00:10:22,450 eso tampoco existe, es simplemente 257 00:10:22,450 --> 00:10:24,529 que en la iteración te van a salir 258 00:10:24,529 --> 00:10:26,649 en el orden en que los insertaste, nada más 259 00:10:26,649 --> 00:10:27,210 ¿vale? 260 00:10:29,409 --> 00:10:30,629 bueno, pues el triset 261 00:10:30,629 --> 00:10:32,809 este, y nos callamos 262 00:10:32,809 --> 00:10:43,240 ya, bueno, pues igual que 263 00:10:43,240 --> 00:10:44,879 la lista enlazada era ese 264 00:10:44,879 --> 00:10:47,259 apaño tan bueno, de ponerlos 265 00:10:47,259 --> 00:10:49,299 a todos, dando la mano del siguiente 266 00:10:49,299 --> 00:10:51,100 y todo eso, pues el triset 267 00:10:51,100 --> 00:10:52,299 es lo mismo, pero en árbol 268 00:10:52,299 --> 00:10:55,159 los elementos se van a 269 00:10:55,159 --> 00:10:56,340 guardar en nodos 270 00:10:56,340 --> 00:11:17,210 vale, pues un tríceps 271 00:11:17,210 --> 00:11:19,929 por dentro internamente, aunque no lo vamos a programar 272 00:11:19,929 --> 00:11:21,830 nosotros, es un poquito más 273 00:11:21,830 --> 00:11:22,830 complicado de vista enlazada 274 00:11:22,830 --> 00:11:26,009 por dentro, cada elemento 275 00:11:26,009 --> 00:11:26,690 cada dato 276 00:11:26,690 --> 00:11:31,110 está metido en un nodo, igual que en la lista 277 00:11:31,110 --> 00:11:33,269 enlazada, que cada dato está metido en un nodo 278 00:11:33,269 --> 00:11:35,110 pero en la lista enlazada 279 00:11:35,110 --> 00:11:37,269 el nodo tiene la dirección de su 280 00:11:37,269 --> 00:11:39,190 siguiente, luego en realidad en la link 281 00:11:39,190 --> 00:11:41,389 es más complicado que la del siguiente, la del anterior 282 00:11:41,389 --> 00:11:43,129 para poder recorrerlo de arriba a abajo 283 00:11:43,129 --> 00:11:45,330 vale, pues aquí 284 00:11:45,330 --> 00:11:47,649 en un triset cada nodo tiene 285 00:11:47,649 --> 00:11:49,889 la dirección del que tengo a la derecha y la dirección del que tengo 286 00:11:49,889 --> 00:11:51,690 a la izquierda, porque es un árbol 287 00:11:51,690 --> 00:11:53,730 vale, entonces 288 00:11:53,730 --> 00:11:55,730 este tendrá la dirección del que tiene a su derecha 289 00:11:55,730 --> 00:11:57,690 y el que tiene a su izquierda, a partir 290 00:11:57,690 --> 00:11:59,690 de este podemos llegar al de su derecha 291 00:11:59,690 --> 00:12:01,269 y al de su izquierda 292 00:12:01,269 --> 00:12:03,230 con lo cual 293 00:12:03,230 --> 00:12:05,169 navegar por un árbol 294 00:12:05,169 --> 00:12:07,309 es más rápido y más eficiente 295 00:12:07,309 --> 00:12:09,769 que navegar por una lista 296 00:12:09,769 --> 00:12:13,620 enlazada, porque para 297 00:12:13,620 --> 00:12:15,539 llegar a este último en una lista 298 00:12:15,539 --> 00:12:17,320 enlazada tengo que pasar por todos 299 00:12:17,320 --> 00:12:19,559 en un árbol para llegar 300 00:12:19,559 --> 00:12:21,600 a este, me puedo 301 00:12:21,600 --> 00:12:23,559 saltar un árbol, una sub mitad del árbol 302 00:12:23,559 --> 00:12:25,799 enterita, me voy por aquí directamente 303 00:12:25,799 --> 00:12:26,379 y ya está 304 00:12:26,379 --> 00:12:29,580 entonces es más rápido acceder 305 00:12:29,580 --> 00:12:31,740 a los elementos en una estructura de árbol 306 00:12:31,740 --> 00:12:33,600 que una estructura de lista 307 00:12:33,600 --> 00:12:34,860 lógicamente 308 00:12:34,860 --> 00:12:39,240 pero claro, la pregunta sería 309 00:12:39,240 --> 00:12:42,120 claro, pero ese que tiene que ir 310 00:12:42,120 --> 00:12:44,299 moviéndose, que afortunadamente 311 00:12:44,299 --> 00:12:45,539 no lo tenemos que programar nosotros 312 00:12:45,539 --> 00:12:48,159 el que ha programado el triset por debajo 313 00:12:48,159 --> 00:12:50,120 como sabe por que lado 314 00:12:50,120 --> 00:12:52,220 tiene que irse para localizar el elemento 315 00:12:52,220 --> 00:12:54,100 en el caso de que yo 316 00:12:54,100 --> 00:12:56,000 le haga un contains o le haga 317 00:12:56,000 --> 00:12:57,320 algo de eso, un remove 318 00:12:57,320 --> 00:12:59,940 como sabe para donde tiene que ir 319 00:12:59,940 --> 00:13:02,080 para localizarlo 320 00:13:02,080 --> 00:13:03,820 bueno porque el triset 321 00:13:03,820 --> 00:13:06,580 necesita obligatoriamente 322 00:13:06,580 --> 00:13:07,639 que le demos 323 00:13:07,639 --> 00:13:09,019 un criterio de orden 324 00:13:09,019 --> 00:13:11,159 vale 325 00:13:11,159 --> 00:13:18,370 yo no puedo hacer un triset 326 00:13:18,370 --> 00:13:21,049 si no le digo además 327 00:13:21,049 --> 00:13:23,309 y este va a ser tu criterio 328 00:13:23,309 --> 00:13:25,289 de orden, lo necesito 329 00:13:25,289 --> 00:13:27,490 obligatoriamente para construirse 330 00:13:27,490 --> 00:13:32,649 ¿y cómo usa ese criterio de orden? 331 00:13:33,470 --> 00:13:35,490 pues insertamos un primer elemento 332 00:13:35,490 --> 00:13:36,669 pues ya está, aquí se queda 333 00:13:36,669 --> 00:13:39,029 sus dos manitas 334 00:13:39,029 --> 00:13:40,149 apuntean un las dos 335 00:13:40,149 --> 00:13:42,250 ahora insertamos un segundo 336 00:13:42,250 --> 00:13:44,710 pues él mira, ¿es mayor o menor? 337 00:13:45,169 --> 00:13:46,950 porque para eso tiene un criterio de orden 338 00:13:46,950 --> 00:13:49,450 y que sea, ¿está antes o está después? 339 00:13:49,450 --> 00:13:51,450 si está antes, se va aquí 340 00:13:51,450 --> 00:13:53,490 y si está después, se va aquí 341 00:13:53,490 --> 00:13:56,110 vale, ahora insertamos 342 00:13:56,110 --> 00:13:57,169 su siguiente elemento 343 00:13:57,169 --> 00:13:59,730 pues empieza a compararlo por arriba 344 00:13:59,730 --> 00:14:01,870 ¿está antes o está después? 345 00:14:02,190 --> 00:14:03,690 está antes, pues entonces va aquí 346 00:14:03,690 --> 00:14:06,370 ahora, ¿está antes o está después? 347 00:14:06,509 --> 00:14:08,230 ¿qué es? ¿está después? pues entonces va aquí 348 00:14:08,230 --> 00:14:09,529 ¿vale? 349 00:14:10,730 --> 00:14:11,750 no sé si me estoy 350 00:14:11,750 --> 00:14:18,779 explicando, ¿vale? 351 00:14:18,840 --> 00:14:20,840 es decir, insertamos 352 00:14:20,840 --> 00:14:23,159 un primer elemento, inserta el tricel 353 00:14:23,159 --> 00:14:24,840 Nosotros hacemos el add y nos olvidamos 354 00:14:24,840 --> 00:14:26,519 Hacemos el add y se acabó 355 00:14:26,519 --> 00:14:28,299 Toda esa complejidad ya se hace por debajo 356 00:14:28,299 --> 00:14:29,600 Del add 357 00:14:29,600 --> 00:14:31,759 Pero bueno, ¿qué haría más o menos? 358 00:14:31,899 --> 00:14:34,279 Nosotros hacemos nuestro add de un elemento 359 00:14:34,279 --> 00:14:39,610 ¿Qué haría? 360 00:14:39,950 --> 00:14:41,850 Si el trisette está vacío 361 00:14:41,850 --> 00:14:44,269 Pues es el primer nodo del árbol 362 00:14:44,269 --> 00:14:44,850 Y ya está 363 00:14:44,850 --> 00:14:46,470 Y aquí tenemos un null 364 00:14:46,470 --> 00:14:50,129 Es el primero que hemos metido 365 00:14:50,129 --> 00:14:53,169 Ahora vamos a llamar a otro add 366 00:14:53,169 --> 00:14:55,350 Para meter otro más 367 00:14:55,350 --> 00:14:55,830 A otro add 368 00:14:55,830 --> 00:14:58,830 pues entonces ese add internamente 369 00:14:58,830 --> 00:15:00,529 no lo hacemos nosotros, lo hace él, claro 370 00:15:00,529 --> 00:15:02,629 ese add internamente 371 00:15:02,629 --> 00:15:04,470 lo compara con este 372 00:15:04,470 --> 00:15:05,909 según este criterio de orden 373 00:15:05,909 --> 00:15:07,789 ¿vas antes o vas después? 374 00:15:08,509 --> 00:15:10,509 ¿vas antes? pues te coloco 375 00:15:10,509 --> 00:15:12,370 me voy para la derecha, vale 376 00:15:12,370 --> 00:15:13,929 aquí ya no hay nada, pues aquí te pongo 377 00:15:13,929 --> 00:15:15,309 ¿vale? 378 00:15:17,659 --> 00:15:22,759 ala, ahí te pongo 379 00:15:22,759 --> 00:15:23,899 al nuevo 380 00:15:23,899 --> 00:15:28,710 vale, ahora metemos 381 00:15:28,710 --> 00:15:30,850 otro más, metemos otro más 382 00:15:30,850 --> 00:15:32,669 Pues empieza a comparar 383 00:15:32,669 --> 00:15:34,789 ¿Es mayor? ¿Va antes o va después? 384 00:15:35,490 --> 00:15:36,929 Va después, pues entonces no hay duda 385 00:15:36,929 --> 00:15:37,950 Lo pondría aquí 386 00:15:37,950 --> 00:15:40,350 ¡Hala! Ya tenemos esto 387 00:15:40,350 --> 00:15:43,500 Hacemos otro A 388 00:15:43,500 --> 00:15:45,299 ¿Qué hace él internamente por dentro? 389 00:15:45,419 --> 00:15:47,279 Que nosotros no lo hacemos, claro, lo hace él 390 00:15:47,279 --> 00:15:49,539 ¡Ah! ¿Va antes? Pues va a este lado 391 00:15:49,539 --> 00:15:50,679 ¡Ah! Pero aquí ya tengo otro 392 00:15:50,679 --> 00:15:52,340 Pues voy a compararlo con este 393 00:15:52,340 --> 00:15:54,240 ¿Va antes o va después que este? Va después 394 00:15:54,240 --> 00:15:55,860 ¡Ah! Pues entonces va colgando de aquí 395 00:15:55,860 --> 00:15:59,399 Y así va añadiendo las hojas al árbol 396 00:15:59,399 --> 00:16:00,220 ¿Vale? 397 00:16:00,220 --> 00:16:02,419 va añadiendo las hojas al árbol 398 00:16:02,419 --> 00:16:05,539 y esto se construye como un árbol ordenado 399 00:16:05,539 --> 00:16:07,019 ¿vale? 400 00:16:07,039 --> 00:16:08,220 que nosotros no lo vemos 401 00:16:08,220 --> 00:16:10,460 ni lo vamos a ver jamás nunca desde fuera 402 00:16:10,460 --> 00:16:12,159 nos limitamos a hacer AR 403 00:16:12,159 --> 00:16:13,679 y él ya lo va insertando 404 00:16:13,679 --> 00:16:16,419 ¿cuál es la ventaja de que él internamente 405 00:16:16,419 --> 00:16:18,580 vaya construyendo un árbol ordenado? 406 00:16:19,120 --> 00:16:20,259 la ventaja es que luego 407 00:16:20,259 --> 00:16:22,460 cuando ya hacemos el remove, el contains 408 00:16:22,460 --> 00:16:23,740 cuando hacemos esas cosas 409 00:16:23,740 --> 00:16:25,620 cuando hagamos remove 410 00:16:25,620 --> 00:16:27,740 para eliminar un elemento 411 00:16:27,740 --> 00:16:29,580 cuando hagamos contains 412 00:16:29,580 --> 00:16:31,639 Para ver si hay un elemento 413 00:16:31,639 --> 00:16:34,379 Pues la búsqueda va a ser mucho más rápida 414 00:16:34,379 --> 00:16:36,460 Porque se quita porciones de árbol de mitad 415 00:16:36,460 --> 00:16:37,679 Se las quita de golpe 416 00:16:37,679 --> 00:16:40,080 Oye, voy a eliminar este 417 00:16:40,080 --> 00:16:41,700 Voy a localizarlo a ver si está 418 00:16:41,700 --> 00:16:42,639 Antes que nada 419 00:16:42,639 --> 00:16:44,559 ¿Este es mayor que este primero? 420 00:16:44,700 --> 00:16:46,299 Pues tiene que estar en esta parte del árbol 421 00:16:46,299 --> 00:16:47,980 Pues entonces esta parte entera 422 00:16:47,980 --> 00:16:48,980 Ya ni la miro 423 00:16:48,980 --> 00:16:50,740 Se ha quitado una mitad de elemento 424 00:16:50,740 --> 00:16:52,759 Oye, este que me han dicho es este 425 00:16:52,759 --> 00:16:54,080 ¿Está antes o es después? 426 00:16:54,740 --> 00:16:55,659 No, está después 427 00:16:55,659 --> 00:16:57,299 Pues tendrá que estar en esta zona del árbol 428 00:16:57,299 --> 00:16:58,200 Pues sigue bajando 429 00:16:58,200 --> 00:16:59,379 Ah, mira, ya es este 430 00:16:59,379 --> 00:17:00,980 ya lo he encontrado, pero se va quitando 431 00:17:00,980 --> 00:17:03,019 partes del árbol de golpe 432 00:17:03,019 --> 00:17:04,000 dime 433 00:17:04,000 --> 00:17:08,119 claro 434 00:17:08,119 --> 00:17:11,440 cualquier cosa 435 00:17:11,440 --> 00:17:13,859 claro, cualquier cosa 436 00:17:13,859 --> 00:17:16,220 lo que te dé la gana basada en los parámetros 437 00:17:16,220 --> 00:17:17,480 en las propiedades del objeto 438 00:17:17,480 --> 00:17:20,039 claro, cualquier cosa basada en las propiedades del objeto 439 00:17:20,039 --> 00:17:21,980 como si puede ser el criterio 440 00:17:21,980 --> 00:17:24,380 de orden entre dos alumnos cuya propiedad 441 00:17:24,380 --> 00:17:25,839 es la altura 442 00:17:25,839 --> 00:17:28,160 pues que la altura de uno 443 00:17:28,160 --> 00:17:31,160 sea mayor que el múltiplo de 5 444 00:17:31,160 --> 00:17:32,980 de la altura del otro, lo que a ti te dé la gana 445 00:17:32,980 --> 00:17:34,079 cualquier cosa basada 446 00:17:34,079 --> 00:17:36,059 en las propiedades del objeto 447 00:17:36,059 --> 00:17:38,960 lo que tú quieras, en principio será cosas con sentido 448 00:17:38,960 --> 00:17:40,519 según la aplicación 449 00:17:40,519 --> 00:17:43,259 vale, pues entonces 450 00:17:43,259 --> 00:17:45,019 lo único que 451 00:17:45,019 --> 00:17:47,460 nosotros ya sí que usamos 452 00:17:47,460 --> 00:17:49,299 ahora de implementar esto 453 00:17:49,299 --> 00:17:50,940 es que cada vez que 454 00:17:50,940 --> 00:17:52,900 instanciemos un triset 455 00:17:52,900 --> 00:17:54,160 cada vez que lo instanciemos 456 00:17:54,160 --> 00:17:56,980 tenemos que decidir un criterio 457 00:17:56,980 --> 00:17:58,400 de orden para los objetos 458 00:17:58,400 --> 00:18:00,819 que lo componen 459 00:18:00,819 --> 00:18:02,480 ¿vale? tenemos que decir un criterio de orden 460 00:18:02,480 --> 00:18:04,440 luego 461 00:18:04,440 --> 00:18:06,720 si el trícer 462 00:18:06,720 --> 00:18:09,000 yo hago aquí 463 00:18:09,000 --> 00:18:09,819 mi trícer 464 00:18:09,819 --> 00:18:11,900 de alumno 465 00:18:11,900 --> 00:18:14,960 ¿vale? pues muy bien 466 00:18:14,960 --> 00:18:16,720 puedo hacer mi trícer de alumno, no tengo ningún problema 467 00:18:16,720 --> 00:18:18,720 pero alumno tiene que tener 468 00:18:18,720 --> 00:18:20,319 un criterio de orden 469 00:18:20,319 --> 00:18:22,759 ¿cómo hacemos para que alumno 470 00:18:22,759 --> 00:18:23,819 tenga un criterio de orden? 471 00:18:28,740 --> 00:18:30,900 haciendo que alumno implemente 472 00:18:30,900 --> 00:18:32,380 comparable, ¿verdad? 473 00:18:33,200 --> 00:18:33,539 ¿Sí o no? 474 00:18:35,000 --> 00:18:37,059 Sí. Que yo no puedo hacer 475 00:18:37,059 --> 00:18:38,779 que alumno implemente comparable 476 00:18:38,779 --> 00:18:41,220 o alumno ya implementa comparable 477 00:18:41,220 --> 00:18:43,119 pero ese criterio de orden no me 478 00:18:43,119 --> 00:18:43,500 gusta. 479 00:18:44,859 --> 00:18:46,740 Pues podemos instanciar 480 00:18:46,740 --> 00:18:49,000 triset y al momento de 481 00:18:49,000 --> 00:18:50,799 instanciarlo decirle, oye, tú 482 00:18:50,799 --> 00:18:52,960 este es tu criterio de orden. ¿Y cómo le damos 483 00:18:52,960 --> 00:18:54,779 un criterio de orden particular 484 00:18:54,779 --> 00:18:57,200 a alguien? Mediante un objeto 485 00:18:57,200 --> 00:18:59,460 comparatorio. 486 00:19:00,900 --> 00:19:05,099 vale, es decir, esto de aquí 487 00:19:05,099 --> 00:19:09,200 lo vemos 488 00:19:09,200 --> 00:19:11,380 rápidamente y listo 489 00:19:11,380 --> 00:19:58,609 vale, pues a ver 490 00:19:58,609 --> 00:20:01,089 en ejemplo set 491 00:20:01,089 --> 00:20:03,970 pues me voy a hacer un 492 00:20:03,970 --> 00:20:05,750 paquetillo 493 00:20:05,750 --> 00:20:06,690 que sea triset 494 00:20:06,690 --> 00:20:17,609 pues venga, clase alumno, ya que hayamos dicho alumno 495 00:20:17,609 --> 00:20:38,720 el nif 496 00:20:38,720 --> 00:20:39,700 el nombre 497 00:20:39,700 --> 00:20:54,170 y la nota, por ejemplo 498 00:20:54,170 --> 00:20:55,390 pues hacemos 499 00:20:55,390 --> 00:20:57,250 el constructor 500 00:20:57,250 --> 00:21:05,059 Y los get y los set 501 00:21:05,059 --> 00:21:16,250 Ahora tenemos ahí un alumno normal y corriente 502 00:21:16,250 --> 00:21:17,589 Con las tres propiedades de siempre 503 00:21:17,589 --> 00:21:29,619 Vale, pues queremos hacer cosas ahora 504 00:21:29,619 --> 00:21:31,599 Con los alumnos del aula 505 00:21:31,599 --> 00:21:39,410 Pues nos hacemos aquí la clase main 506 00:21:39,410 --> 00:21:49,259 Venga, vamos a poner los alumnos aquí fuera 507 00:21:49,259 --> 00:22:00,799 Para variar un poco de estructura 508 00:22:00,799 --> 00:22:17,299 Vale, pues venga 509 00:22:17,299 --> 00:22:21,279 Vamos a suponer que decidimos como implementación 510 00:22:21,279 --> 00:22:24,440 un triset para estos alumnos de aquí 511 00:22:24,440 --> 00:22:34,480 vale, pues esta es la colección de alumnos mía de trabajo 512 00:22:34,480 --> 00:22:36,660 la he puesto en una variable estática fuera del main 513 00:22:36,660 --> 00:22:39,180 por si hago métodos, no tener que pasársela todo el rato 514 00:22:39,180 --> 00:22:46,180 y ya está, pues venga, vamos a suponer 515 00:22:46,180 --> 00:22:47,900 aquí haríamos un menú de opciones 516 00:22:47,900 --> 00:22:51,319 vamos a suponer que aquí vamos a hacer el método 517 00:22:51,319 --> 00:23:02,819 insertar alumno, donde le pasamos 518 00:23:02,819 --> 00:23:07,809 un alumno a, vale, aquí que haríamos 519 00:23:07,809 --> 00:23:10,609 pues alumnos.ad, aquí no cambia respecto a 520 00:23:10,609 --> 00:23:12,089 Todas las colecciones son iguales 521 00:23:12,089 --> 00:23:15,150 Si yo quiero añadir algo, ala, lo añado 522 00:23:15,150 --> 00:23:18,130 Y ya el método add por dentro 523 00:23:18,130 --> 00:23:19,170 Y ahora lo que tenga que hacer 524 00:23:19,170 --> 00:23:22,069 Para expandir el espacio 525 00:23:22,069 --> 00:23:24,029 Y meterla donde sea, en el array, en el árbol 526 00:23:24,029 --> 00:23:25,210 En la lista, donde sea 527 00:23:25,210 --> 00:23:30,799 Vale, pues vamos a probarlo 528 00:23:30,799 --> 00:23:32,319 Desde el main 529 00:23:32,319 --> 00:23:35,680 Vamos desde el main a insertar un alumno 530 00:23:35,680 --> 00:23:54,769 Se me ha olvidado el static 531 00:23:54,769 --> 00:23:55,549 De aquí 532 00:23:55,549 --> 00:24:07,960 Y vamos a recorrer el set 533 00:24:07,960 --> 00:24:09,660 Vale 534 00:24:09,660 --> 00:24:12,980 A través de, vamos a hacer aquí el método 535 00:24:12,980 --> 00:24:13,619 Que sería 536 00:24:13,619 --> 00:24:15,500 Listar alumnos 537 00:24:15,500 --> 00:24:20,920 ¿Vale? Listado 538 00:24:20,920 --> 00:24:26,910 A alumnos, bueno pues listado 539 00:24:26,910 --> 00:24:28,869 A alumnos, pues vamos a 540 00:24:28,869 --> 00:24:30,269 Concatenar el resultado aquí 541 00:24:30,269 --> 00:24:42,630 Y ahora para cada alumno 542 00:24:42,630 --> 00:24:43,529 A en 543 00:24:43,529 --> 00:24:45,269 Alumnos 544 00:24:45,269 --> 00:24:48,130 Listado 545 00:24:48,130 --> 00:24:49,349 Más igual 546 00:24:49,349 --> 00:25:05,049 Vale, aquí ya hay algo que seguramente 547 00:25:05,049 --> 00:25:08,390 Alguna cosita que 548 00:25:08,390 --> 00:25:10,230 Estáis a punto de decirme 549 00:25:10,230 --> 00:25:10,690 Que lo sé 550 00:25:10,690 --> 00:25:12,769 Qué listado tan feo te va a salir 551 00:25:12,769 --> 00:25:21,880 Falta un separador 552 00:25:21,880 --> 00:25:22,460 No pasa nada 553 00:25:22,460 --> 00:25:23,460 Yo le pongo un separador 554 00:25:23,460 --> 00:25:25,079 Vale 555 00:25:25,079 --> 00:25:30,170 ¿Qué más cosas me decís? 556 00:25:36,039 --> 00:25:36,259 ¿Eh? 557 00:25:40,420 --> 00:25:41,480 Un listado, perdona 558 00:25:41,480 --> 00:25:43,079 Bueno, es que si esto ha sido un error 559 00:25:43,079 --> 00:25:45,059 No a propósito 560 00:25:45,059 --> 00:25:46,720 No a propósito 561 00:25:46,720 --> 00:25:49,319 ¿qué más cosas? nos saldría un listado muy feo 562 00:25:49,319 --> 00:25:49,440 ¿no? 563 00:25:50,380 --> 00:25:56,049 ¿por qué? claro, me saldría 564 00:25:56,049 --> 00:25:58,390 el toString de alumno al concatenar 565 00:25:58,390 --> 00:26:00,029 me saldría el toString, el toString es muy feo 566 00:26:00,029 --> 00:26:01,910 porque no lo hemos hecho, claro, pues vamos a hacer 567 00:26:01,910 --> 00:26:02,390 el toString 568 00:26:02,390 --> 00:26:08,680 con nipNombre y nota, ya está 569 00:26:08,680 --> 00:26:11,990 vale, pues ya tengo 570 00:26:11,990 --> 00:26:13,829 mi método de listado alumnos 571 00:26:13,829 --> 00:26:15,829 con el static si quiero llamarlo 572 00:26:15,829 --> 00:26:16,609 desde el main 573 00:26:16,609 --> 00:26:21,940 y ahora me voy a mi main 574 00:26:21,940 --> 00:26:22,960 para 575 00:26:22,960 --> 00:26:25,960 mostrar ese listado 576 00:26:25,960 --> 00:26:56,890 Vale, pues hemos insertado un alumno con el add, vamos a mostrar el listado y lógicamente pues nos dice, no puedo hacer un triset porque alumno no es comparable, ¿vale? 577 00:26:56,890 --> 00:27:02,210 claro, es que nosotros ya sabemos 578 00:27:02,210 --> 00:27:04,130 que el triset necesita 579 00:27:04,130 --> 00:27:06,250 cada vez que meta un alumno, compararlo 580 00:27:06,250 --> 00:27:08,170 con los otros, entonces 581 00:27:08,170 --> 00:27:10,089 e incluso aunque no haya 582 00:27:10,089 --> 00:27:12,069 ninguno antes, vale 583 00:27:12,069 --> 00:27:14,109 fijaos que aquí no había ninguno, es el primero 584 00:27:14,109 --> 00:27:15,750 pero lo primero que hace 585 00:27:15,750 --> 00:27:18,069 la máquina virtual es ver 586 00:27:18,069 --> 00:27:19,430 que hay un criterio de orden ahí puesto 587 00:27:19,430 --> 00:27:22,190 bueno, pues aquí uno si tiene 588 00:27:22,190 --> 00:27:23,730 acceso a la clase alumno diría, vale 589 00:27:23,730 --> 00:27:25,089 pues venga 590 00:27:25,089 --> 00:27:28,049 ¿cuál es el 591 00:27:28,049 --> 00:27:30,410 criterio mío 592 00:27:30,410 --> 00:27:31,609 con el que a mí me interesa el orden 593 00:27:31,609 --> 00:27:34,049 y esto no es tan trivial, tan fácil 594 00:27:34,049 --> 00:27:39,400 porque claro, si yo le doy aquí 595 00:27:39,400 --> 00:27:41,039 a implements, comparable 596 00:27:41,039 --> 00:27:43,359 recordad que es 597 00:27:43,359 --> 00:27:44,380 la clase genérica 598 00:27:44,380 --> 00:27:47,440 entonces, comparable de alumno 599 00:27:47,440 --> 00:27:49,759 perdón, alumno 600 00:27:49,759 --> 00:27:51,359 vale, entonces yo quiero 601 00:27:51,359 --> 00:27:53,359 que alumno sea un objeto 602 00:27:53,359 --> 00:27:55,440 comparable con otros alumnos 603 00:27:55,440 --> 00:27:57,079 con otros alumnos, no con otros 604 00:27:57,079 --> 00:27:59,420 objetos cualquiera, con otros alumnos 605 00:27:59,420 --> 00:28:00,220 por eso 606 00:28:00,220 --> 00:28:01,980 concreto 607 00:28:01,980 --> 00:28:04,259 la interfaz genérica comparable alumno 608 00:28:04,259 --> 00:28:05,940 para que alumno sea comparable con otros 609 00:28:05,940 --> 00:28:07,880 no con objetos cualesquiera 610 00:28:07,880 --> 00:28:09,799 bueno, pues si yo lo implemento 611 00:28:09,799 --> 00:28:12,319 entonces tengo que darle cuerpo a este método 612 00:28:12,319 --> 00:28:15,299 y ahora 613 00:28:15,299 --> 00:28:17,400 aquí se nos plantea una situación 614 00:28:17,400 --> 00:28:18,420 difícil 615 00:28:18,420 --> 00:28:21,839 porque uno podría pensar así alegremente 616 00:28:21,839 --> 00:28:23,880 oye, este criterio de orden 617 00:28:23,880 --> 00:28:25,859 yo lo voy a usar para listados, para cosas 618 00:28:25,859 --> 00:28:28,180 ¿cuál es el orden que a mí me gusta entre alumnos? 619 00:28:28,180 --> 00:28:32,319 uno podría decir pues el orden alfabético de nombre 620 00:28:32,319 --> 00:28:37,819 entonces uno casca aquí el orden alfabético de nombre 621 00:28:37,819 --> 00:28:43,859 y recordad que para el orden alfabético de nombre 622 00:28:43,859 --> 00:28:45,839 pues podíamos usar tranquilamente esto 623 00:28:45,839 --> 00:28:49,019 dis.nombre es un string 624 00:28:49,019 --> 00:28:54,759 lo comparo con el método compareToDeString a o.nombre 625 00:28:54,759 --> 00:28:58,539 y ya lo tengo porque el método compareToDeString 626 00:28:58,539 --> 00:29:00,559 ya hace la comparación alfabética 627 00:29:00,559 --> 00:29:02,400 entre los dos strings que yo le pase 628 00:29:02,400 --> 00:29:04,980 me va a devolver menos uno 629 00:29:04,980 --> 00:29:06,599 si este está alfabéticamente 630 00:29:06,599 --> 00:29:08,380 antes que este, cero 631 00:29:08,380 --> 00:29:10,480 si este está alfabéticamente 632 00:29:10,480 --> 00:29:12,299 a la vez que este 633 00:29:12,299 --> 00:29:14,359 y, o sea es el mismo 634 00:29:14,359 --> 00:29:16,660 y más uno si este 635 00:29:16,660 --> 00:29:18,940 está alfabéticamente después, luego el otro alfabético 636 00:29:18,940 --> 00:29:19,559 sería este 637 00:29:19,559 --> 00:29:26,720 es que estoy 638 00:29:26,720 --> 00:29:28,119 en la propia clase alumno 639 00:29:28,119 --> 00:29:30,799 ¿vale? estoy en la 640 00:29:30,799 --> 00:29:32,660 propia clase alumno, entonces 641 00:29:32,660 --> 00:29:34,740 desde alumno a cualquier 642 00:29:34,740 --> 00:29:36,980 propiedad, sea del dis o de otro 643 00:29:36,980 --> 00:29:41,549 vale, pues 644 00:29:41,549 --> 00:29:43,309 entonces digo, ya está, ya el triset 645 00:29:43,309 --> 00:29:45,329 se va a quedar tranquilo, vamos a ver si 646 00:29:45,329 --> 00:29:45,809 nos deja 647 00:29:45,809 --> 00:29:48,589 volvemos a hacer el main 648 00:29:48,589 --> 00:29:51,089 y aquí está mi alumno 649 00:29:51,089 --> 00:30:02,140 bueno, pues 650 00:30:02,140 --> 00:30:04,140 menos uno, cero y uno 651 00:30:04,140 --> 00:30:06,000 que es el criterio 652 00:30:06,000 --> 00:30:08,000 que se asume para este compare tú 653 00:30:08,000 --> 00:30:10,000 es decir, este método yo lo tengo 654 00:30:10,000 --> 00:30:12,200 que hacer siempre de tal manera que me devuelva 655 00:30:12,200 --> 00:30:14,079 negativo si el 656 00:30:14,079 --> 00:30:16,319 que llama al método va antes que el parámetro 657 00:30:16,319 --> 00:30:17,900 cero si el que llama 658 00:30:17,900 --> 00:30:19,140 al método es el mismo 659 00:30:19,140 --> 00:30:21,920 o sea, está en la misma posición de orden 660 00:30:21,920 --> 00:30:23,500 y positivo 661 00:30:23,500 --> 00:30:26,000 si el que llama al método va después según 662 00:30:26,000 --> 00:30:26,759 ese criterio 663 00:30:26,759 --> 00:30:29,759 es lo que me tiene que volver este método para que 664 00:30:29,759 --> 00:30:32,000 todos los que lo usan lo entiendan 665 00:30:32,579 --> 00:30:33,559 para que lo entiendan 666 00:30:33,559 --> 00:30:36,039 entonces como el compare to the string 667 00:30:36,039 --> 00:30:37,740 funciona exactamente así 668 00:30:37,740 --> 00:30:39,599 para el orden alfabético 669 00:30:39,599 --> 00:30:41,660 de estos, pues lo utilizo 670 00:30:41,660 --> 00:30:45,599 porque yo quiero el orden alfabético entre el que 671 00:30:45,599 --> 00:30:47,059 llama este y este 672 00:30:47,059 --> 00:30:51,789 por nombre, bueno pues ya tenemos 673 00:30:51,789 --> 00:30:53,769 un criterio de orden alfabético en nuestro 674 00:30:53,769 --> 00:30:56,049 comparable, pues yo 675 00:30:56,049 --> 00:30:58,109 ahora ya el main se ha quedado 676 00:30:58,109 --> 00:30:58,849 tan tranquilo 677 00:30:58,849 --> 00:31:01,150 me ha metido al alumno y ya está 678 00:31:01,150 --> 00:31:03,829 vale, pues yo sigo metiendo 679 00:31:03,829 --> 00:31:07,410 alumnos, voy a meter 680 00:31:07,410 --> 00:31:08,970 ahora un segundo alumno 681 00:31:08,970 --> 00:31:10,849 new alumno 682 00:31:10,849 --> 00:31:13,250 mi alumno 683 00:31:13,250 --> 00:31:15,430 5, 6, 7, 8 684 00:31:15,430 --> 00:31:19,420 que también se llama Pepe 685 00:31:19,420 --> 00:31:22,720 porque hay muchos Pepes en el mundo 686 00:31:22,720 --> 00:31:24,700 pero este tiene un 8 687 00:31:24,700 --> 00:31:27,339 y tiene otro NIF distinto 688 00:31:27,339 --> 00:31:28,220 no pasa nada, ¿no? 689 00:31:28,220 --> 00:31:29,339 hay muchos que nos llamamos igual 690 00:31:29,339 --> 00:31:32,759 hay 200.000 personas en España que se llaman Raquel Gómez Sánchez 691 00:31:32,759 --> 00:31:34,740 pues más habrá que se llamen Pepe 692 00:31:34,740 --> 00:31:35,980 vale 693 00:31:35,980 --> 00:31:38,279 bueno, ya he insertado a este otro 694 00:31:38,279 --> 00:31:41,000 ahora, vamos a mostrar 695 00:31:41,000 --> 00:31:41,960 el listado ahora 696 00:31:41,960 --> 00:31:50,950 Nuevo listado 697 00:31:50,950 --> 00:31:52,829 Después de la inserción 698 00:31:52,829 --> 00:32:02,920 Vale 699 00:32:02,920 --> 00:32:04,240 Entonces efectivamente 700 00:32:04,240 --> 00:32:05,980 Como ya os ha dado tiempo a comprobar 701 00:32:05,980 --> 00:32:08,759 No lo ha añadido 702 00:32:08,759 --> 00:32:10,059 ¿Vale? 703 00:32:11,160 --> 00:32:11,920 ¿Por qué? 704 00:32:12,400 --> 00:32:13,720 Porque para el triset 705 00:32:13,720 --> 00:32:15,160 Para el triset 706 00:32:15,160 --> 00:32:18,460 El criterio de orden que tú le des 707 00:32:18,460 --> 00:32:20,359 Es el criterio de igualdad 708 00:32:20,359 --> 00:32:22,420 Aquí ya el equals no aplica 709 00:32:22,420 --> 00:32:24,519 Para el triset el equals no aplica 710 00:32:24,519 --> 00:32:27,140 para el triset, el criterio de igualdad 711 00:32:27,140 --> 00:32:28,900 para hacer el add, el remove, el 712 00:32:28,900 --> 00:32:30,559 contains, es este 713 00:32:30,559 --> 00:32:32,259 este es el criterio de igualdad 714 00:32:32,259 --> 00:32:34,420 para el triset, vale 715 00:32:34,420 --> 00:32:36,339 entonces 716 00:32:36,339 --> 00:32:38,920 yo lo que tengo que poner aquí no es 717 00:32:38,920 --> 00:32:40,799 el orden que a mí me interesa para los 718 00:32:40,799 --> 00:32:43,000 listados, para lo que sea, si tengo que hacer listados 719 00:32:43,000 --> 00:32:45,059 por orden, pues ya lo llevo a una lista, ordeno 720 00:32:45,059 --> 00:32:45,700 lo que haga falta 721 00:32:45,700 --> 00:32:48,859 pero el criterio para el triset 722 00:32:48,859 --> 00:32:50,420 para que el triset meta en el árbol 723 00:32:50,420 --> 00:32:52,460 tiene que ser el de la clave primaria 724 00:32:52,460 --> 00:32:55,380 porque si no el add no me va a añadir 725 00:32:55,380 --> 00:32:57,279 a los distintos 726 00:32:57,279 --> 00:32:59,259 por clave primaria 727 00:32:59,259 --> 00:33:01,079 entonces 728 00:33:01,079 --> 00:33:03,240 este se convierte automáticamente 729 00:33:03,240 --> 00:33:17,640 el criterio de igualdad para 730 00:33:17,640 --> 00:33:19,799 triset, a mi me da igual que yo haga aquí un equals 731 00:33:19,799 --> 00:33:21,660 por nif, imaginaos que 732 00:33:21,660 --> 00:33:23,119 hacemos aquí un equals por nif 733 00:33:23,119 --> 00:33:27,319 que es el equals que a mi me interesaría para alumno 734 00:33:27,319 --> 00:33:29,240 vale, me voy a borrar el hashcode 735 00:33:29,240 --> 00:33:30,059 porque no lo estamos usando 736 00:33:30,059 --> 00:33:32,960 yo me hago mi equals por nif 737 00:33:32,960 --> 00:33:35,039 que es el que especifica 738 00:33:35,039 --> 00:33:37,099 realmente la lógica 739 00:33:37,099 --> 00:33:39,019 de mi aplicación 740 00:33:39,019 --> 00:33:40,920 que dos objetos de mismo 741 00:33:40,920 --> 00:33:43,079 nif sean iguales, yo me hago mi equals y ya está 742 00:33:43,079 --> 00:33:44,900 y aquí me hago mi compare 743 00:33:44,900 --> 00:33:46,680 to con nombre 744 00:33:46,680 --> 00:33:48,819 como hemos hecho hasta ahora porque me interesa el orden 745 00:33:48,819 --> 00:33:49,460 alfabético 746 00:33:49,460 --> 00:33:51,720 pues entonces aquí 747 00:33:51,720 --> 00:33:56,769 yo ejecuto esto 748 00:33:56,769 --> 00:33:58,869 y efectivamente 749 00:33:58,869 --> 00:34:00,569 hemos comprobado que esto no está 750 00:34:00,569 --> 00:34:03,859 funcionando, tiene que funcionar 751 00:34:03,859 --> 00:34:05,660 entonces si yo estoy usando 752 00:34:05,660 --> 00:34:07,819 un triset de 753 00:34:07,819 --> 00:34:09,820 alumno, el 754 00:34:09,820 --> 00:34:11,760 compare to tiene que ser el de la 755 00:34:11,760 --> 00:34:12,260 igualdad. 756 00:34:13,340 --> 00:34:15,780 El de la igualdad. Entonces, tendría 757 00:34:15,780 --> 00:34:17,659 que comparar por nif. 758 00:34:29,719 --> 00:34:31,380 Ahora ya sí esto nos va a funcionar. 759 00:34:31,500 --> 00:34:32,920 Lo que pasa es que nos deja... 760 00:34:32,920 --> 00:34:34,320 ¿Veis? Ahora ya sí lo ha metido. 761 00:34:35,619 --> 00:34:37,099 Ahora ya sí. Porque el 762 00:34:37,099 --> 00:34:38,599 triset mira solo el compare to. 763 00:34:42,480 --> 00:34:44,559 ¿Vale? Lo único es que nos da... 764 00:34:44,559 --> 00:34:46,559 Puede ser que esto nos cuadre, 765 00:34:46,559 --> 00:34:48,519 que no nos cuadre, porque imaginaos, por ejemplo, 766 00:34:48,619 --> 00:34:49,159 esta situación. 767 00:34:49,159 --> 00:34:51,980 Yo tengo también una lista de alumnos 768 00:34:51,980 --> 00:34:53,179 Imaginaos que me estoy haciendo 769 00:34:53,179 --> 00:34:54,840 Con estos alumnos que estoy 770 00:34:54,840 --> 00:34:57,400 Me voy a hacer una lista de alumnos 771 00:34:57,400 --> 00:34:59,860 Que quiero ordenar, por ejemplo 772 00:34:59,860 --> 00:35:02,320 Porque el trisete es un set 773 00:35:02,320 --> 00:35:03,099 No lo puedo ordenar 774 00:35:03,099 --> 00:35:05,920 Entonces vamos a hacernos una lista de alumnos 775 00:35:05,920 --> 00:35:10,349 Una lista de alumnos 776 00:35:10,349 --> 00:35:23,789 ¿Vale? 777 00:35:24,190 --> 00:35:25,630 Y esta lista de alumnos 778 00:35:25,630 --> 00:35:28,090 Vamos a meterles todos mis alumnos 779 00:35:28,090 --> 00:35:29,829 Pues para eso tengo yo aquí 780 00:35:29,829 --> 00:35:30,610 Mi add all 781 00:35:30,610 --> 00:35:33,170 ¿Veis? Tengo mi add all, le meto este 782 00:35:33,170 --> 00:35:37,050 Vale, pues imaginaos que hago esto 783 00:35:37,050 --> 00:35:39,030 Ya está, me echo una lista 784 00:35:39,030 --> 00:35:41,309 Con todos los alumnos 785 00:35:41,309 --> 00:35:43,550 De mi set, una doll con todos 786 00:35:43,550 --> 00:35:44,230 Ya está 787 00:35:44,230 --> 00:35:47,090 Vale, ahora al estar en lista 788 00:35:47,090 --> 00:35:49,170 Esos alumnos, yo ahora puedo hacer cosas 789 00:35:49,170 --> 00:35:50,610 De las que puedo hacer con listas 790 00:35:50,610 --> 00:35:52,190 Que no puedo hacer con sets 791 00:35:52,190 --> 00:35:54,449 Como por ejemplo, ordenar 792 00:35:54,449 --> 00:35:56,769 Porque como todos tienen su posición, ordenar 793 00:35:56,769 --> 00:35:58,750 Entonces 794 00:35:58,750 --> 00:36:01,880 Si yo ahora 795 00:36:01,880 --> 00:36:04,159 ordenar a esta lista para mostrarla 796 00:36:04,159 --> 00:36:06,139 vale, me hago 797 00:36:06,139 --> 00:36:07,360 alumnos 798 00:36:07,360 --> 00:36:09,760 a ver, un momento es que 799 00:36:09,760 --> 00:36:11,420 la he sellado igual, con lo cual 800 00:36:11,420 --> 00:36:14,380 se llama 801 00:36:14,380 --> 00:36:15,619 alumnos 802 00:36:15,619 --> 00:36:17,800 lista, lista alumnos 803 00:36:17,800 --> 00:36:19,360 la voy a llamar porque si no estoy 804 00:36:19,360 --> 00:36:23,389 lista alumnos 805 00:36:23,389 --> 00:36:27,349 la estoy liando, estoy usando 806 00:36:27,349 --> 00:36:28,809 estoy enmascarándola de arriba 807 00:36:28,809 --> 00:36:31,590 así, perdón 808 00:36:31,590 --> 00:36:31,969 vale 809 00:36:31,969 --> 00:36:33,929 ya tengo 810 00:36:33,929 --> 00:36:35,630 mi lista de alumnos 811 00:36:35,630 --> 00:36:37,210 mi lista de alumnos 812 00:36:37,210 --> 00:36:40,030 a la que le he metido todos los objetos 813 00:36:40,030 --> 00:36:41,409 de mi set, alumnos 814 00:36:41,409 --> 00:36:42,429 vale 815 00:36:42,429 --> 00:36:45,530 tengo ahora los alumnos en un set 816 00:36:45,530 --> 00:36:47,949 en el set original y los alumnos en una lista 817 00:36:47,949 --> 00:36:48,269 entonces 818 00:36:48,269 --> 00:36:51,429 lógicamente ahora yo podría hacer 819 00:36:51,429 --> 00:36:53,409 cosas que puedo hacer con las listas 820 00:36:53,409 --> 00:36:54,369 como ordenar, verdad 821 00:36:54,369 --> 00:36:57,269 yo puedo hacer 822 00:36:57,269 --> 00:36:59,190 lista alumnos punto sort 823 00:36:59,190 --> 00:37:01,510 no hace falta 824 00:37:01,510 --> 00:37:05,449 que le pase un comparador, porque alumno ya implementa 825 00:37:05,449 --> 00:37:12,599 comparable, ¿vale? Y 826 00:37:12,599 --> 00:37:16,519 lista alumnos.sort nos devuelve la lista ordenada, ¿no? 827 00:37:16,559 --> 00:37:22,929 Con lo cual lo puedo pasar directamente a un... No, no me la devuelve. 828 00:37:22,929 --> 00:37:26,989 Vale, pues entonces vamos a mostrar el listado ordenado. 829 00:37:34,579 --> 00:37:37,420 Listado ordenado. 830 00:37:38,599 --> 00:37:40,599 Ahí tengo mi listado ordenado 831 00:37:40,599 --> 00:37:42,460 y ahora voy a 832 00:37:42,460 --> 00:37:44,360 para cada alumno a 833 00:37:44,360 --> 00:37:46,320 en lista 834 00:37:46,320 --> 00:37:48,860 alumnos 835 00:37:48,860 --> 00:37:51,219 bueno, podría pasársela al siso 836 00:37:51,219 --> 00:37:51,860 pero bueno 837 00:37:51,860 --> 00:38:02,030 a más 838 00:38:02,030 --> 00:38:11,699 venga, pues ordeno esta lista 839 00:38:11,699 --> 00:38:13,280 que este sort ya sí que lo puedo hacer 840 00:38:13,280 --> 00:38:14,199 porque esto es una lista 841 00:38:14,199 --> 00:38:17,000 y voy a mostrar como se me ha quedado el orden 842 00:38:17,000 --> 00:38:28,059 pues nada, aquí está 843 00:38:28,059 --> 00:38:30,199 vale, mi listado ordenado 844 00:38:30,199 --> 00:38:32,219 a ordenado 845 00:38:32,219 --> 00:38:34,159 por orden de nif 846 00:38:34,159 --> 00:38:36,239 que puede ser el que a mí no me importe 847 00:38:36,239 --> 00:38:37,900 voy a meterlo 848 00:38:37,900 --> 00:38:40,420 en lugar del mismo, todo el rato 849 00:38:40,420 --> 00:38:41,980 en lugar de 850 00:38:41,980 --> 00:38:44,519 aquí voy a meterle 851 00:38:44,519 --> 00:38:52,610 este, vale, pues ya está 852 00:38:52,610 --> 00:38:54,670 me da mi listado ordenado, pero claro, esta situación 853 00:38:54,670 --> 00:38:56,489 normalmente los listados 854 00:38:56,489 --> 00:38:58,250 de cosas ordenadas 855 00:38:58,250 --> 00:39:00,409 no son por clave primaria 856 00:39:00,409 --> 00:39:02,829 no son por clave primaria, la clave primaria 857 00:39:02,829 --> 00:39:04,429 es para distinguir un objeto de otro 858 00:39:04,429 --> 00:39:06,570 para asegurarse de que no pueden tener 859 00:39:06,570 --> 00:39:08,210 la misma de los objetos 860 00:39:08,210 --> 00:39:10,150 como aquí el ni 861 00:39:10,150 --> 00:39:11,889 las claves primarias 862 00:39:11,889 --> 00:39:14,730 no suelen ser lo que nos da los criterios de orden 863 00:39:14,730 --> 00:39:16,269 en una aplicación real 864 00:39:16,269 --> 00:39:18,130 cuando tú quieres ver listados, quieres 865 00:39:18,130 --> 00:39:20,670 recorrer cosas, la clave primaria 866 00:39:20,670 --> 00:39:22,389 no suele ser el criterio de orden real 867 00:39:22,389 --> 00:39:23,710 el que está conectado con la realidad 868 00:39:23,710 --> 00:39:26,710 y aquí el listado 869 00:39:26,710 --> 00:39:28,269 me lo ha ordenado, pero me lo ha ordenado 870 00:39:28,269 --> 00:39:29,710 por ni 871 00:39:29,710 --> 00:39:32,269 no por orden alfabético 872 00:39:32,269 --> 00:39:33,550 ni por nota, ni por nada 873 00:39:33,550 --> 00:39:38,650 ¿Y qué podemos hacer? 874 00:39:38,869 --> 00:39:41,369 Este comparable no se puede cambiar 875 00:39:41,369 --> 00:39:45,769 Este comparable con este compare de aquí 876 00:39:45,769 --> 00:39:47,750 No lo podemos cambiar 877 00:39:47,750 --> 00:39:49,929 No se puede tocar para cambiar el criterio de orden 878 00:39:49,929 --> 00:39:51,070 No se puede 879 00:39:51,070 --> 00:39:54,329 Porque aquí hay un triset de alumno 880 00:39:54,329 --> 00:40:01,130 Y necesita que el compare to sea por clave primaria para detectar la igualdad 881 00:40:01,130 --> 00:40:04,559 vale, pero estas situaciones 882 00:40:04,559 --> 00:40:06,599 se pueden arreglar con el comparator 883 00:40:06,599 --> 00:40:08,139 vale 884 00:40:08,139 --> 00:40:10,920 yo aquí en lugar de pasarle un null para que tire 885 00:40:10,920 --> 00:40:11,619 del comparable 886 00:40:11,619 --> 00:40:14,360 pues le paso un comparator 887 00:40:14,360 --> 00:40:17,320 y ya está, un comparator por alfabético 888 00:40:17,320 --> 00:40:18,079 o por lo que sea 889 00:40:18,079 --> 00:40:19,400 eso es una opción 890 00:40:19,400 --> 00:40:21,099 otra opción 891 00:40:21,099 --> 00:40:25,380 pues oye tú, que es que el comparable de alumno 892 00:40:25,380 --> 00:40:28,000 un segundo y ya paramos 893 00:40:28,000 --> 00:40:33,449 es que el comparable de alumno 894 00:40:33,449 --> 00:40:35,090 A mí me da la gana que sea por nombre 895 00:40:35,090 --> 00:40:38,110 Porque comparable es mi criterio de orden 896 00:40:38,110 --> 00:40:39,809 Que lo van a usar un montón de listas 897 00:40:39,809 --> 00:40:41,670 De cosas, es que a mí no me gusta 898 00:40:41,670 --> 00:40:43,449 No me da la gana que en alumno 899 00:40:43,449 --> 00:40:45,829 El comparable sea este tan raro 900 00:40:45,829 --> 00:40:47,670 Por NIF, para que lo use 901 00:40:47,670 --> 00:40:49,030 Un triset de así eso 902 00:40:49,030 --> 00:40:51,590 Eso sería más natural 903 00:40:51,590 --> 00:40:52,570 No quiero eso 904 00:40:52,570 --> 00:40:55,010 Pues entonces una opción sería 905 00:40:55,010 --> 00:40:57,070 Este compare tú 906 00:40:57,070 --> 00:40:59,429 Ponerlo realmente 907 00:40:59,429 --> 00:41:01,349 Con un sentido más real 908 00:41:01,349 --> 00:41:03,929 hacer el compare tú por nombre 909 00:41:03,929 --> 00:41:16,139 hacer un compare tú por nombre 910 00:41:16,139 --> 00:41:17,280 que 911 00:41:17,280 --> 00:41:19,800 ¿dónde me lo ha puesto? aquí 912 00:41:19,800 --> 00:41:25,809 que sería pues esto que hemos 913 00:41:25,809 --> 00:41:27,869 hecho antes, dis.nombre 914 00:41:27,869 --> 00:41:30,429 .compare tú 915 00:41:30,429 --> 00:41:31,809 o .nombre 916 00:41:32,510 --> 00:41:35,849 este es el compare tú 917 00:41:35,849 --> 00:41:37,289 real, el que tiene más sentido 918 00:41:37,289 --> 00:41:40,150 en nuestra aplicación que va a ordenar por un alfabético 919 00:41:40,150 --> 00:41:41,889 vale 920 00:41:41,889 --> 00:41:50,570 Pero claro, si lo hacemos así para que este criterio de orden trascienda, que es este, el que se nos estropea, como ya sabemos, es este. 921 00:41:50,969 --> 00:41:51,929 Este se nos ha estropeado. 922 00:41:52,389 --> 00:41:55,530 Se nos ha estropeado porque ahora no va a distinguir alumnos iguales. 923 00:41:56,210 --> 00:41:57,570 No los va a distinguir, se nos ha estropeado. 924 00:41:58,309 --> 00:42:00,329 Pero ¿qué es lo que podemos hacer? 925 00:42:00,570 --> 00:42:01,349 ¿Qué es lo más natural? 926 00:42:01,829 --> 00:42:06,289 Oye tú, Triset, te vas a construir, porque yo te lo mando que te construyes. 927 00:42:06,289 --> 00:42:09,849 Pero ojo, el criterio de orden que vas a usar tú 928 00:42:09,849 --> 00:42:12,210 No es el comparable 929 00:42:12,210 --> 00:42:14,250 Porque este tiene un significado real 930 00:42:14,250 --> 00:42:15,789 Es el orden de alumnos 931 00:42:15,789 --> 00:42:18,050 Ojo, no es ese, no uses ese 932 00:42:18,050 --> 00:42:20,269 Ese es para definir la aplicación 933 00:42:20,269 --> 00:42:23,090 Usa este otro que yo te voy a dar aquí 934 00:42:23,090 --> 00:42:24,809 ¿Vale? 935 00:42:25,050 --> 00:42:27,469 Pues el constructor de triset admite 936 00:42:27,469 --> 00:42:29,769 Que le demos un objeto comparado 937 00:42:29,769 --> 00:42:36,030 Y lo usa para su almacenamiento interno 938 00:42:36,030 --> 00:42:39,230 Comparador 939 00:42:39,230 --> 00:42:40,989 Nif, por ejemplo 940 00:42:40,989 --> 00:42:45,840 Entonces, oye tú, usa este 941 00:42:45,840 --> 00:42:46,820 Usa este 942 00:42:46,820 --> 00:42:49,860 Para tus operaciones, para tus cosas 943 00:42:49,860 --> 00:42:51,679 Usa este, no uses el otro 944 00:42:51,679 --> 00:42:54,519 Usa este 945 00:42:54,519 --> 00:42:56,380 Lo que pasa es que lo tenemos que hacer, claro 946 00:42:56,380 --> 00:42:58,739 Pero bueno, ya sabemos hacerlo 947 00:42:58,739 --> 00:43:06,199 Nos hacemos nuestra clase 948 00:43:06,199 --> 00:43:08,019 Comparador Nif 949 00:43:08,019 --> 00:43:09,380 Para que sea un comparator 950 00:43:09,380 --> 00:43:10,820 Tiene que implementar 951 00:43:10,820 --> 00:43:13,380 Comparator 952 00:43:13,380 --> 00:43:14,420 comparator 953 00:43:14,420 --> 00:43:16,860 de alumno 954 00:43:16,860 --> 00:43:19,039 para que sea un comparador de alumnos 955 00:43:19,039 --> 00:43:23,420 y ahora ya 956 00:43:23,420 --> 00:43:25,739 implementamos este método 957 00:43:25,739 --> 00:43:28,159 que este será 958 00:43:28,159 --> 00:43:29,840 o uno punto 959 00:43:29,840 --> 00:43:30,559 nombre 960 00:43:30,559 --> 00:43:33,840 ahora ya si que el get 961 00:43:33,840 --> 00:43:34,980 porque estamos fuera de la clase 962 00:43:34,980 --> 00:43:37,679 punto compare tu 963 00:43:37,679 --> 00:43:39,960 o dos punto 964 00:43:39,960 --> 00:43:40,980 get nombre 965 00:43:40,980 --> 00:43:48,900 vale pues me he hecho un criterio de comparación que va a ir por libre 966 00:43:48,900 --> 00:43:50,119 para quien lo quiera usar 967 00:43:50,119 --> 00:43:52,019 un criterio de comparación entre 968 00:43:52,019 --> 00:43:54,139 alumnos, entre alumnos basado 969 00:43:54,139 --> 00:43:55,840 en NIF, perdón 970 00:43:55,840 --> 00:43:57,079 en NIF 971 00:43:57,079 --> 00:43:59,219 porque he puesto aquí nombre 972 00:43:59,219 --> 00:44:01,760 basado en NIF 973 00:44:01,760 --> 00:44:04,460 vale, me he hecho un criterio de comparación 974 00:44:04,460 --> 00:44:05,760 ahí suelto por libre 975 00:44:05,760 --> 00:44:08,159 para quien sea que lo quiera 976 00:44:08,159 --> 00:44:10,179 usar, que no está asociado a alumno 977 00:44:10,179 --> 00:44:11,820 alumno tiene el suyo propio 978 00:44:11,820 --> 00:44:14,119 comparable por nombre, que es el que me gusta y quiero 979 00:44:14,119 --> 00:44:16,260 que esté, porque es mi sentido real 980 00:44:16,260 --> 00:44:18,079 mi sentido real 981 00:44:18,079 --> 00:44:20,420 es comparar por nombre 982 00:44:20,420 --> 00:44:22,460 ese es mi sentido real, quiero que se compare 983 00:44:22,460 --> 00:44:23,820 por nombre, mi criterio de orden 984 00:44:23,820 --> 00:44:26,599 vale, pero me hago este comparador 985 00:44:26,599 --> 00:44:28,260 aquí por libre, por si alguien lo 986 00:44:28,260 --> 00:44:28,780 necesita 987 00:44:28,780 --> 00:44:31,659 ¿quién lo va a necesitar aquí? 988 00:44:32,199 --> 00:44:33,019 el triset 989 00:44:33,019 --> 00:44:36,239 cuando yo instancie mi triset, hay que 990 00:44:36,239 --> 00:44:38,139 decirle, oye tú, olvida el 991 00:44:38,139 --> 00:44:40,219 comparable de alumno, que ese es para listados 992 00:44:40,219 --> 00:44:41,639 es para otras cosas, olvídalo 993 00:44:41,639 --> 00:44:43,940 y quédate con este criterio 994 00:44:43,940 --> 00:44:44,860 para tu igualdad 995 00:44:44,860 --> 00:44:47,320 quédate con este 996 00:44:47,320 --> 00:45:23,519 Entonces usa este, ignora el de la clase y ahora ya esto nos funcionaría todo. El tríceps podría incorporar alumnos con el mismo nombre y diferente NIF, ningún problema, podría incorporarlos perfectamente, ¿vale? Por ejemplo vamos a insertar aquí más alumnos para ver el listado, ¿vale? 997 00:45:23,519 --> 00:45:35,400 Por ejemplo, ya aquí he metido a tres, los va a meter a los tres, porque son NIF distintos, los va a meter a los tres, porque son NIF distintos, aunque dos compartan el nombre, pero son NIF distintos, los va a meter a los tres, ¿vale? 998 00:45:36,400 --> 00:45:45,219 Luego, cuando yo los meto en una lista y los ordeno, el criterio de ordenación va a ser el de alfabético, porque es el que tiene alumno. 999 00:45:45,219 --> 00:45:47,699 entonces bueno, ahora todo 1000 00:45:47,699 --> 00:45:49,360 funcionará 1001 00:45:49,360 --> 00:45:50,920 bien, suponemos 1002 00:45:50,920 --> 00:45:52,880 ha metido a los tres 1003 00:45:52,880 --> 00:45:55,619 incluso con mismo nombre 1004 00:45:55,619 --> 00:45:56,719 para él son distintos 1005 00:45:56,719 --> 00:45:58,500 pero ahora ya sí 1006 00:45:58,500 --> 00:46:01,099 el orden de la ordenación de la lista 1007 00:46:01,099 --> 00:46:03,260 es el del comparable, que es el alfabético 1008 00:46:03,260 --> 00:46:04,400 que es el que a mí me gusta 1009 00:46:04,400 --> 00:46:05,860 no el de NIF 1010 00:46:05,860 --> 00:46:14,889 no el de NIF, pues estas son las ideas 1011 00:46:14,889 --> 00:46:28,590 vale, pues estas son