1 00:00:01,199 --> 00:00:27,980 Vale, aquí no se puede plantear hacer la revuelta, la situación es distinta, porque puede haber varios, aquí no hay igualdad por equipo, la igualdad es por equipo y número, entonces aquí pues uno, ¿qué le podrías ir a hacer? Pues un forno, uno para localizar, para cada jugador, jota en jugadores, vamos a ver si este es uno de los que toca borrar, si este es uno de los que toca borrar, 2 00:00:27,980 --> 00:00:32,700 porque aquí no podemos, repito, borrar por igualdad 3 00:00:32,700 --> 00:00:34,200 aquí hay que ver, si este jugador 4 00:00:34,200 --> 00:00:35,500 tiene ese equipo 5 00:00:35,500 --> 00:00:37,659 pues será de los que toca borrar 6 00:00:37,659 --> 00:00:39,179 pues vamos a ver 7 00:00:39,179 --> 00:00:43,509 si el equipo de este jugador 8 00:00:43,509 --> 00:00:45,049 es igual 9 00:00:45,049 --> 00:00:47,450 al equipo que me han pasado 10 00:00:47,450 --> 00:00:49,429 al que pertenecen 11 00:00:49,429 --> 00:00:52,530 los que tengo que borrar 12 00:00:52,530 --> 00:00:54,880 vale 13 00:00:54,880 --> 00:00:58,479 entonces si este jugador 14 00:00:58,479 --> 00:01:01,100 pues entonces ahora ya uno podría 15 00:01:01,100 --> 00:01:02,460 plantearse hacer, vale, pues entonces 16 00:01:02,460 --> 00:01:04,340 a este jugador en concreto, a este J 17 00:01:04,340 --> 00:01:05,459 A este 18 00:01:05,459 --> 00:01:09,000 Que he visto que su equipo es igual a este 19 00:01:09,000 --> 00:01:11,180 A este jugador le tengo que borrar 20 00:01:11,180 --> 00:01:12,719 A ese, a uno igual a ese 21 00:01:12,719 --> 00:01:14,780 Entonces aquí uno sí que 22 00:01:14,780 --> 00:01:16,700 Tendría sentido que se planteara hacer esto 23 00:01:16,700 --> 00:01:17,140 ¿Verdad? 24 00:01:18,980 --> 00:01:20,939 Jugadores.remove 25 00:01:20,939 --> 00:01:21,260 J 26 00:01:21,260 --> 00:01:25,040 ¿No? Este remove ya tiene sentido 27 00:01:25,040 --> 00:01:26,780 Porque aquí queremos 28 00:01:26,780 --> 00:01:28,780 Borrar a este, a este le queremos borrar 29 00:01:28,780 --> 00:01:29,299 A este 30 00:01:29,299 --> 00:01:32,140 Porque hemos visto que su equipo es igual 31 00:01:32,140 --> 00:01:33,299 Luego a ese hay que borrarle 32 00:01:33,299 --> 00:01:34,659 Pues si le pasamos al remove 33 00:01:34,659 --> 00:01:35,859 Borrará a ese 34 00:01:35,859 --> 00:01:37,019 O a uno igual a ese 35 00:01:37,019 --> 00:01:39,900 Pero es que ser igual es ser el mismo 36 00:01:39,900 --> 00:01:41,000 Estamos hablando de 37 00:01:41,000 --> 00:01:44,140 Entonces que cinco veces 38 00:01:44,140 --> 00:01:46,280 Se encuentra 39 00:01:46,280 --> 00:01:48,739 A cinco jugadores de ese equipo 40 00:01:48,739 --> 00:01:50,680 Pues borraría a los cinco 41 00:01:50,680 --> 00:01:52,280 Haría cinco remove 42 00:01:52,280 --> 00:01:53,200 ¿No? 43 00:01:56,239 --> 00:01:57,120 Mismo equipo 44 00:01:57,120 --> 00:02:00,760 Claro, el parámetro que yo le he pasado es el de equipo 45 00:02:00,760 --> 00:02:01,760 Entonces todos 46 00:02:01,760 --> 00:02:03,799 Los que pertenezcan a un equipo 47 00:02:03,799 --> 00:02:06,000 a todos esos los está borrando 48 00:02:06,000 --> 00:02:07,400 ¿no? 49 00:02:08,219 --> 00:02:10,319 ¿entendéis la sintaxis de este for? 50 00:02:10,479 --> 00:02:11,840 ¿no? o sea lo que está por ahí 51 00:02:11,840 --> 00:02:27,560 a ver 52 00:02:27,560 --> 00:02:45,349 vale, bueno 53 00:02:45,349 --> 00:02:47,610 esto que está aquí 54 00:02:47,610 --> 00:02:50,509 todo el mundo lo entiende 55 00:02:50,509 --> 00:02:51,389 ¿y le veis sentido? 56 00:02:52,530 --> 00:02:54,849 estamos borrando a este porque su equipo 57 00:02:54,849 --> 00:02:56,770 es igual que luego después de 58 00:02:56,770 --> 00:02:58,509 tres iteraciones después encontramos a otro 59 00:02:58,509 --> 00:03:00,030 cuyo equipo es igual, estamos borrando 60 00:03:00,030 --> 00:03:01,689 todo esto tiene sentido ¿no? 61 00:03:01,689 --> 00:03:04,169 Porque ahora el remove ya sí que queremos borrar uno 62 00:03:04,169 --> 00:03:05,370 Igual a este, igual 63 00:03:05,370 --> 00:03:07,810 Y esto habrá que hacerlo tantas veces 64 00:03:07,810 --> 00:03:10,210 Como jugadores encontremos 65 00:03:10,210 --> 00:03:11,229 Que pertenecen a ese equipo 66 00:03:11,229 --> 00:03:14,370 A lo mejor borraremos cinco 67 00:03:14,370 --> 00:03:15,930 O a lo mejor borraremos seis, no lo sé 68 00:03:15,930 --> 00:03:17,590 No es como aquí, aquí borramos uno 69 00:03:17,590 --> 00:03:20,330 Borramos el jugador de este número 70 00:03:20,330 --> 00:03:22,050 Y de este equipo, borramos uno 71 00:03:22,050 --> 00:03:24,449 Hacemos una auxiliar y borramos uno 72 00:03:24,449 --> 00:03:25,830 Igual a ese, este es otro método 73 00:03:25,830 --> 00:03:28,110 Vale, pues entonces 74 00:03:28,110 --> 00:03:29,330 Vamos a probar esto 75 00:03:29,330 --> 00:03:31,569 Poniéndole más 76 00:03:31,569 --> 00:03:34,430 Para que haya varios del mismo equipo 77 00:03:34,430 --> 00:03:41,300 Vale, pues vamos a poner aquí 78 00:03:41,300 --> 00:03:45,699 Otro diferente del Madrid 79 00:03:45,699 --> 00:04:03,150 Vamos a poner aquí otro diferente 80 00:04:03,150 --> 00:04:05,969 De Valencia 81 00:04:05,969 --> 00:04:08,150 Y aquí otro diferente del Madrid 82 00:04:08,150 --> 00:04:16,189 Tenemos entonces tres del Madrid pero que son distintos 83 00:04:16,189 --> 00:04:18,610 El 1, el 2 y el 3 84 00:04:18,610 --> 00:04:21,189 Tres jugadores distintos que pueden ir a la colección 85 00:04:21,189 --> 00:04:23,389 Sin ningún problema porque son distintos 86 00:04:23,389 --> 00:04:24,829 porque el número es distinto 87 00:04:24,829 --> 00:04:27,310 y la igualdad viene por número y equipo 88 00:04:27,310 --> 00:04:31,589 vale, pues entonces, ya tenemos este método 89 00:04:31,589 --> 00:04:33,649 vamos ahora en el main 90 00:04:33,649 --> 00:04:35,529 incorporar para que haga eso 91 00:04:35,529 --> 00:04:40,850 vale, pues venga 92 00:04:40,850 --> 00:04:42,209 vamos ahora a 93 00:04:42,209 --> 00:04:44,889 hacer 94 00:04:44,889 --> 00:04:47,089 esto 95 00:04:47,089 --> 00:04:48,730 eliminar 96 00:04:48,730 --> 00:04:52,769 jugadores 97 00:04:52,769 --> 00:04:55,089 de un equipo 98 00:04:55,089 --> 00:05:00,189 vale 99 00:05:00,189 --> 00:05:01,769 pues pedimos el equipo 100 00:05:01,769 --> 00:05:11,709 Y ahora ya sí 101 00:05:11,709 --> 00:05:14,810 Podemos llamar al método correspondiente 102 00:05:14,810 --> 00:05:15,470 Que era 103 00:05:15,470 --> 00:05:18,490 Eliminar jugadores de un equipo 104 00:05:18,490 --> 00:05:20,610 Le pasamos el equipo 105 00:05:20,610 --> 00:05:21,449 Que acabamos de leer 106 00:05:21,449 --> 00:05:23,170 Para que elimine todos los de ese equipo 107 00:05:23,170 --> 00:05:24,689 Y el set con el que trabajar 108 00:05:24,689 --> 00:05:26,689 Y ahora vamos a volver a 109 00:05:26,689 --> 00:05:28,769 Llamar a mostrar jugadores 110 00:05:28,769 --> 00:05:30,769 A ver si ha eliminado todos los de ese 111 00:05:30,769 --> 00:05:34,019 Lo que estamos haciendo 112 00:05:34,019 --> 00:05:36,480 Pedimos un equipo, llamamos al método que acabamos de hacer 113 00:05:36,480 --> 00:05:38,319 Y volvemos a mostrar 114 00:05:38,319 --> 00:05:40,879 Y el método 115 00:05:40,879 --> 00:05:43,319 El método que acabamos de hacer es 116 00:05:43,319 --> 00:05:44,959 Este 117 00:05:44,959 --> 00:05:47,439 Va uno por uno 118 00:05:47,439 --> 00:05:49,339 Todos los que coinciden en equipo 119 00:05:49,339 --> 00:05:50,319 A borrar 120 00:05:50,319 --> 00:05:52,180 Pues venga 121 00:05:52,180 --> 00:05:55,259 Vamos a hacer el main 122 00:05:55,259 --> 00:05:59,879 Que hace un montón de cosas 123 00:05:59,879 --> 00:06:01,779 Es un rollo, hay que meterle varias cosas, pero bueno 124 00:06:01,779 --> 00:06:04,220 Vale, pues venga 125 00:06:04,220 --> 00:06:05,519 Tiene seis 126 00:06:05,519 --> 00:06:08,240 Le hemos metido seis 127 00:06:08,240 --> 00:06:10,079 Vale 128 00:06:10,079 --> 00:06:11,819 Entonces, como veis 129 00:06:11,819 --> 00:06:14,600 el orden en el que 130 00:06:14,600 --> 00:06:15,259 los muestra 131 00:06:15,259 --> 00:06:18,139 no tiene nada que ver 132 00:06:18,139 --> 00:06:19,500 nada que ver 133 00:06:19,500 --> 00:06:22,379 con el orden en el que 134 00:06:22,379 --> 00:06:23,379 lo hemos insertado 135 00:06:23,379 --> 00:06:26,060 lo hemos insertado 136 00:06:26,060 --> 00:06:28,300 Luis, Pepe de Madrid, Sevilla 137 00:06:28,300 --> 00:06:30,240 lo hemos insertado en este orden 138 00:06:30,240 --> 00:06:32,680 pero cuando luego hemos hecho el for 139 00:06:32,680 --> 00:06:33,720 y lo hemos mostrado 140 00:06:33,720 --> 00:06:36,399 el orden no tiene nada que ver 141 00:06:36,399 --> 00:06:38,259 es que no hay orden 142 00:06:38,259 --> 00:06:39,379 en los conjuntos 143 00:06:39,379 --> 00:06:41,980 es decir, el orden de iteración en el for 144 00:06:41,980 --> 00:06:43,639 el orden por el que he ido iterando 145 00:06:43,639 --> 00:06:46,399 es un orden que no se corresponde 146 00:06:46,399 --> 00:06:48,139 con el orden con el que yo he ido insertando 147 00:06:48,139 --> 00:06:50,300 en las listas 148 00:06:50,300 --> 00:06:51,959 sí, cuando yo insertaba 149 00:06:51,959 --> 00:06:53,980 una lista y luego recorría con un for each 150 00:06:53,980 --> 00:06:56,040 pues yo veía que se me iba mostrando 151 00:06:56,040 --> 00:06:58,220 en el mismo orden en que había 152 00:06:58,220 --> 00:06:59,040 ido insertando 153 00:06:59,040 --> 00:07:00,339 pero aquí no 154 00:07:00,339 --> 00:07:03,959 aquí es donde mejor se ve 155 00:07:03,959 --> 00:07:05,920 que en los conjuntos no hay una 156 00:07:05,920 --> 00:07:07,100 posición, no hay un orden 157 00:07:07,100 --> 00:07:17,610 Vale, pues entonces 158 00:07:17,610 --> 00:07:19,449 Estos son los datos que hemos metido 159 00:07:19,449 --> 00:07:21,870 Son estos 6 160 00:07:21,870 --> 00:07:25,069 Vamos a comprobar si hay jugadores 161 00:07:25,069 --> 00:07:27,790 En el equipo de Sevilla 162 00:07:27,790 --> 00:07:28,509 Por ejemplo 163 00:07:28,509 --> 00:07:30,870 Pues sí existe 164 00:07:30,870 --> 00:07:33,470 Ahora vamos a ver si existe alguno en concreto 165 00:07:33,470 --> 00:07:35,790 Venga, el 1 de Sevilla, a ver si existe 166 00:07:35,790 --> 00:07:37,370 Uy, nombre de equipo 167 00:07:37,370 --> 00:07:40,089 Sevilla, el 1 168 00:07:40,089 --> 00:07:41,569 El jugador está 169 00:07:41,569 --> 00:07:43,569 Vamos a eliminar 170 00:07:43,569 --> 00:07:44,509 Pues 171 00:07:44,509 --> 00:07:47,730 El de Sevilla 172 00:07:47,730 --> 00:07:49,230 También, 1 Sevilla 173 00:07:49,230 --> 00:07:50,389 Venga, nombre de equipo 174 00:07:50,389 --> 00:07:53,970 Este 175 00:07:53,970 --> 00:07:56,930 Y efectivamente ya solo me quedan 5 176 00:07:56,930 --> 00:07:58,129 Lo he eliminado 177 00:07:58,129 --> 00:08:01,310 ¿Vale? Y ahora vamos a eliminar jugadores 178 00:08:01,310 --> 00:08:03,009 Que pertenezcan a un equipo 179 00:08:03,009 --> 00:08:04,870 Jugadores que pertenezcan a un equipo 180 00:08:04,870 --> 00:08:06,670 Que es la última funcionalidad que nos faltaba 181 00:08:06,670 --> 00:08:09,189 Que ese es el que hace el Zor y va uno por uno 182 00:08:09,189 --> 00:08:11,029 Pues venga, Madrid 183 00:08:11,029 --> 00:08:14,829 Y no sale una excepción 184 00:08:14,829 --> 00:08:17,470 Una excepción rarísima 185 00:08:17,470 --> 00:08:18,850 Porque realmente esto 186 00:08:18,850 --> 00:08:21,810 Con todo lo que hemos visto 187 00:08:21,810 --> 00:08:22,589 Está bien hecho 188 00:08:22,589 --> 00:08:23,850 Esto está bien 189 00:08:23,850 --> 00:08:25,689 Un for each que recorre 190 00:08:25,689 --> 00:08:29,569 Para cada jugador cuyo equipo coincida con el equipo que me han dado 191 00:08:29,569 --> 00:08:30,790 Se lo pasa al remove 192 00:08:30,790 --> 00:08:32,129 Para que lo elimine 193 00:08:32,129 --> 00:08:33,090 Uno igual a ese 194 00:08:33,090 --> 00:08:35,250 En este caso ese mismo 195 00:08:35,250 --> 00:08:38,450 Porque es que es directamente el que estoy aquí de la colección 196 00:08:38,450 --> 00:08:40,169 Pero ha sido un error muy raro 197 00:08:40,169 --> 00:08:43,029 Vamos a volver a probarlo 198 00:08:43,029 --> 00:08:49,350 Eliminando los de Valencia 199 00:08:49,350 --> 00:08:50,210 Por ejemplo 200 00:08:50,210 --> 00:08:53,360 Vamos a ver 201 00:08:53,360 --> 00:08:56,809 Comprar jugadores de un equipo 202 00:08:56,809 --> 00:08:58,629 Estas son las primeras, meto cualquier cosa 203 00:08:58,629 --> 00:09:01,169 No existe, nombre de equipo, patatín 204 00:09:01,169 --> 00:09:02,669 Número de jugador 2 205 00:09:02,669 --> 00:09:04,850 No está, eliminamos jugador, nombre de equipo 206 00:09:04,850 --> 00:09:06,289 Patatín 207 00:09:06,289 --> 00:09:08,409 Vale, y ahora vamos a eliminar 208 00:09:08,409 --> 00:09:09,950 Jugadores de 209 00:09:09,950 --> 00:09:13,340 Valencia 210 00:09:13,340 --> 00:09:19,309 Vale, nos vuelve a salir 211 00:09:19,309 --> 00:09:20,629 El mismo error 212 00:09:20,629 --> 00:09:23,029 Vamos a 213 00:09:23,029 --> 00:09:28,519 hacer otra prueba 214 00:09:28,519 --> 00:09:30,779 ahora lo miramos 215 00:09:30,779 --> 00:09:31,360 ahora lo miramos 216 00:09:31,360 --> 00:09:33,639 lo vamos a mirar y vamos a aclararlo 217 00:09:33,639 --> 00:09:35,879 pero estoy yo buscando 218 00:09:35,879 --> 00:09:37,139 un caso de prueba 219 00:09:37,139 --> 00:09:38,299 vamos a ver 220 00:09:38,299 --> 00:09:40,620 vamos a meter 221 00:09:40,620 --> 00:09:48,610 vale, vamos a eliminar 222 00:09:48,610 --> 00:09:50,830 a este, vamos a hacer el otro caso de prueba 223 00:09:50,830 --> 00:09:54,700 vamos a hacer otro caso 224 00:09:54,700 --> 00:09:56,200 de prueba que sea este de aquí 225 00:09:56,200 --> 00:09:59,799 vamos a meter solamente 226 00:09:59,799 --> 00:10:02,179 a dos, a este y a este 227 00:10:02,179 --> 00:10:02,940 Estos fuera 228 00:10:02,940 --> 00:10:09,840 Vamos a hacer ahora la ejecución 229 00:10:09,840 --> 00:10:11,120 Pero solo con estos dos jugadores 230 00:10:11,120 --> 00:10:13,379 Pues venga 231 00:10:13,379 --> 00:10:15,279 Solo con estos dos en la colección 232 00:10:15,279 --> 00:10:17,519 Hay jugadores en este equipo 233 00:10:17,519 --> 00:10:19,620 No, introduzca nombre de equipo y número 234 00:10:19,620 --> 00:10:21,820 No está, eliminamos jugador 235 00:10:21,820 --> 00:10:23,799 De este equipo y de este número 236 00:10:23,799 --> 00:10:25,740 No está, siguen estos dos 237 00:10:25,740 --> 00:10:27,759 Ahora vamos a eliminar jugadores 238 00:10:27,759 --> 00:10:29,340 De este 239 00:10:29,340 --> 00:10:34,779 Pues aquí me lo ha hecho bien 240 00:10:34,779 --> 00:10:36,759 No he cambiado nada el código fuente 241 00:10:36,759 --> 00:10:37,679 No he cambiado nada 242 00:10:37,679 --> 00:10:39,899 A ver, he metido menos jugadores 243 00:10:39,899 --> 00:10:42,159 Pero vamos, que el método es igual, todo es igual 244 00:10:42,159 --> 00:10:44,700 Y no solo no me da error 245 00:10:44,700 --> 00:10:46,340 Sino que me lo ha eliminado 246 00:10:46,340 --> 00:10:48,139 Cuando yo miro 247 00:10:48,139 --> 00:10:51,019 Cuando yo miro 248 00:10:51,019 --> 00:10:52,460 Me lo ha eliminado, aquí lo ha hecho bien 249 00:10:52,460 --> 00:10:56,620 Entonces aquí, a ver Ana 250 00:10:56,620 --> 00:10:57,419 Cállate por favor 251 00:10:57,419 --> 00:11:01,980 Entonces aquí, ¿qué está pasando? 252 00:11:02,600 --> 00:11:03,559 Bueno, esto primero 253 00:11:03,559 --> 00:11:07,320 Esta es la primera muestra de que cuidado con las fases de prueba 254 00:11:07,320 --> 00:11:08,379 Tienen que ser completas 255 00:11:08,379 --> 00:11:11,000 Si uno hace un único caso de prueba con estos dos 256 00:11:11,000 --> 00:11:13,639 y mete Sevilla A, eliminado 257 00:11:13,639 --> 00:11:14,740 muy bien, funciona el código 258 00:11:14,740 --> 00:11:16,200 y tiro para adelante 259 00:11:16,200 --> 00:11:19,440 cuando uno se puede hacer más casos de prueba 260 00:11:19,440 --> 00:11:20,820 de repente le salen errores 261 00:11:20,820 --> 00:11:22,440 que es lo que nos ha pasado a nosotros 262 00:11:22,440 --> 00:11:25,179 es importante no concluir con una sola prueba 263 00:11:25,179 --> 00:11:26,240 que el código está bien hecho 264 00:11:26,240 --> 00:11:29,340 bueno, pues ahora vamos a la siguiente parte 265 00:11:29,340 --> 00:11:31,639 hemos hecho más casos de prueba 266 00:11:31,639 --> 00:11:32,679 metiendo más jugadores 267 00:11:32,679 --> 00:11:34,139 y nos ha dado un error 268 00:11:34,139 --> 00:11:37,759 vamos a volver a forzarlo 269 00:11:37,759 --> 00:11:39,720 para ver 270 00:11:39,720 --> 00:11:46,700 para ver 271 00:11:46,700 --> 00:11:50,120 qué tipo de error nos da 272 00:11:50,120 --> 00:11:56,139 nombre de equipo 273 00:11:56,139 --> 00:11:58,080 nada, nombre de equipo 274 00:11:58,080 --> 00:12:00,320 número, nombre de equipo 275 00:12:00,320 --> 00:12:02,419 número, y ahora vamos a eliminar 276 00:12:02,419 --> 00:12:03,320 jugadores de un equipo 277 00:12:03,320 --> 00:12:05,940 Madrid, ahí está el error 278 00:12:05,940 --> 00:12:07,600 con el mismo código 279 00:12:07,600 --> 00:12:10,139 vale 280 00:12:10,139 --> 00:12:11,519 pues venga, qué error nos da 281 00:12:11,519 --> 00:12:13,500 este que no lo hemos visto en la vida 282 00:12:13,500 --> 00:12:16,019 error de modificación 283 00:12:16,019 --> 00:12:16,940 concurrente 284 00:12:16,940 --> 00:12:19,779 vale, ¿qué significa 285 00:12:19,779 --> 00:12:21,139 modificación concurrente? 286 00:12:21,519 --> 00:12:23,340 concurrencia, concurrencia 287 00:12:23,340 --> 00:12:25,399 significa es que hay dos cosas que están 288 00:12:25,399 --> 00:12:27,279 chocando, eso es concurrencia 289 00:12:27,279 --> 00:12:29,500 si concurrimos en algo hay varias cosas 290 00:12:29,500 --> 00:12:31,179 que están chocando en algo 291 00:12:31,179 --> 00:12:33,700 entonces lo que significa esto es que 292 00:12:33,700 --> 00:12:35,679 hay 293 00:12:35,679 --> 00:12:37,159 un problema 294 00:12:37,159 --> 00:12:38,600 de que a un recurso 295 00:12:38,600 --> 00:12:41,019 a un recurso de mi proceso, de mi programa 296 00:12:41,019 --> 00:12:43,399 están tratando de acceder desde dos 297 00:12:43,399 --> 00:12:44,299 partes a la vez 298 00:12:44,299 --> 00:12:47,299 eso es un problema 299 00:12:47,299 --> 00:12:49,580 cuando un programa se está ejecutando 300 00:12:49,580 --> 00:12:51,500 pues tiene su proceso, sus variables 301 00:12:51,500 --> 00:12:53,720 y los recursos del programa 302 00:12:53,720 --> 00:12:55,720 que los recursos del programa son las variables 303 00:12:55,720 --> 00:12:58,000 en nuestro caso, no pueden ser accedidas 304 00:12:58,000 --> 00:12:59,820 a la vez, primero tiene que ser accedida por uno 305 00:12:59,820 --> 00:13:01,139 y luego por otro 306 00:13:01,139 --> 00:13:03,779 eso es importantísimo en la programación 307 00:13:03,779 --> 00:13:05,600 multihilo, cuando tengo una aplicación 308 00:13:05,600 --> 00:13:07,679 que son muchos hilos a la vez 309 00:13:07,679 --> 00:13:09,759 ¿vale? programación que veréis 310 00:13:09,759 --> 00:13:11,679 el año que viene, nosotros hasta ahora 311 00:13:11,679 --> 00:13:13,299 todos nuestros programas es un solo hilo de ejecución 312 00:13:13,299 --> 00:13:15,500 hago esto, hago esto, hago esto, uno tras otro 313 00:13:15,500 --> 00:13:17,059 son sentencias una tras otra 314 00:13:17,059 --> 00:13:18,980 a lo mejor estoy llamando a métodos, pero da igual 315 00:13:18,980 --> 00:13:21,519 yo entro en un método, hago lo que sea, salgo del método 316 00:13:21,519 --> 00:13:23,940 vuelvo aquí, sigo, ahora me voy a otro método 317 00:13:23,940 --> 00:13:25,620 sigo, todos los programas 318 00:13:25,620 --> 00:13:27,240 que hemos hecho es una sentencia una tras otra 319 00:13:27,240 --> 00:13:29,480 eso significa que es un solo hilo 320 00:13:29,480 --> 00:13:31,379 pero podemos hacer programas 321 00:13:31,379 --> 00:13:33,580 donde tenemos varios hilos a la vez 322 00:13:33,580 --> 00:13:34,460 que se van haciendo a la vez 323 00:13:34,460 --> 00:13:37,320 ¿cuál es el problema 324 00:13:37,320 --> 00:13:39,259 cuando tenemos varios hilos? 325 00:13:39,740 --> 00:13:41,639 que si hay variables compartidas 326 00:13:41,639 --> 00:13:42,799 como es el caso 327 00:13:42,799 --> 00:13:44,700 y 2 quieren acceder a la vez 328 00:13:44,700 --> 00:13:46,659 para hacer system.out.println 329 00:13:46,659 --> 00:13:49,100 n o para hacer n igual a 7 330 00:13:49,100 --> 00:13:50,200 2 a la vez quieren 331 00:13:50,200 --> 00:13:52,179 saltaría este error 332 00:13:52,179 --> 00:13:54,299 porque a un recurso no pueden acceder 333 00:13:54,299 --> 00:13:55,279 2 a la vez 334 00:13:55,279 --> 00:13:58,940 y por eso cuando se programa en multilo 335 00:13:58,940 --> 00:14:01,019 hay que habilitar semáforos, historias 336 00:14:01,019 --> 00:14:02,320 y rollos que es lo que se da 337 00:14:02,320 --> 00:14:03,980 en un módulo de curso que viene 338 00:14:03,980 --> 00:14:05,620 para evitar esto 339 00:14:05,620 --> 00:14:08,559 para evitar que a un recurso lleguen 2 a la vez 340 00:14:08,559 --> 00:14:11,019 entonces el error significa eso 341 00:14:11,019 --> 00:14:12,899 que a un recurso han ido dos a la vez 342 00:14:12,899 --> 00:14:15,879 claro, pero aquí solo tenemos un hilo 343 00:14:15,879 --> 00:14:18,059 ¿quiénes son los dos que han ido a la vez? 344 00:14:19,100 --> 00:14:19,980 bueno, pues son 345 00:14:19,980 --> 00:14:21,500 dos for en realidad 346 00:14:21,500 --> 00:14:24,399 ¿qué es lo que ha pasado aquí? 347 00:14:24,779 --> 00:14:25,879 vámonos a nuestro método 348 00:14:25,879 --> 00:14:27,080 peligroso, este 349 00:14:27,080 --> 00:14:31,269 nosotros llamamos al remove 350 00:14:31,269 --> 00:14:33,549 y el remove ya sabemos lo que hace 351 00:14:33,549 --> 00:14:35,889 elimina de esta colección 352 00:14:35,889 --> 00:14:36,909 un objeto igual a esto 353 00:14:36,909 --> 00:14:39,509 pero para hacer eso tiene que hacer muchas cosas dentro 354 00:14:39,509 --> 00:14:41,190 ¿qué tendrá que hacer? 355 00:14:41,190 --> 00:14:43,490 empezar a recorrer la colección 356 00:14:43,490 --> 00:14:45,330 recorrerla uno por uno 357 00:14:45,330 --> 00:14:47,269 cuando se encuentra a un objeto 358 00:14:47,269 --> 00:14:48,590 que es igual a S lo elimina 359 00:14:48,590 --> 00:14:50,210 aquí dentro está recorriendo 360 00:14:50,210 --> 00:14:52,210 entonces tenemos un for dentro de otro for 361 00:14:52,210 --> 00:14:54,009 y ambos for 362 00:14:54,009 --> 00:14:56,549 están accediendo a la misma colección 363 00:14:56,549 --> 00:14:59,210 pues esta situación 364 00:14:59,210 --> 00:15:00,830 esta situación 365 00:15:00,830 --> 00:15:02,370 da este error también 366 00:15:02,370 --> 00:15:04,649 aunque no estemos en programación multihilo 367 00:15:04,649 --> 00:15:06,490 es decir, este for each 368 00:15:06,490 --> 00:15:08,509 este for each 369 00:15:08,509 --> 00:15:11,049 ha bloqueado, por decirlo así 370 00:15:11,049 --> 00:15:13,429 este recurso jugadores, lo ha bloqueado 371 00:15:13,429 --> 00:15:14,970 y ha dicho hasta que yo no acabe con él 372 00:15:14,970 --> 00:15:17,570 que nadie más lo modifique 373 00:15:17,570 --> 00:15:19,029 lo puedes consultar 374 00:15:19,029 --> 00:15:20,169 pero no lo puedes modificar 375 00:15:20,169 --> 00:15:22,990 es lo que te está diciendo este for each 376 00:15:22,990 --> 00:15:24,309 hasta que yo no acabe 377 00:15:24,309 --> 00:15:27,509 lo siento pero que nadie lo puede modificar 378 00:15:27,509 --> 00:15:29,309 pues bueno 379 00:15:29,309 --> 00:15:30,269 él no ha acabado 380 00:15:30,269 --> 00:15:32,830 y este remove 381 00:15:32,830 --> 00:15:34,610 ha entrado en él 382 00:15:34,610 --> 00:15:36,970 para quitar uno, eso es una modificación 383 00:15:36,970 --> 00:15:39,129 si hubiéramos entrado para un 384 00:15:39,129 --> 00:15:41,049 Contains o para algo que no modifica 385 00:15:41,049 --> 00:15:42,830 Solo consulta, no habría habido ningún problema 386 00:15:42,830 --> 00:15:45,029 Pero es que este remove está entrando 387 00:15:45,029 --> 00:15:47,370 Dentro de esa colección 388 00:15:47,370 --> 00:15:49,330 Para eliminar 389 00:15:49,330 --> 00:15:50,929 Una cosa, eso es modificar 390 00:15:50,929 --> 00:15:52,730 Estamos cambiando su estado, eliminando 391 00:15:52,730 --> 00:15:55,490 Entonces este ha dicho, no, yo lo tengo bloqueado 392 00:15:55,490 --> 00:15:56,389 Lo siento 393 00:15:56,389 --> 00:15:58,250 Y por eso ha salido ese error 394 00:15:58,250 --> 00:16:01,409 ¿Vale? Entonces los for each 395 00:16:01,409 --> 00:16:02,909 Bloquean 396 00:16:02,909 --> 00:16:04,769 Las colecciones 397 00:16:04,769 --> 00:16:06,830 Sobre las que están iterando 398 00:16:06,830 --> 00:16:09,070 Las bloquean, entonces si dentro 399 00:16:09,070 --> 00:16:10,789 de ese forEach, tú tratas de 400 00:16:10,789 --> 00:16:12,409 modificarla, cambiar su estado 401 00:16:12,409 --> 00:16:14,129 eliminando cosas 402 00:16:14,129 --> 00:16:15,950 pues te va a decir no puedes 403 00:16:15,950 --> 00:16:18,830 ¿vale? luego no podemos 404 00:16:18,830 --> 00:16:20,429 hacer esto así, esto no se puede hacer así 405 00:16:20,429 --> 00:16:22,850 ¿por qué no nos ha dado error antes? 406 00:16:23,549 --> 00:16:24,909 no nos ha dado error antes 407 00:16:24,909 --> 00:16:26,669 porque yo he provocado 408 00:16:26,669 --> 00:16:28,330 un caso de prueba muy particular 409 00:16:28,330 --> 00:16:31,149 que era en el que sólo teníamos estos dos 410 00:16:31,149 --> 00:16:34,309 y he puesto eliminar el último 411 00:16:34,309 --> 00:16:36,009 entonces 412 00:16:36,009 --> 00:16:38,809 en la segunda iteración 413 00:16:38,809 --> 00:16:40,909 el for each de arriba ya ha terminado 414 00:16:40,909 --> 00:16:43,710 entonces ya ha soltado el recurso, ya ha terminado 415 00:16:43,710 --> 00:16:45,870 cuando entra el remove a eliminar 416 00:16:45,870 --> 00:16:47,669 este, el for each de arriba ya había 417 00:16:47,669 --> 00:16:49,529 terminado porque ya esta era 418 00:16:49,529 --> 00:16:50,769 su última iteración 419 00:16:50,769 --> 00:16:53,590 entonces si coincide que el for each 420 00:16:53,590 --> 00:16:55,429 ya ha terminado porque hasta la última 421 00:16:55,429 --> 00:16:57,330 iteración no entra el remove en acción 422 00:16:57,330 --> 00:16:59,649 no pasa nada, pero ese es un 423 00:16:59,649 --> 00:17:00,509 caso muy particular 424 00:17:00,509 --> 00:17:03,750 no es el caso general, yo tengo que poder 425 00:17:03,750 --> 00:17:05,230 borrar de cualquier sitio 426 00:17:05,230 --> 00:17:07,529 luego nunca lo haríamos así 427 00:17:07,529 --> 00:17:09,670 que se hace mucho 428 00:17:09,670 --> 00:17:11,549 y lo hacéis mucho porque a veces cuela 429 00:17:11,549 --> 00:17:12,950 pero no cuela en general 430 00:17:12,950 --> 00:17:15,509 no cuela, esto no está bien hecho por este error 431 00:17:15,509 --> 00:17:17,190 que es difícil de entender 432 00:17:17,190 --> 00:17:19,109 porque se debe a esta cosa tan extraña 433 00:17:19,109 --> 00:17:21,049 se debe a esta cosa tan extraña 434 00:17:21,049 --> 00:17:23,390 y es aquel for each bloquea 435 00:17:23,390 --> 00:17:26,109 esta colección hasta que no ha terminado 436 00:17:26,109 --> 00:17:26,569 con ella 437 00:17:26,569 --> 00:17:29,230 la bloquea para modificaciones 438 00:17:29,230 --> 00:17:31,349 para que otros la modifiquen 439 00:17:31,349 --> 00:17:33,250 no la bloquea para que tú la consultes 440 00:17:33,250 --> 00:17:34,869 o sea yo puedo hacer aquí un system out 441 00:17:34,869 --> 00:17:36,710 de J, de hecho aquí estoy accediendo 442 00:17:36,710 --> 00:17:38,630 para consultar, estoy accediendo 443 00:17:38,630 --> 00:17:41,210 para hacer un getEquipo, aquí no lo ha bloqueado en absoluto 444 00:17:41,210 --> 00:17:42,569 pero es que el remove sí que 445 00:17:42,569 --> 00:17:44,630 modifica la colección, la modifica porque 446 00:17:44,630 --> 00:17:46,710 saca uno, entonces este 447 00:17:46,710 --> 00:17:48,769 bloquea para modificaciones, luego esto no 448 00:17:48,769 --> 00:17:50,769 bueno, pues si 449 00:17:50,769 --> 00:17:52,769 queremos hacer, eliminar jugadores de un equipo 450 00:17:52,769 --> 00:17:54,769 y no podemos hacer esto, porque el forEach 451 00:17:54,769 --> 00:17:56,670 no nos vale, pues ¿qué 452 00:17:56,670 --> 00:17:58,670 tenemos que hacer? pues 453 00:17:58,670 --> 00:18:00,849 iterar de la otra 454 00:18:00,849 --> 00:18:02,789 manera que dijimos que siempre se puede iterar 455 00:18:02,789 --> 00:18:04,630 en las colecciones, que son los iteradores 456 00:18:04,630 --> 00:18:07,710 que de hecho todas las clases colección 457 00:18:07,710 --> 00:18:09,569 implementan iterable 458 00:18:09,569 --> 00:18:11,950 que es la raíz de la jerarquía 459 00:18:11,950 --> 00:18:13,170 implementan iterable 460 00:18:13,170 --> 00:18:15,750 y al implementar iterable 461 00:18:15,750 --> 00:18:18,470 están obligadas a suministrar un método iterador 462 00:18:18,470 --> 00:18:19,569 para sacar un iterador, etc. 463 00:18:20,430 --> 00:18:22,549 Luego esto nunca lo haríamos así 464 00:18:22,549 --> 00:18:38,700 porque el forEach bloquea 465 00:18:38,700 --> 00:18:41,339 la colección 466 00:18:41,339 --> 00:18:45,539 para evitar que sea modificada 467 00:18:45,539 --> 00:18:53,329 Ficada 468 00:18:53,329 --> 00:18:55,869 Hasta que no termine de iterar por ella 469 00:18:55,869 --> 00:18:57,890 Cuando ha terminado de iterar por ella, ya no 470 00:18:57,890 --> 00:19:07,630 ¿Vale? Luego nunca lo haríamos 471 00:19:07,630 --> 00:19:08,250 De esta manera 472 00:19:08,250 --> 00:19:10,150 Así no lo haríamos 473 00:19:10,150 --> 00:19:15,470 Es que no hay for de índice en un conjunto 474 00:19:15,470 --> 00:19:17,230 Claro, no hay for de índice 475 00:19:17,230 --> 00:19:23,460 Claro, vale 476 00:19:23,460 --> 00:19:30,000 Vale, pues entonces, iteraríamos con un iterador 477 00:19:30,000 --> 00:19:33,380 Bueno, pues iterar con un iterador 478 00:19:33,380 --> 00:19:35,680 Ya sabemos que esto funciona 479 00:19:35,680 --> 00:19:50,230 generamos el objeto iterador 480 00:19:50,230 --> 00:19:51,849 uno lo llame como quiera 481 00:19:51,849 --> 00:19:54,470 y este se generaba a través del método 482 00:19:54,470 --> 00:19:56,309 iterator de la colección 483 00:19:56,309 --> 00:20:05,039 vale, cuidado cuando importéis 484 00:20:05,039 --> 00:20:06,559 iterator que es de java útil 485 00:20:06,559 --> 00:20:08,660 estamos hablando de colecciones 486 00:20:08,660 --> 00:20:10,180 luego el paquete java útil 487 00:20:10,180 --> 00:20:12,740 y ahora este iterador tenía dos métodos 488 00:20:12,740 --> 00:20:14,859 con los que trabajábamos, el hash next 489 00:20:14,859 --> 00:20:16,099 para ver si había siguiente 490 00:20:16,099 --> 00:20:18,720 y el next para ya 491 00:20:18,720 --> 00:20:19,839 coger uno en concreto 492 00:20:19,839 --> 00:20:22,960 entonces la forma de trabajar con el iterador 493 00:20:22,960 --> 00:20:24,920 Pues siempre es esta 494 00:20:24,920 --> 00:20:26,400 Mientras tenga un siguiente 495 00:20:26,400 --> 00:20:29,420 Porque el iterador se queda colocado siempre antes del primero 496 00:20:29,420 --> 00:20:30,700 Siempre antes del primero 497 00:20:30,700 --> 00:20:33,720 Pues mientras tenga un siguiente 498 00:20:33,720 --> 00:20:35,779 Pues nos colocamos 499 00:20:35,779 --> 00:20:37,359 En el que toca 500 00:20:37,359 --> 00:20:43,619 Y para colocarnos en él lo hacemos así 501 00:20:43,619 --> 00:20:48,730 Ya estoy en el jugador J 502 00:20:48,730 --> 00:20:49,990 Next 503 00:20:49,990 --> 00:20:51,650 Cada uno 504 00:20:51,650 --> 00:20:53,609 En el siguiente 505 00:20:53,609 --> 00:20:56,630 Ahora, ¿qué queremos hacer con este jugador? 506 00:20:56,630 --> 00:20:58,289 Ver si es uno de los que toca borrar 507 00:20:58,289 --> 00:21:01,170 Si j.get 508 00:21:01,170 --> 00:21:02,150 Equipo 509 00:21:02,150 --> 00:21:04,730 Resulta que es igual 510 00:21:04,730 --> 00:21:09,779 Al equipo de búsqueda 511 00:21:09,779 --> 00:21:11,539 Si este es uno de los que toca borrar 512 00:21:11,539 --> 00:21:13,539 Vale, pues aquí 513 00:21:13,539 --> 00:21:15,220 No hacemos el remove ni hacemos nada 514 00:21:15,220 --> 00:21:17,440 ¿Por qué? Porque iterador nos ofrece precisamente 515 00:21:17,440 --> 00:21:18,140 Un método 516 00:21:18,140 --> 00:21:20,940 Pensado precisamente para esto 517 00:21:20,940 --> 00:21:23,160 Nos ofrece pocos métodos 518 00:21:23,160 --> 00:21:24,539 Están pensados para avanzar 519 00:21:24,539 --> 00:21:26,579 Pues nos ofrece el método remove 520 00:21:26,579 --> 00:21:29,980 el iterador nos ofrece el método remove 521 00:21:29,980 --> 00:21:31,400 que nos dice, oye, borra 522 00:21:31,400 --> 00:21:34,400 en el que estás colocado en ese momento 523 00:21:34,400 --> 00:21:35,660 en el que estás colocado 524 00:21:35,660 --> 00:21:36,920 después de haber hecho el next 525 00:21:36,920 --> 00:21:38,980 ¿en cuál estamos colocado? en este 526 00:21:38,980 --> 00:21:40,279 bórralo 527 00:21:40,279 --> 00:21:43,140 y esto ya el iterador ya está pensado 528 00:21:43,140 --> 00:21:45,200 aquí no hay un for each 529 00:21:45,200 --> 00:21:47,779 está ya coordinado con todo su funcionamiento 530 00:21:47,779 --> 00:21:50,359 para que el iterador se actualice 531 00:21:50,359 --> 00:21:51,920 y ahora ya se actualice 532 00:21:51,920 --> 00:21:53,539 para que su siguiente sea el que toque 533 00:21:53,539 --> 00:21:54,779 esto ya está todo coordinado 534 00:21:54,779 --> 00:21:56,720 aquí no hay varios accediendo a lo mismo 535 00:21:56,720 --> 00:22:01,039 entonces esto ya sí que nos va a funcionar 536 00:22:01,039 --> 00:22:02,440 para cualquier caso de prueba 537 00:22:02,440 --> 00:22:06,519 entonces la forma más genérica de iterar 538 00:22:06,519 --> 00:22:09,079 un iterador que yo saco de aquí 539 00:22:09,079 --> 00:22:12,519 mientras tenga siguiente, cojo el que toque 540 00:22:12,519 --> 00:22:13,720 y hago con él lo que sea 541 00:22:13,720 --> 00:22:17,440 con la ventaja de que si lo que quiero es borrar 542 00:22:17,440 --> 00:22:19,259 pues lo borro así 543 00:22:19,259 --> 00:22:24,519 a través del iterador, no lo borro así 544 00:22:24,519 --> 00:22:33,819 Jolines, que no acierto con la R 545 00:22:33,819 --> 00:22:39,680 ¿Vale? No lo borro así como antes 546 00:22:39,680 --> 00:22:40,880 Borrando este el J 547 00:22:40,880 --> 00:22:44,609 Porque estaríamos en las mismas 548 00:22:44,609 --> 00:22:47,150 Lo borro a través del propio iterador 549 00:22:47,150 --> 00:22:52,519 Así lo borro, así no tengo 550 00:22:52,519 --> 00:22:54,180 Dos recursos accediendo a lo mismo 551 00:22:54,180 --> 00:22:56,839 El remove que accede con un for literador por otro 552 00:22:56,839 --> 00:22:58,759 No, es el propio iterador 553 00:22:58,759 --> 00:22:59,819 El que me lo gestiona todo 554 00:22:59,819 --> 00:23:02,079 ¿Vale? 555 00:23:07,920 --> 00:23:09,680 ¿Vale? Este código entendido 556 00:23:09,680 --> 00:23:10,099 Entonces 557 00:23:10,099 --> 00:23:13,839 Esta es la principal utilidad 558 00:23:13,839 --> 00:23:15,180 del iterador, pues el poder 559 00:23:15,180 --> 00:23:18,059 modificar a la vez 560 00:23:18,059 --> 00:23:19,920 que vas iterando, que no puedes con un 561 00:23:19,920 --> 00:23:20,279 for 562 00:23:20,279 --> 00:23:23,900 entonces si ahora ejecutamos esto con todos 563 00:23:23,900 --> 00:23:25,720 el caso de prueba que antes no nos ha ido 564 00:23:25,720 --> 00:23:27,720 que era este dándole Madrid que tenía 565 00:23:27,720 --> 00:23:29,880 entre medias, pues este sí que nos 566 00:23:29,880 --> 00:23:34,200 los va a borrar, comprobamos 567 00:23:34,200 --> 00:23:36,559 si hay jugadores en un equipo, este, no hay jugadores 568 00:23:36,559 --> 00:23:38,480 si existe un jugador 569 00:23:38,480 --> 00:23:40,660 este, no hay, vamos a eliminar 570 00:23:40,660 --> 00:23:42,140 todos los jugadores de no sé dónde 571 00:23:42,140 --> 00:23:44,380 eliminados, ah no, nombre 572 00:23:44,380 --> 00:23:46,640 Eliminamos jugador, este, vale 573 00:23:46,640 --> 00:23:49,160 Y ahora, esos son los que tenemos 574 00:23:49,160 --> 00:23:51,339 Ahora vamos a eliminar todos los jugadores 575 00:23:51,339 --> 00:23:52,319 De Madrid 576 00:23:52,319 --> 00:23:54,380 Que con la versión anterior 577 00:23:54,380 --> 00:23:57,240 La que nos daba el error de modificación 578 00:23:57,240 --> 00:23:58,400 Ahora con esta versión 579 00:23:58,400 --> 00:24:00,559 No nos da ningún error 580 00:24:00,559 --> 00:24:02,920 Y efectivamente nos los ha eliminado a todos 581 00:24:02,920 --> 00:24:04,960 ¿Vale? Los ha eliminado a todos 582 00:24:04,960 --> 00:24:06,579 Los que había 583 00:24:06,579 --> 00:24:14,609 ¿Vale? 584 00:24:17,029 --> 00:24:18,890 Bueno, pues no os olvidéis del iterador 585 00:24:18,890 --> 00:24:21,329 Más que nada porque es imprescindible 586 00:24:21,329 --> 00:24:23,829 cuando queremos borrar varios 587 00:24:23,829 --> 00:24:25,349 de una colección 588 00:24:25,349 --> 00:24:30,160 es que para un solo dato 589 00:24:30,160 --> 00:24:31,539 tienes el remove 590 00:24:31,539 --> 00:24:34,660 tú le pasas el dato 591 00:24:34,660 --> 00:24:36,819 que quieres borrar, pero completamente caracterizado 592 00:24:36,819 --> 00:24:38,619 el equipo y el número, completamente caracterizado 593 00:24:38,619 --> 00:24:40,019 porque si solamente tienes un dato 594 00:24:40,019 --> 00:24:41,880 no tienes la garantía de que sea solo uno 595 00:24:41,880 --> 00:24:43,500 entonces no lo puedes hacer con el remove 596 00:24:43,500 --> 00:24:44,740 vale 597 00:24:44,740 --> 00:24:48,480 vale, pues esto es un poco, más o menos 598 00:24:48,480 --> 00:24:51,079 en realidad, todos los 599 00:24:51,079 --> 00:24:52,700 vericuetos y detalles 600 00:24:52,700 --> 00:24:54,099 uh, son los dos y cuarto ya 601 00:24:54,099 --> 00:24:56,440 eso se ha pasado tan rápido como a mi 602 00:24:56,440 --> 00:24:59,240 si 603 00:24:59,240 --> 00:25:01,900 estos son un poco todos los 604 00:25:01,900 --> 00:25:03,940 intríngulis del hashet 605 00:25:03,940 --> 00:25:05,079 vale 606 00:25:05,079 --> 00:25:07,200 el linked hashet 607 00:25:07,200 --> 00:25:10,500 podemos cambiar este código 608 00:25:10,500 --> 00:25:11,960 y todo lo que hemos dicho 609 00:25:11,960 --> 00:25:14,140 todo aplica 610 00:25:14,140 --> 00:25:16,579 exactamente igual al linked hashet 611 00:25:16,579 --> 00:25:18,339 es que 612 00:25:18,339 --> 00:25:19,240 exactamente igual 613 00:25:19,240 --> 00:25:21,779 funcionan igual por dentro 614 00:25:21,779 --> 00:25:24,460 igual, bueno con algún matiz que ahora decimos 615 00:25:24,460 --> 00:25:26,660 necesitan hash code equals 616 00:25:26,660 --> 00:25:28,680 porque el linked hash también es una tabla hash 617 00:25:28,680 --> 00:25:30,400 todo lo mismo 618 00:25:30,400 --> 00:25:32,740 si yo quiero eliminar y no puedo hacer el for 619 00:25:32,740 --> 00:25:34,759 y todo igual, todo igual, puedo cambiar el linked 620 00:25:34,759 --> 00:25:36,859 hash set y no he cambiado el programa 621 00:25:36,859 --> 00:25:37,799 es igual 622 00:25:37,799 --> 00:25:40,920 ¿cuál es la única diferencia? que el linked hash set 623 00:25:40,920 --> 00:25:42,960 mete un doble 624 00:25:42,960 --> 00:25:44,500 enlace por dentro, mete 625 00:25:44,500 --> 00:25:46,440 chorraditas para 626 00:25:46,440 --> 00:25:48,880 conservar en la iteración 627 00:25:48,880 --> 00:25:50,740 el mismo orden de la inserción 628 00:25:50,740 --> 00:25:52,900 es lo único que cambia, lo único 629 00:25:52,900 --> 00:25:55,359 entonces si hacemos este programa antes 630 00:25:55,359 --> 00:25:57,259 cuando hemos visto lo que ocurría 631 00:25:57,259 --> 00:25:59,819 no se conservaba el orden de iteración 632 00:25:59,819 --> 00:26:01,460 con el que habíamos metido 633 00:26:01,460 --> 00:26:03,799 no se conservaba, que nos daba igual 634 00:26:03,799 --> 00:26:05,759 con el linked hash set 635 00:26:05,759 --> 00:26:07,819 si ejecutamos 636 00:26:07,819 --> 00:26:09,599 esto, veremos como a la hora de 637 00:26:09,599 --> 00:26:11,339 mostrarlo, el orden 638 00:26:11,339 --> 00:26:13,480 demostrado conserva el que yo he metido 639 00:26:13,480 --> 00:26:15,220 simplemente conserva el orden 640 00:26:15,220 --> 00:26:17,400 por si eso me importa a mi, me interesa 641 00:26:17,400 --> 00:26:18,599 mi aplicación, nada más 642 00:26:18,599 --> 00:26:22,900 vamos a comprobarlo 643 00:26:22,900 --> 00:26:23,339 probarlo. 644 00:26:24,940 --> 00:26:25,259 ¿Veis? 645 00:26:26,619 --> 00:26:27,900 Cambiándolo a linked hash set, 646 00:26:28,440 --> 00:26:30,579 este es el orden en el que yo lo inserté. 647 00:26:31,000 --> 00:26:32,440 Ya está. Es la única diferencia. 648 00:26:33,200 --> 00:26:34,680 Que el funcionamiento por dentro 649 00:26:34,680 --> 00:26:36,240 permite que cuando yo itero, 650 00:26:36,859 --> 00:26:38,319 me lo muestra en el orden en el que inserté. 651 00:26:38,400 --> 00:26:40,400 Si es que eso veo que es útil, porque la aplicación 652 00:26:40,400 --> 00:26:42,400 está haciendo muchas veces recorridos y me gusta ese orden 653 00:26:42,400 --> 00:26:43,259 o lo que sea. Nada más. 654 00:26:44,920 --> 00:26:46,539 Venga, bueno, ahora vale. Ahora sí que lo vamos 655 00:26:46,539 --> 00:26:47,119 a dejar aquí.