1 00:00:00,820 --> 00:00:03,819 vale, aquí está el numerito, pedir un número 2 00:00:03,819 --> 00:00:06,259 y ahora ya uno se plantea 3 00:00:06,259 --> 00:00:06,719 pues venga 4 00:00:06,719 --> 00:00:09,439 eliminar ese 5 00:00:09,439 --> 00:00:10,939 número 6 00:00:10,939 --> 00:00:13,919 y todos sus 7 00:00:13,919 --> 00:00:14,900 divisores 8 00:00:14,900 --> 00:00:22,829 vale, pues entonces 9 00:00:22,829 --> 00:00:24,449 uno puede 10 00:00:24,449 --> 00:00:26,070 funcionar así en plan 11 00:00:26,070 --> 00:00:28,769 puede funcionar así en plan 12 00:00:28,769 --> 00:00:32,409 piloto automático 13 00:00:32,409 --> 00:00:35,109 y hacerlo mal, claro 14 00:00:35,109 --> 00:00:36,890 entonces en plan piloto automático 15 00:00:36,890 --> 00:00:38,090 pues uno funciona diciendo 16 00:00:38,090 --> 00:00:41,289 recorro las listas, el que cumple la condición 17 00:00:41,289 --> 00:00:42,189 me lo ventilo 18 00:00:42,189 --> 00:00:44,670 eso ya funciona en modo automático 19 00:00:44,670 --> 00:00:46,869 entonces, pues eso es lo que he hecho aquí 20 00:00:46,869 --> 00:00:50,640 bueno, el contains 21 00:00:50,640 --> 00:00:52,500 te sirve para ver si un número 22 00:00:52,500 --> 00:00:52,920 está 23 00:00:52,920 --> 00:00:57,520 claro 24 00:00:57,520 --> 00:00:59,939 sí, pero 25 00:00:59,939 --> 00:01:00,920 para los divisores 26 00:01:00,920 --> 00:01:05,689 para los divisores no te vale 27 00:01:05,689 --> 00:01:09,370 para borrar, pides un número 28 00:01:09,370 --> 00:01:11,310 y dices, if contains, remove 29 00:01:11,310 --> 00:01:15,439 vale, entonces 30 00:01:15,439 --> 00:01:17,859 en modo piloto automático 31 00:01:17,859 --> 00:01:19,659 los de atrás 32 00:01:19,659 --> 00:01:22,120 en modo piloto automático 33 00:01:22,120 --> 00:01:23,299 recorremos 34 00:01:23,299 --> 00:01:25,400 si el número cumple la condición 35 00:01:25,400 --> 00:01:27,439 que en este caso el tema es que la condición 36 00:01:27,439 --> 00:01:29,560 es más compleja, si fuera a ser 37 00:01:29,560 --> 00:01:30,719 igual, efectivamente 38 00:01:30,719 --> 00:01:32,680 el contains ya nos dice eso 39 00:01:32,680 --> 00:01:35,519 vale, entonces voy número por 40 00:01:35,519 --> 00:01:37,780 número, si es igual 41 00:01:37,780 --> 00:01:39,260 o 42 00:01:39,260 --> 00:01:40,299 lo divide 43 00:01:40,299 --> 00:01:43,060 ¿vale? si el numerito n 44 00:01:43,060 --> 00:01:44,959 es igual que el que me han dado 45 00:01:44,959 --> 00:01:46,620 o es un divisor suyo 46 00:01:46,620 --> 00:01:48,900 una de estas dos cosas 47 00:01:48,900 --> 00:01:50,079 pues fuera 48 00:01:50,079 --> 00:01:53,760 ¿vale? este es el modo piloto automático 49 00:01:53,760 --> 00:01:55,280 que ya vimos el otro día que esto 50 00:01:55,280 --> 00:01:55,819 no 51 00:01:55,819 --> 00:01:57,959 ¿por qué no? 52 00:01:59,599 --> 00:02:01,400 porque el for each como va 53 00:02:01,400 --> 00:02:02,840 a recorrer esta lista 54 00:02:02,840 --> 00:02:05,400 la bloquea y el remove 55 00:02:05,400 --> 00:02:08,759 entra en ella también para recorrerla 56 00:02:08,759 --> 00:02:10,479 porque ya sabemos que el remove lo que hace es 57 00:02:10,479 --> 00:02:11,919 le damos un objeto 58 00:02:11,919 --> 00:02:14,699 se hace dentro su for 59 00:02:14,699 --> 00:02:16,400 para recorrer la lista 60 00:02:16,400 --> 00:02:18,120 y cuando encuentra 61 00:02:18,120 --> 00:02:20,180 un objeto con este valor 62 00:02:20,180 --> 00:02:21,479 lo borra 63 00:02:21,479 --> 00:02:24,400 entonces, ¿qué ocurre? que cuando este remove 64 00:02:24,400 --> 00:02:26,479 se va adentro a coger 65 00:02:26,479 --> 00:02:27,780 esa lista para recorrerla 66 00:02:27,780 --> 00:02:29,479 el for each la tiene bloqueada 67 00:02:29,479 --> 00:02:32,379 ¿vale? entonces esto parece que está muy bien 68 00:02:32,379 --> 00:02:34,340 pero luego 69 00:02:34,340 --> 00:02:37,479 Por eso tenemos que entender que esta situación concreta no funciona, 70 00:02:38,860 --> 00:02:43,979 que es lo que hicimos el otro día y que a veces le deja a uno desconcertado. 71 00:02:44,979 --> 00:02:55,460 Por ejemplo, vamos a poner el 6, el 3, y el 7. 72 00:02:55,460 --> 00:03:00,300 Vale, entonces 73 00:03:00,300 --> 00:03:13,949 Pues tengo ordenada de forma ascendente 74 00:03:13,949 --> 00:03:15,969 Recorrida al revés 75 00:03:15,969 --> 00:03:17,930 Ordenada de forma descendente 76 00:03:17,930 --> 00:03:19,889 Vale, ahora vamos a introducir un número 77 00:03:19,889 --> 00:03:22,669 Para que borre ese número y todos los divisores 78 00:03:22,669 --> 00:03:24,789 Pues por ejemplo le ponemos el 6 79 00:03:24,789 --> 00:03:27,449 Entonces debería borrar el 6 80 00:03:27,449 --> 00:03:30,069 Y también luego el 3 que es divisor 81 00:03:30,069 --> 00:03:31,330 Vamos a ver 82 00:03:31,330 --> 00:03:37,990 A ver, es que no he buscado un buen ejemplo 83 00:03:37,990 --> 00:03:40,129 Porque lo que yo quiero es que me salga el error 84 00:03:40,129 --> 00:03:42,229 Que sale a veces y a veces no 85 00:03:42,229 --> 00:03:43,289 Que explicamos el otro día 86 00:03:43,289 --> 00:03:45,629 Vamos a 87 00:03:45,629 --> 00:03:50,599 A ver 88 00:03:50,599 --> 00:03:56,590 6, 3 y 2 89 00:03:56,590 --> 00:03:58,090 K 90 00:03:58,090 --> 00:04:01,449 Vale, venga, introduzca número 91 00:04:01,449 --> 00:04:03,969 Pues venga, el 6 92 00:04:03,969 --> 00:04:05,569 Vale, aquí está 93 00:04:05,569 --> 00:04:08,590 Entonces, esto es lo que dijimos el otro día 94 00:04:08,590 --> 00:04:10,270 Que de repente uno hace una prueba 95 00:04:10,270 --> 00:04:12,110 Y dice, ah, me ha funcionado 96 00:04:12,110 --> 00:04:14,870 Vale, pero una prueba te puede haber funcionado 97 00:04:14,870 --> 00:04:15,569 De casualidad 98 00:04:15,569 --> 00:04:18,750 Luego sigues haciendo pruebas y te das cuenta de que no funciona 99 00:04:18,750 --> 00:04:20,089 Bueno, pues 100 00:04:20,089 --> 00:04:22,410 De repente nos puede aparecer este error 101 00:04:22,410 --> 00:04:23,850 Que uno no entiende lo que significa 102 00:04:23,850 --> 00:04:24,970 Ahora ya sí que lo entendemos 103 00:04:24,970 --> 00:04:28,470 Significa, hay un recurso al que intentan acceder 104 00:04:28,470 --> 00:04:29,470 Dos a la vez 105 00:04:29,470 --> 00:04:32,069 Pues es justo lo que está ocurriendo aquí 106 00:04:32,069 --> 00:04:34,850 Dos a la vez 107 00:04:34,850 --> 00:04:37,730 a números 108 00:04:37,730 --> 00:04:40,350 lo está recorriendo el for each 109 00:04:40,350 --> 00:04:42,209 luego lo tiene bloqueado y ahora el remove 110 00:04:42,209 --> 00:04:44,670 entra dentro para recorrerlo 111 00:04:44,670 --> 00:04:45,949 y eliminar n 112 00:04:45,949 --> 00:04:48,449 entonces nos sale este error 113 00:04:48,449 --> 00:04:50,610 cuando no nos salía 114 00:04:50,610 --> 00:04:52,389 cuando coincidía 115 00:04:52,389 --> 00:04:53,870 cuando coincidía 116 00:04:53,870 --> 00:04:56,410 que este remove solo 117 00:04:56,410 --> 00:04:58,550 se ejecutaba para el último 118 00:04:58,550 --> 00:04:59,709 valor, para el último 119 00:04:59,709 --> 00:05:02,569 porque entonces este for each ya ha soltado 120 00:05:02,569 --> 00:05:04,470 el recurso, porque ya ha terminado y lo ha soltado 121 00:05:04,470 --> 00:05:06,410 porque ya es su última iteración 122 00:05:06,410 --> 00:05:08,189 entonces cuando este remove entra 123 00:05:08,189 --> 00:05:10,009 como es la última iteración este ya lo soltó 124 00:05:10,009 --> 00:05:13,029 pues si en ese caso en concreto hemos hecho la prueba 125 00:05:13,029 --> 00:05:15,250 no nos ha dado error y nos creemos que funciona 126 00:05:15,250 --> 00:05:16,250 y no 127 00:05:16,250 --> 00:05:19,129 entonces esta combinación es la peligrosa 128 00:05:19,129 --> 00:05:21,230 entonces un for each 129 00:05:21,230 --> 00:05:22,649 bloquea este recurso 130 00:05:22,649 --> 00:05:24,329 si yo aquí hago cosas 131 00:05:24,329 --> 00:05:26,610 que de nuevo iteran sobre él 132 00:05:26,610 --> 00:05:28,870 como el remove que itera por dentro aunque yo no lo vea 133 00:05:28,870 --> 00:05:29,910 pues 134 00:05:29,910 --> 00:05:31,529 me va a salir esto 135 00:05:31,529 --> 00:05:34,389 por eso decimos 136 00:05:34,389 --> 00:05:36,250 que por sistema y para evitar ese tipo 137 00:05:36,250 --> 00:05:38,110 de problemas, usemos los for each 138 00:05:38,110 --> 00:05:40,170 solo para consultar, no usemos 139 00:05:40,170 --> 00:05:41,970 los for each con cosas dentro aquí 140 00:05:41,970 --> 00:05:44,290 que quieran modificar el recurso 141 00:05:44,290 --> 00:05:45,290 que lo quieran modificar 142 00:05:45,290 --> 00:05:48,170 remove lo va a modificar porque va a eliminar 143 00:05:48,170 --> 00:05:50,110 entonces cuando recorremos 144 00:05:50,110 --> 00:05:51,910 con un for each una colección 145 00:05:51,910 --> 00:05:53,970 no hagamos nada dentro 146 00:05:53,970 --> 00:05:56,089 que modifique la colección, que la 147 00:05:56,089 --> 00:05:56,850 cambie de estado 148 00:05:56,850 --> 00:05:59,990 no hagamos nada dentro que la cambie de estado 149 00:05:59,990 --> 00:06:02,029 porque pueden estar los dos 150 00:06:02,029 --> 00:06:03,290 concurriendo el mismo recurso 151 00:06:03,290 --> 00:06:14,839 Luego esta opción, muy mala, ¿vale? Aunque de casualidad alguna vez funcione. 152 00:06:15,600 --> 00:06:43,899 Entonces, para recorrer y borrar de forma segura, dijimos el iterador, el iterador, pues nos hacemos un iterador, nos hacemos un iterador y ahora ya sí recorríamos con el iterador, como con un for normal. 153 00:06:43,899 --> 00:06:48,339 Claro, porque el remove 154 00:06:48,339 --> 00:06:52,079 El remove tiene dentro a su vez 155 00:06:52,079 --> 00:06:52,839 Otro for 156 00:06:52,839 --> 00:06:54,560 El problema es ese 157 00:06:54,560 --> 00:06:58,220 A ver, con un for de índice 158 00:06:58,220 --> 00:06:59,180 Tienes que tener cuidado 159 00:06:59,180 --> 00:07:01,579 Lo que puedes hacer es entonces borrar por índice 160 00:07:01,579 --> 00:07:02,839 Puedes llamar al remove de ahí 161 00:07:02,839 --> 00:07:05,980 Porque el remove tiene dos versiones 162 00:07:05,980 --> 00:07:06,920 Remove y el objeto 163 00:07:06,920 --> 00:07:08,860 Y ese sí que tiene que hacer un for dentro 164 00:07:08,860 --> 00:07:10,540 Hasta que encuentre un igual 165 00:07:10,540 --> 00:07:12,199 Y luego hay un remove de posición 166 00:07:12,199 --> 00:07:16,139 entonces si tú estás recorriendo con el índice 167 00:07:16,139 --> 00:07:17,060 le puedes pasar 168 00:07:17,060 --> 00:07:19,939 de esta manera 169 00:07:19,939 --> 00:07:21,220 que no sé qué manera es 170 00:07:21,220 --> 00:07:34,329 de esta manera 171 00:07:34,329 --> 00:07:36,350 sí pero ten cuidado 172 00:07:36,350 --> 00:07:38,310 porque al borrar una posición 173 00:07:38,310 --> 00:07:40,449 la lista se acorta luego 174 00:07:40,449 --> 00:07:41,910 entonces cambia 175 00:07:41,910 --> 00:07:44,529 entonces luego aquí se vuelve a evaluar 176 00:07:44,529 --> 00:07:45,569 el número de puntos altos 177 00:07:45,569 --> 00:07:47,149 entonces habría que controlar bien 178 00:07:47,149 --> 00:07:50,350 si hay algún caso de prueba 179 00:07:50,350 --> 00:07:52,050 en el cual estés borrando la última 180 00:07:52,050 --> 00:07:54,490 pero todavía quiere entrar y le salga un loop interception 181 00:07:54,490 --> 00:07:56,250 conclusión, cuando tú quieres 182 00:07:56,250 --> 00:07:57,750 modificar cosas de una lista 183 00:07:57,750 --> 00:08:00,189 evita iterar por ellas en for 184 00:08:00,189 --> 00:08:02,329 ¿vale? en general, cuando tú quieres 185 00:08:02,329 --> 00:08:03,649 hacer acciones de modificación 186 00:08:03,649 --> 00:08:06,470 que esas acciones de modificación 187 00:08:06,470 --> 00:08:07,629 no estén dentro de for 188 00:08:07,629 --> 00:08:09,750 porque te van a complicar un poco la vida 189 00:08:09,750 --> 00:08:11,149 ¿vale? entonces 190 00:08:11,149 --> 00:08:16,810 pero no modificábamos 191 00:08:16,810 --> 00:08:18,370 no hacíamos remove dentro, hacíamos otras cosas 192 00:08:18,370 --> 00:08:20,050 o sea, la primera vez 193 00:08:20,050 --> 00:08:22,209 Que iteramos para borrar dentro 194 00:08:22,209 --> 00:08:23,250 Fue el otro día, el viernes 195 00:08:23,250 --> 00:08:24,769 Que fue cuando contamos todo esto 196 00:08:24,769 --> 00:08:29,160 Recorríamos con for 197 00:08:29,160 --> 00:08:30,000 Pero para mostrar 198 00:08:30,000 --> 00:08:32,759 Simplemente, para mostrar valores 199 00:08:32,759 --> 00:08:34,259 No hacíamos remove dentro 200 00:08:34,259 --> 00:08:35,980 Vale, entonces 201 00:08:35,980 --> 00:08:38,940 La forma más segura de iterar 202 00:08:38,940 --> 00:08:39,840 Es el iterador 203 00:08:39,840 --> 00:08:43,500 Y cuando iteramos con iterador 204 00:08:43,500 --> 00:08:46,529 Pues iteramos así 205 00:08:46,529 --> 00:08:49,629 Nos quedamos con el numerito 206 00:08:49,629 --> 00:08:55,379 y .next 207 00:08:55,379 --> 00:08:56,559 nos quedamos con el numerito 208 00:08:56,559 --> 00:08:59,620 y ahora ya sí, si este numerito 209 00:08:59,620 --> 00:09:00,659 cumple la condición 210 00:09:00,659 --> 00:09:08,460 si este numerito 211 00:09:08,460 --> 00:09:10,179 cumple la condición, entonces 212 00:09:10,179 --> 00:09:12,700 quiero borrar ese numerito 213 00:09:12,700 --> 00:09:14,320 pero lo puedo borrar 214 00:09:14,320 --> 00:09:15,840 a través del iterador 215 00:09:15,840 --> 00:09:18,899 con iterador.remove y esta es la combinación 216 00:09:18,899 --> 00:09:19,259 buena 217 00:09:19,259 --> 00:09:21,860 eso es lo que vimos el otro día, ¿vale? 218 00:09:22,940 --> 00:09:24,259 entonces, ¿cuándo? 219 00:09:27,649 --> 00:09:28,870 entonces, recordad, tenemos 220 00:09:28,870 --> 00:09:29,990 para borrar de una lista 221 00:09:29,990 --> 00:09:32,710 tenemos varias situaciones distintas 222 00:09:32,710 --> 00:09:33,929 yo quiero borrar 223 00:09:33,929 --> 00:09:37,210 un objeto en concreto, ahí no tengo ningún problema 224 00:09:37,210 --> 00:09:38,889 llamo al método remove 225 00:09:38,889 --> 00:09:40,330 remove este objeto y ya está 226 00:09:40,330 --> 00:09:42,490 y me borra ese objeto y ya acabó 227 00:09:42,490 --> 00:09:44,870 ¿vale? pero si yo quiero borrar 228 00:09:44,870 --> 00:09:46,750 un conjunto de objetos que cumplen 229 00:09:46,750 --> 00:09:47,509 una condición 230 00:09:47,509 --> 00:09:50,830 ahí ya sí que tengo que iterar 231 00:09:50,830 --> 00:09:52,789 para ver los que la cumplen e ir borrando 232 00:09:52,789 --> 00:09:54,870 cada uno de ellos, ¿vale? luego son dos cosas 233 00:09:54,870 --> 00:09:56,850 diferentes, borrar un 234 00:09:56,850 --> 00:09:58,889 objeto, remove le paso el objeto, borrado 235 00:09:58,889 --> 00:10:00,929 o borrar una serie de objetos 236 00:10:00,929 --> 00:10:02,990 que cumplen una condición, como es esta, ser igual 237 00:10:02,990 --> 00:10:03,590 o divisor 238 00:10:03,590 --> 00:10:07,009 bueno, pues en este caso tenemos que iterar 239 00:10:07,009 --> 00:10:08,570 para ir borrando los que la cumplen 240 00:10:08,570 --> 00:10:10,889 y entonces, si nos ponemos 241 00:10:10,889 --> 00:10:13,009 a iterar, cuidado, porque la combinación 242 00:10:13,009 --> 00:10:15,210 de un for y dentro 243 00:10:15,210 --> 00:10:17,289 modificar la colección es peligrosa 244 00:10:17,289 --> 00:10:18,990 para algunos casos 245 00:10:18,990 --> 00:10:21,269 de prueba en función de si tocan los extremos o no los tocan 246 00:10:21,269 --> 00:10:23,129 pues si yo quiero iterar 247 00:10:23,129 --> 00:10:25,110 porque lo necesito, para ver 248 00:10:25,110 --> 00:10:26,990 los valores que cumplen una condición 249 00:10:26,990 --> 00:10:29,090 iterar y a la vez ir 250 00:10:29,090 --> 00:10:31,110 borrando, pues esta es la 251 00:10:31,110 --> 00:10:32,330 combinación que cogemos 252 00:10:32,330 --> 00:10:34,769 iteramos con iterador, mientras el 253 00:10:34,769 --> 00:10:36,929 activador tenga siguiente, me cojo 254 00:10:36,929 --> 00:10:38,990 ese siguiente, cumple la condición 255 00:10:38,990 --> 00:10:40,429 cumple la condición 256 00:10:40,429 --> 00:10:43,029 borro, pero borro a través 257 00:10:43,029 --> 00:10:45,129 del iterador, porque esto ya hace 258 00:10:45,129 --> 00:10:46,950 toda la protección de 259 00:10:46,950 --> 00:10:48,610 sincronización que le haga falta a todo 260 00:10:48,610 --> 00:10:51,230 borro a través del iterador, no haría aquí otra vez 261 00:10:51,230 --> 00:10:52,750 número remove.n 262 00:10:52,750 --> 00:10:54,570 porque estarían las mismas, no haría 263 00:10:54,570 --> 00:10:56,490 un error, un punto de emborro a través del iterador. 264 00:10:57,789 --> 00:10:58,730 ¿Vale? Entonces se trata de una situación 265 00:10:58,730 --> 00:11:00,629 muy concreta. Son situaciones concretas. 266 00:11:01,090 --> 00:11:02,610 Yo os trato de acotar para que 267 00:11:02,610 --> 00:11:04,049 no os liéis. Situaciones concretas. 268 00:11:04,850 --> 00:11:06,570 ¿Vale? O sea, lo peligroso en las colecciones es 269 00:11:06,570 --> 00:11:08,710 cuando uno las modifica para eliminar. 270 00:11:10,129 --> 00:11:11,009 Cuando las modifica 271 00:11:11,009 --> 00:11:12,830 para agregar, bueno, te puede 272 00:11:12,830 --> 00:11:14,629 dar un efecto secundario, pero bueno, ahí estás 273 00:11:14,629 --> 00:11:16,710 añadiendo. Cuando las 274 00:11:16,710 --> 00:11:18,809 modifica para eliminar. Son situaciones peligrosas. 275 00:11:19,330 --> 00:11:20,769 Y ahí de nuevo hay dos situaciones. 276 00:11:20,950 --> 00:11:22,649 Repito. Eliminar un objeto 277 00:11:22,649 --> 00:11:24,750 en concreto, facilísimo, remove y fuera 278 00:11:24,750 --> 00:11:25,570 elimino ese objeto 279 00:11:25,570 --> 00:11:28,330 o eliminar varios que cumplen la condición 280 00:11:28,330 --> 00:11:29,769 tengo que iterar, no hay otro 281 00:11:29,769 --> 00:11:32,769 vale, pues entonces cuidado con esta situación 282 00:11:32,769 --> 00:11:33,950 concreta, vale 283 00:11:33,950 --> 00:11:36,370 y luego a uno se le puede haber ocurrido 284 00:11:36,370 --> 00:11:38,309 otra combinación muy inteligente 285 00:11:38,309 --> 00:11:40,169 como la de Miguel, por ejemplo, que es decir 286 00:11:40,169 --> 00:11:42,649 hombre, pues me voy a hacer una lista 287 00:11:42,649 --> 00:11:44,509 primero con todos los 288 00:11:44,509 --> 00:11:46,309 que cumplen la condición y luego le paso 289 00:11:46,309 --> 00:11:47,750 un remove all, por ejemplo 290 00:11:47,750 --> 00:11:50,769 pues yo que sé, la escribimos, por si a alguien le gusta 291 00:11:50,769 --> 00:11:52,590 yo creo que esta es la más fácil 292 00:11:52,590 --> 00:11:56,710 la más rápida y la más corta, pero a uno se le puede haber ocurrido esta otra cosa y no está mal 293 00:11:56,710 --> 00:12:00,929 y así practica con ese método, vamos a hacernos una lista 294 00:12:00,929 --> 00:12:03,950 de elementos para borrar 295 00:12:03,950 --> 00:12:11,559 para borrar, estos van a ser los que quiero yo borrar 296 00:12:11,559 --> 00:12:21,100 y esta lista, vale, pues ahora recorremos la otra 297 00:12:21,100 --> 00:12:28,169 aquí sí que puedo recorrerla cómodamente, porque como no voy a tocarla 298 00:12:28,169 --> 00:12:31,970 voy simplemente a consultarla para copiar en otra 299 00:12:31,970 --> 00:12:34,809 pues entonces aquí podríamos hacer 300 00:12:34,809 --> 00:12:37,230 pues venga, para cada numerito 301 00:12:37,230 --> 00:12:38,870 n en mi lista de números 302 00:12:38,870 --> 00:12:42,700 si n 303 00:12:42,700 --> 00:12:45,000 cumple la condición famosa 304 00:12:45,000 --> 00:12:46,360 que es toda esta 305 00:12:46,360 --> 00:12:50,850 si n cumple la condición famosa 306 00:12:50,850 --> 00:12:52,970 pues n es un candidato 307 00:12:52,970 --> 00:12:54,889 a borrar, pues lo meto en esta lista 308 00:12:54,889 --> 00:12:59,549 ala 309 00:12:59,549 --> 00:13:02,029 entonces la lista de números no la estoy tocando 310 00:13:02,029 --> 00:13:04,169 entonces yo itero con este 311 00:13:04,169 --> 00:13:05,730 porque no la estoy modificando 312 00:13:05,730 --> 00:13:07,210 no estoy borrando nada de ello, no hay problema 313 00:13:07,210 --> 00:13:10,129 la estoy usando para consultar los numeritos 314 00:13:10,129 --> 00:13:11,909 y los que cumplen cierta condición 315 00:13:11,909 --> 00:13:12,509 se van aquí 316 00:13:12,509 --> 00:13:16,190 y ahora ya puedo aprovecharme 317 00:13:16,190 --> 00:13:17,830 del método removeAll 318 00:13:17,830 --> 00:13:19,789 y decir, oye, bórrame a mogollón 319 00:13:19,789 --> 00:13:21,929 bórrame a mogollón 320 00:13:21,929 --> 00:13:22,929 todos esos 321 00:13:22,929 --> 00:13:25,710 todos los que yo te pase aquí 322 00:13:25,710 --> 00:13:28,049 todos estos que yo te pase aquí 323 00:13:28,049 --> 00:13:30,190 todos a mogollón, que hay unos cuantos 324 00:13:30,190 --> 00:13:32,289 un montón, el 7, el 12 325 00:13:32,289 --> 00:13:33,750 todos los que cumplen la condición 326 00:13:33,750 --> 00:13:36,129 los borra todos 327 00:13:36,129 --> 00:13:40,110 y borra todos esos números 328 00:13:40,110 --> 00:13:42,690 y además si alguno de ellos aparece más de una vez 329 00:13:42,690 --> 00:13:44,570 lo borra todas las veces que aparece 330 00:13:44,570 --> 00:13:45,909 que fue lo que comprobamos el otro día 331 00:13:45,909 --> 00:13:48,929 a raíz de la duda esa que surgió 332 00:13:48,929 --> 00:13:51,009 ¿vale? pues bueno, pues otra forma de hacerlo 333 00:13:51,009 --> 00:13:52,950 lo hacéis una lista adicional 334 00:13:52,950 --> 00:13:56,309 aquí lo único es que 335 00:13:56,309 --> 00:13:57,950 se me queda esta lista 336 00:13:57,950 --> 00:13:59,350 ahí para toda la vida 337 00:13:59,350 --> 00:14:01,710 entonces hombre, esto es poco eficiente 338 00:14:01,710 --> 00:14:03,909 imagínate que me toca borrar 339 00:14:03,909 --> 00:14:05,429 15.000 números 340 00:14:05,429 --> 00:14:08,009 me quedo yo aquí con una lista de 15.000 números 341 00:14:08,009 --> 00:14:09,929 durante todo el tiempo en el que el método 342 00:14:09,929 --> 00:14:10,450 esté vivo 343 00:14:10,450 --> 00:14:13,990 no, hasta que no se pierda 344 00:14:13,990 --> 00:14:15,950 la referencia, solo se 345 00:14:15,950 --> 00:14:17,809 borraría si tú haces esto 346 00:14:17,809 --> 00:14:25,059 vale 347 00:14:25,059 --> 00:14:28,120 claro, o sea, si tú haces esto 348 00:14:28,120 --> 00:14:30,039 a borrar igual a null, entonces 349 00:14:30,039 --> 00:14:31,659 toda la lista 350 00:14:31,659 --> 00:14:33,399 que estaba colgando de aquí 351 00:14:33,399 --> 00:14:36,139 se ha quedado sin referencia, sin nadie que le apunte 352 00:14:36,139 --> 00:14:38,179 sin nadie que le apunte 353 00:14:38,179 --> 00:14:40,059 si lo hubieras copiado en otro sitio, no, claro 354 00:14:40,059 --> 00:14:41,240 se ha quedado sin nadie que le apunte 355 00:14:41,240 --> 00:14:43,620 entonces el recorrector de basura 356 00:14:43,620 --> 00:14:44,840 cuando se despierte dirá 357 00:14:44,840 --> 00:14:47,559 uy aquí tengo un montón de datos inaccesibles 358 00:14:47,559 --> 00:14:49,460 el recorrector de basura 359 00:14:49,460 --> 00:14:51,039 borra todo lo que sea inaccesible 360 00:14:51,039 --> 00:14:53,299 o sea poner esto a null no significa 361 00:14:53,299 --> 00:14:55,500 que esa lista que estaba apuntada 362 00:14:55,500 --> 00:14:56,740 desde aquí desaparezca 363 00:14:56,740 --> 00:14:58,559 esa lista se queda ahí 364 00:14:58,559 --> 00:15:01,059 lo que significa es que su referencia 365 00:15:01,059 --> 00:15:02,059 de repente se va a otro lado 366 00:15:02,059 --> 00:15:04,320 y se nos ha quedado ahí una bolsa de números 367 00:15:04,320 --> 00:15:06,639 que no están apuntados por nadie 368 00:15:06,639 --> 00:15:09,340 porque quien les apuntaba se ha ido para allá 369 00:15:09,340 --> 00:15:12,279 entonces, ¿quién se encarga de borrar eso? 370 00:15:12,440 --> 00:15:14,500 pues el demonio que hay ahí rondando 371 00:15:14,500 --> 00:15:15,740 que es el recolector de basura 372 00:15:15,740 --> 00:15:17,240 que de vez en cuando se despierta y dice 373 00:15:17,240 --> 00:15:19,759 uy, aquí tengo datos inaccesibles 374 00:15:19,759 --> 00:15:21,019 con ellos a punta, pues fuera 375 00:15:21,019 --> 00:15:23,899 pero claro, tienes que preocupar 376 00:15:23,899 --> 00:15:25,759 tú de ir dejando 377 00:15:25,759 --> 00:15:27,600 sin referencia 378 00:15:27,600 --> 00:15:28,759 a todos esos datos 379 00:15:28,759 --> 00:15:30,879 de nuevo es una tarea molesta 380 00:15:30,879 --> 00:15:32,820 para el desarrollador, es una tarea molesta 381 00:15:32,820 --> 00:15:36,159 y no solo eso, sino que previamente 382 00:15:36,159 --> 00:15:38,340 has tenido que llenar una lista entera 383 00:15:38,340 --> 00:15:40,799 Entonces, hombre, pues siempre va a ser más cómodo 384 00:15:40,799 --> 00:15:42,139 Y más fácil esto, ¿vale? 385 00:15:42,179 --> 00:15:45,100 Pero esto también, pues tiene su sentido 386 00:15:45,100 --> 00:15:47,179 ¿Vale? 387 00:15:48,980 --> 00:15:50,500 Entonces vamos a ponerlo aquí 388 00:15:50,500 --> 00:16:04,220 ¿Vale? Pues vamos a probarlo 389 00:16:04,220 --> 00:16:06,340 Porque podemos haber escrito alguna tontería 390 00:16:06,340 --> 00:16:09,460 Venga, pues metemos 391 00:16:09,460 --> 00:16:10,159 Uy 392 00:16:10,159 --> 00:16:20,269 Introducimos número 393 00:16:20,269 --> 00:16:21,870 Venga, pues el 2 394 00:16:21,870 --> 00:16:23,690 Vale 395 00:16:23,690 --> 00:16:26,450 Pues se ha eliminado el 2 y sus divisores 396 00:16:26,450 --> 00:16:28,309 Que en realidad solamente es el 1 397 00:16:28,309 --> 00:16:30,509 Ha eliminado el 2 y el 1 398 00:16:30,509 --> 00:16:31,590 Vale 399 00:16:31,590 --> 00:16:34,309 Esto hecho de la otra manera 400 00:16:34,309 --> 00:16:36,789 Habría dado un concurren modification exception 401 00:16:36,789 --> 00:16:39,149 Entonces si uno aquí fuera 402 00:16:39,149 --> 00:16:41,789 Un programador serio 403 00:16:41,789 --> 00:16:44,649 Haría más pruebas 404 00:16:44,649 --> 00:16:46,529 Obviamente 405 00:16:46,529 --> 00:16:49,610 Haría más pruebas 406 00:16:49,610 --> 00:16:51,009 Porque con solo una prueba 407 00:16:51,009 --> 00:16:51,690 Pues hombre 408 00:16:51,690 --> 00:16:55,029 Vale, introducimos un número 409 00:16:55,029 --> 00:16:57,409 venga, el 4, a ver si me elimina los dos 4 410 00:16:57,409 --> 00:16:57,990 y el 1 411 00:16:57,990 --> 00:17:01,649 como ha sido un programador serio 412 00:17:01,649 --> 00:17:02,970 y ha hecho otra prueba 413 00:17:02,970 --> 00:17:05,170 pues ha encontrado 414 00:17:05,170 --> 00:17:07,529 otro bug de su aplicación 415 00:17:07,529 --> 00:17:09,190 que era esperable 416 00:17:09,190 --> 00:17:11,609 ¿de dónde viene? 417 00:17:14,210 --> 00:17:15,509 ¿de dónde intuís que puede venir 418 00:17:15,509 --> 00:17:16,549 este error de aquí? 419 00:17:21,230 --> 00:17:22,450 vamos a mirar el código 420 00:17:22,450 --> 00:17:25,049 ¿cómo hago para bajar eso? 421 00:17:25,049 --> 00:17:25,769 para que no lo veáis 422 00:17:25,769 --> 00:17:29,710 mirad vosotros vuestro código 423 00:17:29,710 --> 00:17:30,369 lo tenéis arriba 424 00:17:30,369 --> 00:17:33,049 ¿cómo? 425 00:17:34,509 --> 00:17:36,250 hay un cero, pero un cero es un número 426 00:17:36,250 --> 00:17:38,529 no me debería dar un error, ¿qué es lo que he hecho mal? 427 00:17:38,630 --> 00:17:39,549 el problema es mi programa 428 00:17:39,549 --> 00:17:41,569 claro 429 00:17:41,569 --> 00:17:44,750 yo no he metido el cero hasta ahora 430 00:17:44,750 --> 00:17:45,990 para obviar eso 431 00:17:45,990 --> 00:17:48,369 que mirad mi programa 432 00:17:48,369 --> 00:17:50,690 cuando comprueba estas condiciones 433 00:17:50,690 --> 00:17:52,670 si el numerito n 434 00:17:52,670 --> 00:17:54,690 de la lista es igual que el que quiero borrar 435 00:17:54,690 --> 00:17:56,410 o lo divide 436 00:17:56,410 --> 00:17:58,210 de forma exacta, es divisor 437 00:17:58,210 --> 00:18:00,890 y para ver si lo divide de forma exacta 438 00:18:00,890 --> 00:18:02,329 él tiene que hacer la división 439 00:18:02,329 --> 00:18:04,869 anda, pues en cuanto un elemento de la lista 440 00:18:04,869 --> 00:18:06,670 sea n y le toque 441 00:18:06,670 --> 00:18:08,089 comprobar, perdón, sea cero 442 00:18:08,089 --> 00:18:10,730 y le toque comprobar si es divisor de otro 443 00:18:10,730 --> 00:18:11,670 esto 444 00:18:11,670 --> 00:18:14,349 me va a dar división por cero 445 00:18:14,349 --> 00:18:16,630 ¿verdad? si yo me voy aquí, justo 446 00:18:16,630 --> 00:18:17,450 se ha ido a esta línea 447 00:18:17,450 --> 00:18:20,150 entonces aquí tengo un bug 448 00:18:20,150 --> 00:18:22,049 como le meta ceros 449 00:18:22,049 --> 00:18:24,650 me va a saltar, porque el cero no es 450 00:18:24,650 --> 00:18:25,509 divisor de nadie 451 00:18:25,509 --> 00:18:30,400 entonces hombre, aquí la modificación sería 452 00:18:30,400 --> 00:18:32,579 si números, y además 453 00:18:32,579 --> 00:18:34,240 tendría que incorporar 454 00:18:34,240 --> 00:18:36,400 y siendo n diferente de 0 455 00:18:36,400 --> 00:18:38,039 o sea, si n es igual a número 456 00:18:38,039 --> 00:18:38,559 o 457 00:18:38,559 --> 00:18:42,299 n, aquí ya entramos en 458 00:18:42,299 --> 00:18:44,440 la famosa tarea del programador 459 00:18:44,440 --> 00:18:45,240 de poner parches 460 00:18:45,240 --> 00:18:48,140 que está muy bien, me refiero que siempre 461 00:18:48,140 --> 00:18:50,339 hay que poner parches en una aplicación 462 00:18:50,339 --> 00:18:52,700 pero cuidado, porque cuando ya los parches son muchos 463 00:18:52,700 --> 00:18:54,240 hay veces que es mejor 464 00:18:54,240 --> 00:18:56,660 tirarla a la basura y rediseñarla 465 00:18:56,660 --> 00:18:57,140 de nuevo 466 00:18:57,140 --> 00:19:00,180 eso es lo que pasa con la mayoría de las aplicaciones 467 00:19:00,180 --> 00:19:02,400 uno las empieza 468 00:19:02,400 --> 00:19:04,259 con su equipo de trabajo 469 00:19:04,259 --> 00:19:06,740 ya está, está con ella unos meses 470 00:19:06,740 --> 00:19:08,799 la saca a producción, la aplicación estupenda 471 00:19:08,799 --> 00:19:10,799 a partir de ahí entra ya la fase de mantenimiento 472 00:19:10,799 --> 00:19:12,039 en la fase de mantenimiento 473 00:19:12,039 --> 00:19:14,740 pues se van incorporando, de repente se detecta un error 474 00:19:14,740 --> 00:19:17,140 vale, de repente el cliente te pide otra cosa 475 00:19:17,140 --> 00:19:18,140 pues bueno 476 00:19:18,140 --> 00:19:20,119 empiezan los meses 477 00:19:20,119 --> 00:19:22,980 se le van a dar un parche, otro parche, otro parche 478 00:19:22,980 --> 00:19:24,519 hasta que llega alguien y diga 479 00:19:24,519 --> 00:19:26,299 a ver, esto no, y al final 480 00:19:26,299 --> 00:19:28,140 la aplicación a la basura 481 00:19:28,140 --> 00:19:29,859 y vamos a rediseñarla desde el principio 482 00:19:29,859 --> 00:19:32,180 porque ya tanto parche ha perdido 483 00:19:32,180 --> 00:19:34,079 su... bueno vamos a poner 484 00:19:34,079 --> 00:19:35,539 aquí este parchecito que es 485 00:19:35,539 --> 00:19:38,240 si n es diferente de 0 486 00:19:38,240 --> 00:19:39,559 y 487 00:19:39,559 --> 00:19:42,380 siendo diferente de 0 488 00:19:42,380 --> 00:19:44,220 no ha sido 489 00:19:44,220 --> 00:19:44,960 un parche tan grande 490 00:19:44,960 --> 00:19:47,779 entonces aquí la condición la hemos puesto 491 00:19:47,779 --> 00:19:50,000 y aquí que pasa que me falta algún 492 00:19:50,000 --> 00:19:52,539 ah si que me falta un paréntesis 493 00:19:52,539 --> 00:19:53,539 este 494 00:19:53,539 --> 00:19:56,400 la condición para ver si n 495 00:19:56,400 --> 00:19:58,599 es igual que el numerito 496 00:19:58,599 --> 00:20:00,359 Que yo he leído por teclado 497 00:20:00,359 --> 00:20:01,180 O divisores 498 00:20:01,180 --> 00:20:03,420 Si n es igual que el número, está claro 499 00:20:03,420 --> 00:20:06,140 O si siendo n diferente de 0 500 00:20:06,140 --> 00:20:07,819 Siendo n diferente de 0 501 00:20:07,819 --> 00:20:09,519 Además divide a n 502 00:20:09,519 --> 00:20:11,119 Ahora ya sí 503 00:20:11,119 --> 00:20:14,200 Ahora ya con este parchecillo 504 00:20:14,200 --> 00:20:18,380 Ya no debería 505 00:20:18,380 --> 00:20:20,440 Salirme 506 00:20:20,440 --> 00:20:22,660 Este error 507 00:20:22,660 --> 00:20:25,670 G 508 00:20:25,670 --> 00:20:27,910 Vale, entonces 509 00:20:27,910 --> 00:20:28,970 Si introduzca número 510 00:20:28,970 --> 00:20:30,450 Pues el 3 511 00:20:30,450 --> 00:20:33,529 Uh, que he hecho mal 512 00:20:33,529 --> 00:20:35,369 ¿Dónde sigo dividiendo por cero? 513 00:20:35,430 --> 00:20:36,609 Ah, es que he hecho lo mismo dos veces 514 00:20:36,609 --> 00:20:39,369 Claro, porque como lo he hecho lo mismo de las dos maneras 515 00:20:39,369 --> 00:20:40,809 De esta y de la otra 516 00:20:40,809 --> 00:20:42,670 Tengo que poner el parche en los dos sitios 517 00:20:42,670 --> 00:20:44,190 ¿Vale? 518 00:20:44,769 --> 00:20:46,049 Entonces este parchecillo 519 00:20:46,049 --> 00:20:50,579 Como lo he hecho de dos formas 520 00:20:50,579 --> 00:20:51,440 Otra forma 521 00:20:51,440 --> 00:20:54,400 Pues este parchecillo tiene que ir aquí también 522 00:20:54,400 --> 00:20:57,700 Vale, y ya está, ¿no? 523 00:20:57,700 --> 00:20:58,220 Ya está 524 00:20:58,220 --> 00:21:07,309 5, 0, 4, 1 525 00:21:07,309 --> 00:21:10,329 G, vale, vamos a 526 00:21:10,329 --> 00:21:11,569 4 527 00:21:11,569 --> 00:21:14,710 ahora ya sí, ha eliminado el 4 y el 1 528 00:21:14,710 --> 00:21:16,769 el 0 lo ignora 529 00:21:16,769 --> 00:21:17,710 no es divisor de nadie 530 00:21:17,710 --> 00:21:24,140 vale 531 00:21:24,140 --> 00:21:29,400 bueno, pues de cualquier ejercicio 532 00:21:29,400 --> 00:21:30,460 aunque sea pequeñito 533 00:21:30,460 --> 00:21:33,299 porque este no involucra ni otras clases 534 00:21:33,299 --> 00:21:34,660 ni involucra nada de cualquiera 535 00:21:34,660 --> 00:21:37,720 se sacan un montón de cosas 536 00:21:37,720 --> 00:21:39,660 de cualquiera se sacan un montón de cosas 537 00:21:39,660 --> 00:21:41,680 de matices, entonces cualquier cosa 538 00:21:41,680 --> 00:21:43,599 que uno haga, está estudiando 539 00:21:43,599 --> 00:21:47,119 Le voy a pedir a chat.gpt cualquier enunciado 540 00:21:47,119 --> 00:21:48,900 Ponme un ejercicio chorra de programación 541 00:21:48,900 --> 00:21:50,039 Un enunciado chorrita 542 00:21:50,039 --> 00:21:52,519 Que pues de cualquier cosa 543 00:21:52,519 --> 00:21:54,819 Uno ya saca un montón de 544 00:21:54,819 --> 00:21:56,099 De 545 00:21:56,099 --> 00:21:58,579 De matices, de cosas 546 00:21:58,579 --> 00:22:01,039 Que repasar, etc 547 00:22:01,039 --> 00:22:02,279 ¿Vale? 548 00:22:07,970 --> 00:22:10,369 Vamos a ver que enunciado nos propone 549 00:22:10,369 --> 00:22:13,630 El Menda este 550 00:22:13,630 --> 00:22:35,980 Ay, que Menda 551 00:22:35,980 --> 00:22:42,400 Ay, tengo que ir donde está 552 00:22:42,400 --> 00:22:43,960 el chico que está en el examen. 553 00:22:44,079 --> 00:22:45,980 Bueno, da igual, era solamente para ver 554 00:22:45,980 --> 00:22:47,759 si nos daba algún enunciado interesante. 555 00:22:49,279 --> 00:22:49,759 Venga, pues vamos a ver.