1 00:00:00,000 --> 00:00:03,040 Pues efectivamente 2 00:00:03,040 --> 00:00:04,980 Muy bien traída a colación la pregunta 3 00:00:04,980 --> 00:00:06,500 Porque nosotros 4 00:00:06,500 --> 00:00:08,839 Hemos usado aquí el remove 5 00:00:08,839 --> 00:00:10,339 Alegremente 6 00:00:10,339 --> 00:00:12,539 Asumiendo que lo que el hashed va a hacer 7 00:00:12,539 --> 00:00:14,759 Va a ser buscar el que sea 8 00:00:14,759 --> 00:00:16,359 Igual a este y borrarlo 9 00:00:16,359 --> 00:00:18,820 Pero hemos dicho el igual a 10 00:00:18,820 --> 00:00:19,660 Así 11 00:00:19,660 --> 00:00:22,859 Muy alegremente, sobre la marcha 12 00:00:22,859 --> 00:00:24,100 Claro, la pregunta es 13 00:00:24,100 --> 00:00:26,719 ¿Para el hashed significa igual a 14 00:00:26,719 --> 00:00:28,199 Lo mismo que para nosotros? 15 00:00:28,199 --> 00:00:30,719 Bueno, pues en este caso sí 16 00:00:30,719 --> 00:00:32,479 Porque es que estamos hablando de string 17 00:00:32,479 --> 00:00:34,340 Y el criterio de igualdad en string 18 00:00:34,340 --> 00:00:36,460 Es que ya está 19 00:00:36,460 --> 00:00:37,780 Entonces 20 00:00:37,780 --> 00:00:40,500 Es decir, string 21 00:00:40,500 --> 00:00:42,859 Ya tiene implementado lo que hashed 22 00:00:42,859 --> 00:00:44,359 Necesita para hacer la igualdad 23 00:00:44,359 --> 00:00:46,079 ¿Y qué es lo que necesita? 24 00:00:46,420 --> 00:00:48,939 La sucesión de hashcode e equals, las dos 25 00:00:48,939 --> 00:00:50,920 Entonces si abrimos 26 00:00:50,920 --> 00:00:51,420 String 27 00:00:51,420 --> 00:00:55,929 La clase string 28 00:00:55,929 --> 00:00:57,609 Pues tiene aquí 29 00:00:57,609 --> 00:01:05,739 ¿Veis? La clase string 30 00:01:05,739 --> 00:01:07,439 Esta es la clase string 31 00:01:07,439 --> 00:01:09,819 ¿El qué? 32 00:01:12,180 --> 00:01:13,599 Ah, control F 33 00:01:13,599 --> 00:01:16,219 Y me sale la ventanita esta 34 00:01:16,219 --> 00:01:18,200 Tiene este método 35 00:01:18,200 --> 00:01:20,180 Sobrescrito, la clase string 36 00:01:20,180 --> 00:01:22,239 Lo tiene aquí sobrescrito 37 00:01:22,239 --> 00:01:23,239 Miraos que mono es 38 00:01:23,239 --> 00:01:26,040 Lo tiene aquí, no lo hemos tenido que hacer nosotros 39 00:01:26,040 --> 00:01:28,200 Y también tiene el equals 40 00:01:28,200 --> 00:01:34,680 Equals 41 00:01:34,680 --> 00:01:36,159 que no me lo 42 00:01:36,159 --> 00:01:41,239 que que hambre 43 00:01:41,239 --> 00:01:42,579 que quieres decir con eso 44 00:01:42,579 --> 00:01:53,480 más 45 00:01:53,480 --> 00:01:56,890 una pregunta 46 00:01:56,890 --> 00:01:59,010 con código del hash 47 00:01:59,010 --> 00:02:00,950 pero harías un código 48 00:02:00,950 --> 00:02:01,870 identificador 49 00:02:01,870 --> 00:02:03,689 a ver 50 00:02:03,689 --> 00:02:05,469 si 51 00:02:05,469 --> 00:02:08,689 bueno a saber 52 00:02:08,689 --> 00:02:10,909 donde está el equals aquí pero a ver todos sabemos 53 00:02:10,909 --> 00:02:13,150 que string tiene el equals 54 00:02:13,150 --> 00:02:15,409 implementado que va por igualdad de caracteres 55 00:02:15,409 --> 00:02:16,849 vale, pero que ocurre 56 00:02:16,849 --> 00:02:19,069 efectivamente cuando tenemos nuestra propia clase 57 00:02:19,069 --> 00:02:22,389 pues vamos a hacernos nuestra clase 58 00:02:22,389 --> 00:02:24,629 nos vamos a hacer 59 00:02:24,629 --> 00:02:26,750 nuestra clase 60 00:02:26,750 --> 00:02:28,870 alumno, para variar 61 00:02:28,870 --> 00:02:32,810 ahora ya 62 00:02:32,810 --> 00:02:34,469 nuestro haset va a ser de alumnos 63 00:02:34,469 --> 00:02:37,009 nuestro haset va a ser de alumnos que tiene 64 00:02:37,009 --> 00:02:40,009 un if 65 00:02:40,009 --> 00:02:44,840 Y una nota 66 00:02:44,840 --> 00:02:46,560 Por ejemplo, ya está 67 00:02:46,560 --> 00:02:47,560 Tiene esto 68 00:02:47,560 --> 00:02:57,110 Vale, pues ahora vamos a trabajar 69 00:02:57,110 --> 00:02:58,689 No con string, sino con alumnos 70 00:02:58,689 --> 00:03:00,370 ¿Vale? Le voy a poner un constructor 71 00:03:00,370 --> 00:03:01,949 Para que me sea luego más fácil 72 00:03:01,949 --> 00:03:08,460 ¡Hala! 73 00:03:11,099 --> 00:03:12,400 Ahí tengo mi clase alumno 74 00:03:12,400 --> 00:03:14,819 Pues venga, vamos a hacer ahora 75 00:03:14,819 --> 00:03:16,039 Nuestro 76 00:03:16,039 --> 00:03:21,060 Ejemplito 77 00:03:21,060 --> 00:03:23,840 Con alumnos 78 00:03:23,840 --> 00:03:39,669 Pues venga, nos vamos a hacer un set de alumnos 79 00:03:39,669 --> 00:03:41,409 Ya no de stream 80 00:03:41,409 --> 00:03:45,689 De alumnos 81 00:03:45,689 --> 00:03:50,270 No, en el mismo main 82 00:03:50,270 --> 00:03:51,449 Me estoy haciendo otro 83 00:03:51,449 --> 00:03:53,409 Método para hacer 84 00:03:53,409 --> 00:03:54,889 Para llamarlo en el 85 00:03:54,889 --> 00:03:55,469 Para 86 00:03:55,469 --> 00:03:57,849 Sí, alumno 87 00:03:57,849 --> 00:04:00,469 He hecho esta clase que acabo de crear 88 00:04:00,469 --> 00:04:03,409 Y ahora en mi mismo main voy a hacer las pruebas ahora con alumnos 89 00:04:03,449 --> 00:04:04,169 En otro método 90 00:04:04,169 --> 00:04:07,729 Vale, aquí tenía este, pues en otro método voy a hacer las pruebas 91 00:04:07,729 --> 00:04:08,310 Con alumno 92 00:04:08,310 --> 00:04:09,889 Vale 93 00:04:09,889 --> 00:04:12,370 Ala 94 00:04:12,370 --> 00:04:15,289 Pues venga, vamos a añadir un nuevo alumno 95 00:04:15,289 --> 00:04:16,930 Alumnos.ad 96 00:04:16,930 --> 00:04:19,709 Un new alumno 97 00:04:19,709 --> 00:04:22,889 Con nifun234 98 00:04:23,930 --> 00:04:25,970 Y nota 7 99 00:04:25,970 --> 00:04:30,019 Y vamos a añadir otro más 100 00:04:30,019 --> 00:04:40,420 5, 6, 7, 8 101 00:04:40,420 --> 00:04:42,319 Y nota 7 102 00:04:42,319 --> 00:04:42,699 También 103 00:04:42,699 --> 00:04:49,899 Bien, vale. Voy a poner un toString en alumno para que a la hora de recorrerlo no sea más fácil ver lo que tiene. 104 00:04:50,459 --> 00:04:57,319 Vale, le voy a añadir un toString aquí con nif y nota. 105 00:04:58,040 --> 00:04:59,459 Ahora, ya tengo ahí el toString. 106 00:05:01,019 --> 00:05:06,490 Vale, pues entonces vamos a recorrer a ver lo que tiene. 107 00:05:14,600 --> 00:05:18,019 No, nif y nota. Y ya está, nif y nota. 108 00:05:23,360 --> 00:05:25,100 vale, pues que he hecho 109 00:05:25,100 --> 00:05:27,160 he metido dos alumnos 110 00:05:27,160 --> 00:05:29,120 y voy a mostrar a ver si en la colección 111 00:05:29,120 --> 00:05:30,379 están realmente o no están 112 00:05:30,379 --> 00:05:32,120 bueno, voy ahora a llamar este 113 00:05:32,120 --> 00:05:34,779 que es en el que tengo las pruebas, desde mi main 114 00:05:34,779 --> 00:05:39,230 y este anterior 115 00:05:39,230 --> 00:05:40,930 en el que he hecho las pruebas de antes 116 00:05:40,930 --> 00:05:42,649 lo comento, para no estar ahí 117 00:05:42,649 --> 00:05:44,370 volviéndome loca 118 00:05:44,370 --> 00:05:47,370 vale, y si me había olvidado el static, seguro 119 00:05:47,370 --> 00:05:52,860 vale, pues venga 120 00:05:52,860 --> 00:05:53,980 vamos a ejecutar esto 121 00:05:53,980 --> 00:05:56,579 aquí tengo yo 122 00:05:56,579 --> 00:05:58,240 los dos alumnos, estupendamente 123 00:05:58,240 --> 00:06:00,720 Bueno, pues ahora 124 00:06:00,720 --> 00:06:02,899 El de secretaría 125 00:06:02,899 --> 00:06:04,839 Que está ahí metiendo los alumnos 126 00:06:04,839 --> 00:06:06,720 Cargándolos para luego pasar en lista 127 00:06:06,720 --> 00:06:08,319 A los profes o para hacer lo que sea 128 00:06:08,319 --> 00:06:10,699 Pues como le han llamado y le han distraído 129 00:06:10,699 --> 00:06:13,240 Vuelve a meter al mismo alumno otra vez 130 00:06:13,240 --> 00:06:17,060 Y vuelve a meter 131 00:06:17,060 --> 00:06:17,980 Otra vez a este 132 00:06:17,980 --> 00:06:29,040 Vale, pues vamos a volver a recorrer la colección 133 00:06:29,040 --> 00:06:30,360 A ver después de su error 134 00:06:30,360 --> 00:06:32,060 De haberlo metido por segunda vez 135 00:06:32,060 --> 00:06:33,740 En una aplicación 136 00:06:33,740 --> 00:06:36,759 En la que yo tengo claro que no quiero duplicados 137 00:06:36,759 --> 00:06:38,480 Por eso he elegido esta colección 138 00:06:38,480 --> 00:06:39,860 Etcétera, etcétera 139 00:06:39,860 --> 00:06:41,379 Pues a ver qué pasa 140 00:06:41,379 --> 00:06:43,620 Vale 141 00:06:43,620 --> 00:06:45,180 Lo ejecutamos 142 00:06:45,180 --> 00:06:46,800 Y 143 00:06:46,800 --> 00:06:52,220 Ah, bueno, este es el primer for 144 00:06:52,220 --> 00:06:54,079 Y este es el segundo for 145 00:06:54,079 --> 00:06:56,060 Entonces mi primer for es este 146 00:06:56,060 --> 00:06:58,720 Los dos primeros alumnos 147 00:06:58,720 --> 00:07:00,759 Y ahora 148 00:07:00,759 --> 00:07:03,699 He metido el otro alumno 149 00:07:03,699 --> 00:07:05,439 Y me aparece aquí tan ricamente 150 00:07:05,439 --> 00:07:07,060 Vale 151 00:07:07,060 --> 00:07:09,120 entonces, mal 152 00:07:09,120 --> 00:07:11,500 ¿vale? que mal diseñada 153 00:07:11,500 --> 00:07:13,519 está esta aplicación, que si yo me echo 154 00:07:13,519 --> 00:07:15,480 todo este compendio 155 00:07:15,480 --> 00:07:16,339 de lecciones 156 00:07:16,339 --> 00:07:19,279 para asegurarme de que no hay duplicados 157 00:07:19,279 --> 00:07:20,860 pues me está metiendo los duplicados 158 00:07:20,860 --> 00:07:23,439 claro, pero es que ya sabemos como funciona 159 00:07:23,439 --> 00:07:24,500 el hashSet por dentro 160 00:07:24,500 --> 00:07:27,399 para él, ser igual 161 00:07:27,399 --> 00:07:29,579 significa que la sucesión 162 00:07:29,579 --> 00:07:31,120 de hashCode e equals 163 00:07:31,120 --> 00:07:32,899 te dé true 164 00:07:32,899 --> 00:07:35,339 ¿vale? entonces 165 00:07:35,339 --> 00:07:37,680 newAlumno12347 166 00:07:37,680 --> 00:07:39,980 y newAlumno12347 167 00:07:39,980 --> 00:07:43,540 ¿qué hashCodeEquals 168 00:07:43,540 --> 00:07:45,019 utiliza? el de object 169 00:07:45,019 --> 00:07:47,420 porque alumno yo no le he hecho hashCodeEquals 170 00:07:47,420 --> 00:07:48,319 no le he hecho hashCode 171 00:07:48,319 --> 00:07:51,540 entonces como alumno yo no le he hecho hashCodeEquals 172 00:07:51,540 --> 00:07:53,240 hashSet utiliza el de object 173 00:07:53,240 --> 00:07:55,160 y el de object te dice 174 00:07:55,160 --> 00:07:57,079 que dos objetos son iguales 175 00:07:57,079 --> 00:07:58,519 única y exclusivamente 176 00:07:58,519 --> 00:08:01,399 es decir, te va a devolver 177 00:08:01,399 --> 00:08:03,100 true la sucesión de hashCodeEquals 178 00:08:03,100 --> 00:08:05,399 solo si son la misma 179 00:08:05,399 --> 00:08:06,980 una dirección de memoria solo. 180 00:08:07,660 --> 00:08:09,920 Y es evidente que este es un objeto 181 00:08:09,920 --> 00:08:11,699 que se habrá colocado en la dirección de memoria que sea. 182 00:08:12,060 --> 00:08:13,240 No nos da igual, lo hemos perdido. 183 00:08:14,019 --> 00:08:15,160 No es que lo hayamos perdido, 184 00:08:15,240 --> 00:08:16,240 se ha metido ahí en la colección. 185 00:08:17,300 --> 00:08:18,959 Y este es otra instancia 186 00:08:18,959 --> 00:08:20,759 con las mismas propiedades, sí, 187 00:08:21,139 --> 00:08:22,040 pero es otra instancia. 188 00:08:22,680 --> 00:08:24,920 Esto es una instancia y esto es otra instancia. 189 00:08:24,920 --> 00:08:27,519 Dos objetos distintos, en diferentes posiciones, 190 00:08:27,699 --> 00:08:28,540 una instancia y otra. 191 00:08:29,779 --> 00:08:31,980 Los mismos valores por dentro, por supuesto, 192 00:08:32,100 --> 00:08:33,779 los mismos valores, pero dos instancias. 193 00:08:33,779 --> 00:08:36,019 con lo cual el hashCodeEquals 194 00:08:36,019 --> 00:08:38,059 de object me va a decir que son distintos 195 00:08:38,059 --> 00:08:40,000 luego para mi set 196 00:08:40,000 --> 00:08:42,279 dice que quieres añadirlo 197 00:08:42,279 --> 00:08:44,059 no pasa nada si es distinto al anterior 198 00:08:44,059 --> 00:08:45,320 lo añade 199 00:08:45,320 --> 00:08:48,460 pero claro, esto no tiene sentido real 200 00:08:48,460 --> 00:08:50,039 esto no tiene sentido 201 00:08:50,039 --> 00:08:51,860 las aplicaciones son para 202 00:08:51,860 --> 00:08:53,899 ayudarnos en la vida 203 00:08:53,899 --> 00:08:55,820 no para hacer cosas por libre 204 00:08:55,820 --> 00:08:56,740 por su cuenta 205 00:08:56,740 --> 00:08:59,759 claro, porque lo que nos ha faltado es 206 00:08:59,759 --> 00:09:02,139 perdona, que yo voy a usar un hashSet 207 00:09:02,139 --> 00:09:04,679 pues entonces que no se me olvide 208 00:09:04,679 --> 00:09:06,919 por nada del mundo si voy a hacer un hash set 209 00:09:06,919 --> 00:09:08,620 irme a 210 00:09:08,620 --> 00:09:10,820 alumno y poner el hash code 211 00:09:10,820 --> 00:09:12,759 e equals, por el parámetro 212 00:09:12,759 --> 00:09:14,740 que yo quiera o por los que yo quiera 213 00:09:14,740 --> 00:09:16,879 en alumno que me marca 214 00:09:16,879 --> 00:09:18,259 la igualdad, nif 215 00:09:18,259 --> 00:09:20,740 pues entonces si en alumno 216 00:09:20,740 --> 00:09:22,100 me marca la igualdad nif 217 00:09:22,100 --> 00:09:24,759 yo ahora me hago un hash code 218 00:09:24,759 --> 00:09:28,600 e equals, por nif 219 00:09:28,600 --> 00:09:32,200 podría ser por varios campos 220 00:09:32,200 --> 00:09:34,179 si es que la igualdad entre dos objetos 221 00:09:34,179 --> 00:09:36,360 implicara la igualdad de varios campos 222 00:09:36,360 --> 00:09:37,340 simultáneamente 223 00:09:37,340 --> 00:09:39,860 pero en este caso es solo el NIF 224 00:09:39,860 --> 00:09:44,840 pues ya tengo mi Haskell 225 00:09:44,840 --> 00:09:46,080 generado 226 00:09:46,080 --> 00:09:48,440 que luego yo lo puedo cambiar 227 00:09:48,440 --> 00:09:50,419 pero no lo cambiamos, este nos gusta 228 00:09:50,419 --> 00:09:52,440 si entráramos aquí dentro veríamos que bueno 229 00:09:52,440 --> 00:09:54,539 que esto de aquí nos gusta 230 00:09:54,539 --> 00:09:56,259 que hace esto de aquí 231 00:09:56,259 --> 00:09:58,919 y esto de aquí nos gusta y al final me acaba saliendo 232 00:09:58,919 --> 00:10:00,259 un 31 233 00:10:00,259 --> 00:10:02,539 un número mágico que alguna explicación tendrá 234 00:10:02,539 --> 00:10:04,259 podéis entrar a 235 00:10:04,259 --> 00:10:07,240 a indagar 236 00:10:07,240 --> 00:10:08,279 lo que tiene su interés 237 00:10:08,279 --> 00:10:11,120 vale, pero bueno 238 00:10:11,120 --> 00:10:13,200 nosotros 239 00:10:13,200 --> 00:10:14,919 ahora ya sí, hemos hecho un hashCode 240 00:10:14,919 --> 00:10:17,100 equals por nif, pues ahora 241 00:10:17,100 --> 00:10:19,220 ya mi aplicación main, ahora ya 242 00:10:19,220 --> 00:10:20,539 no va a meter a este 243 00:10:20,539 --> 00:10:27,309 no, de nif 244 00:10:27,309 --> 00:10:29,350 solamente, porque la igualdad entre objetos 245 00:10:29,350 --> 00:10:30,370 es igualdad de nif 246 00:10:30,370 --> 00:10:39,799 vale, entonces ahora 247 00:10:39,799 --> 00:10:40,899 si ejecutamos esto 248 00:10:40,899 --> 00:10:43,100 Por ejemplo, voy a ponerle yo aquí 249 00:10:43,100 --> 00:10:44,799 Con otra nota, con un 6 250 00:10:44,799 --> 00:10:47,000 ¿Vale? Este se ha equivocado 251 00:10:47,000 --> 00:10:48,320 El de Secretaría se ha equivocado 252 00:10:48,320 --> 00:10:49,559 Porque la ha llamado, se ha distraído 253 00:10:49,559 --> 00:10:52,299 Y ha vuelto a meter a este alumno con este NIF 254 00:10:52,299 --> 00:10:54,120 Dos veces, luego es el mismo 255 00:10:54,120 --> 00:10:57,159 Pues vamos a ejecutar esto 256 00:10:57,159 --> 00:10:58,919 ¿Vale? 257 00:10:59,940 --> 00:11:01,039 Pues como veis 258 00:11:01,039 --> 00:11:02,559 Lo ha ignorado 259 00:11:02,559 --> 00:11:03,659 No lo ha metido 260 00:11:03,659 --> 00:11:07,100 Directamente lo ha ignorado 261 00:11:07,100 --> 00:11:08,059 Y no lo ha metido 262 00:11:08,059 --> 00:11:11,159 Porque ha visto que ya había uno igual a este 263 00:11:11,159 --> 00:11:12,519 El otro campo ni lo ha mirado 264 00:11:12,519 --> 00:11:14,840 Ha visto que había uno igual a este 265 00:11:14,840 --> 00:11:17,259 Entonces ha comparado a ese nuevo alumno 266 00:11:17,259 --> 00:11:18,539 De esa línea, la 79 267 00:11:18,539 --> 00:11:21,379 Ha comparado el hashcode 268 00:11:21,379 --> 00:11:22,899 Con el hashcode 269 00:11:22,899 --> 00:11:25,240 Claro, lo que ha hecho es 270 00:11:25,240 --> 00:11:27,500 Ha hecho primero hashcode 271 00:11:27,500 --> 00:11:28,500 Y luego equals 272 00:11:28,500 --> 00:11:33,279 De este 273 00:11:33,279 --> 00:11:35,399 Luego hashcode equals de este 274 00:11:35,399 --> 00:11:37,659 Que le da true, son iguales 275 00:11:37,659 --> 00:11:46,169 entonces a ti lo único que tiene que preocupar 276 00:11:46,169 --> 00:11:47,590 a la hora de usarlo es 277 00:11:47,590 --> 00:11:49,029 que en la clase 278 00:11:49,029 --> 00:11:52,149 a la que pertenecen los objetos 279 00:11:52,149 --> 00:11:54,210 de la colección tenga los dos 280 00:11:54,210 --> 00:11:55,830 métodos vuestros, hashCode e equals 281 00:11:55,830 --> 00:11:57,610 y ambos basados 282 00:11:57,610 --> 00:12:00,149 en el parámetro que marca la igualdad 283 00:12:00,149 --> 00:12:02,409 él o los, que podrían ser varios 284 00:12:02,409 --> 00:12:04,350 imaginaos que queremos 285 00:12:04,350 --> 00:12:05,889 que por alguna razón 286 00:12:05,889 --> 00:12:07,029 que no tendría ningún sentido 287 00:12:07,029 --> 00:12:10,070 pero que por alguna razón queremos 288 00:12:10,070 --> 00:12:12,470 que dos alumnos sean iguales 289 00:12:12,470 --> 00:12:14,509 solo si comparten NIF y NOTA 290 00:12:14,509 --> 00:12:16,529 si yo tengo un alumno que se llama Pepe con un 7 291 00:12:16,529 --> 00:12:17,850 y otro Pepe con un 8 292 00:12:17,850 --> 00:12:20,610 mi aplicación tiene que asumir que son distintos 293 00:12:20,610 --> 00:12:22,549 no tendría mucho sentido 294 00:12:22,549 --> 00:12:24,090 pero bueno, imaginaos que queremos eso 295 00:12:24,090 --> 00:12:26,029 por los requisitos de nuestra aplicación 296 00:12:26,029 --> 00:12:28,289 por lo que sea Dios, que esté definida 297 00:12:28,289 --> 00:12:30,370 pues yo podría hacer un hashcode 298 00:12:30,370 --> 00:12:31,529 de equals basado en los dos 299 00:12:31,529 --> 00:12:38,450 basado en los dos, en NIF y NOTA 300 00:12:38,450 --> 00:12:41,190 ala, ya está basado en los dos 301 00:12:41,190 --> 00:12:42,889 el hashcode 302 00:12:42,889 --> 00:12:44,110 está basado en los dos 303 00:12:44,110 --> 00:12:45,610 Y el equals también 304 00:12:45,610 --> 00:12:47,590 Ahora ya 305 00:12:47,590 --> 00:12:49,730 Este sí que lo insertaría 306 00:12:49,730 --> 00:12:51,769 Este sí, porque no es distinta 307 00:12:51,769 --> 00:12:54,490 Entonces ahora este sí lo insertaría 308 00:12:54,490 --> 00:12:56,389 Porque es diferente a este 309 00:12:56,389 --> 00:12:58,669 Si lo ejecutamos 310 00:12:58,669 --> 00:13:02,580 Efectivamente 311 00:13:02,580 --> 00:13:03,580 Lo ha insertado 312 00:13:03,580 --> 00:13:05,799 Porque es distinto al anterior 313 00:13:05,799 --> 00:13:13,470 Bueno, si tú vas entrando dentro 314 00:13:13,470 --> 00:13:15,649 Se acaba generando con esta fórmula 315 00:13:15,649 --> 00:13:16,990 ¿Vale? 316 00:13:17,950 --> 00:13:19,830 A ver hay ciertas 317 00:13:19,830 --> 00:13:21,750 Todo esto de los hash 318 00:13:21,750 --> 00:13:23,710 Tiene una teoría muy grande por debajo 319 00:13:23,710 --> 00:13:25,750 Se supone que se hace para 320 00:13:25,750 --> 00:13:28,529 Hacer clusters 321 00:13:28,529 --> 00:13:30,330 Separar objetos y manejarlos 322 00:13:30,330 --> 00:13:32,590 Tiene un rollo muy grande por debajo 323 00:13:32,590 --> 00:13:34,149 Que uno se puede meter 324 00:13:34,149 --> 00:13:35,669 A jugar con ello 325 00:13:35,669 --> 00:13:36,610 A ver como funciona 326 00:13:36,610 --> 00:13:37,809 Porque es una cosa interesante 327 00:13:37,809 --> 00:13:39,769 Pero nosotros no tenemos tiempo 328 00:13:39,769 --> 00:13:42,169 Y nos interesa el uso de esto 329 00:13:42,169 --> 00:13:42,629 Vale 330 00:13:42,629 --> 00:13:51,259 Vale, entonces bueno 331 00:13:51,259 --> 00:13:55,120 El remove 332 00:13:55,120 --> 00:13:57,600 Pues el remove funciona por igualdad 333 00:13:57,600 --> 00:13:58,980 El contains por igualdad 334 00:13:58,980 --> 00:13:59,860 Vale 335 00:13:59,860 --> 00:14:02,659 Por ejemplo aquí 336 00:14:02,659 --> 00:14:04,340 Si yo hago 337 00:14:04,340 --> 00:14:12,009 Alumnos.contains 338 00:14:12,009 --> 00:14:17,620 NewAlumno 339 00:14:17,620 --> 00:14:24,190 NewAlumno 340 00:14:24,190 --> 00:14:27,669 5, 6, 7, 8 341 00:14:27,669 --> 00:14:33,860 Nota 8 342 00:14:33,860 --> 00:14:34,919 Vale 343 00:14:34,919 --> 00:14:36,559 Contents 344 00:14:36,559 --> 00:14:44,330 Contents 345 00:14:44,330 --> 00:14:45,049 A ver 346 00:14:45,049 --> 00:14:48,629 Ah, perdón 347 00:14:48,629 --> 00:14:49,549 El 8 va aquí 348 00:14:49,549 --> 00:14:52,710 Vale 349 00:14:52,710 --> 00:14:55,070 Por ejemplo 350 00:14:55,070 --> 00:14:57,409 Y aquí 351 00:14:57,409 --> 00:15:11,570 Ah, vale, que me falta uno 352 00:15:11,570 --> 00:15:13,730 Ya está, vale 353 00:15:13,730 --> 00:15:15,149 Por ejemplo 354 00:15:15,149 --> 00:15:17,610 Pues si yo hago contains 355 00:15:17,610 --> 00:15:18,990 Esto funciona igual que listas 356 00:15:18,990 --> 00:15:20,590 Este 357 00:15:20,590 --> 00:15:23,809 Con la aplicación que hemos 358 00:15:23,809 --> 00:15:25,370 Hecho, con el add que hemos hecho arriba 359 00:15:25,370 --> 00:15:26,590 5, 6, 7, 8 360 00:15:26,590 --> 00:15:29,029 Este que me daría, true o false 361 00:15:29,029 --> 00:15:36,740 al final se quedó con los dos 362 00:15:36,740 --> 00:15:38,179 luego si se quedó con los dos 363 00:15:38,179 --> 00:15:39,419 este me daría falso 364 00:15:39,419 --> 00:15:41,340 porque no existe 365 00:15:41,340 --> 00:15:44,100 no hay un alumno igual a este 366 00:15:44,100 --> 00:15:46,039 en la colección, porque la igualdad 367 00:15:46,039 --> 00:15:46,860 es por los dos 368 00:15:46,860 --> 00:15:49,720 el que yo había metido era un 7 369 00:15:49,720 --> 00:15:52,059 entonces esto me daría un falso 370 00:15:52,059 --> 00:15:53,019 lógicamente 371 00:15:53,019 --> 00:15:54,980 no hay un alumno igual a ese 372 00:15:54,980 --> 00:15:57,539 pero si yo hago mi 373 00:15:57,539 --> 00:15:59,940 jasco de equals con un poco más 374 00:15:59,940 --> 00:16:00,860 de sentido real 375 00:16:00,860 --> 00:16:03,360 con un poco más de sentido real 376 00:16:03,360 --> 00:16:12,360 y lo hago solo con nif 377 00:16:12,360 --> 00:16:13,659 que sería el sentido real 378 00:16:13,659 --> 00:16:16,720 pues ahora lógicamente 379 00:16:16,720 --> 00:16:18,700 ahora este 380 00:16:18,700 --> 00:16:20,700 me va a dar true 381 00:16:20,700 --> 00:16:22,419 me va a decir sí, hay un alumno 382 00:16:22,419 --> 00:16:24,799 igual a este en la colección 383 00:16:24,799 --> 00:16:26,320 porque hay un alumno con DNI 384 00:16:26,320 --> 00:16:28,159 5, 6, 7, 8 385 00:16:28,159 --> 00:16:30,419 vale, ahora me da true porque sí 386 00:16:30,419 --> 00:16:31,980 efectivamente hay un alumno igual a ese 387 00:16:31,980 --> 00:16:32,759 con ese DNI 388 00:16:32,759 --> 00:16:37,120 y no hay más 389 00:16:37,120 --> 00:16:40,100 manejar los métodos de añadir 390 00:16:40,100 --> 00:16:42,059 con la particularidad de que 391 00:16:42,059 --> 00:16:44,179 no te va a añadir un duplicado, te lo va a ignorar 392 00:16:44,179 --> 00:16:46,120 al menos te devuelve 393 00:16:46,120 --> 00:16:47,700 false si tú lo quieres comprobar 394 00:16:47,700 --> 00:16:48,940 el método add te devuelve 395 00:16:48,940 --> 00:16:51,480 false o true si 396 00:16:51,480 --> 00:16:53,879 insertó o no, por ejemplo 397 00:16:53,879 --> 00:16:55,820 si yo cada inserción se la paso a un 398 00:16:55,820 --> 00:17:01,169 system out, pues aquí al menos 399 00:17:01,169 --> 00:17:02,529 tengo esa realimentación 400 00:17:02,529 --> 00:17:05,130 en el list, esa realimentación 401 00:17:05,130 --> 00:17:07,190 no la usamos, porque por qué no va a añadir 402 00:17:07,190 --> 00:17:08,730 a una lista, por qué no lo va a añadir 403 00:17:08,730 --> 00:17:11,049 ahí le da igual que haya duplicados, que no haya 404 00:17:11,049 --> 00:17:13,150 pero aquí esa realimentación 405 00:17:13,150 --> 00:17:14,890 si nos importa más, porque si me dice 406 00:17:14,890 --> 00:17:16,990 falso, oye, ¿por qué no añadió? 407 00:17:17,069 --> 00:17:18,789 ah, es que ya tenía uno igual, pues igual 408 00:17:18,789 --> 00:17:21,130 es que he metido mal la nota 409 00:17:21,130 --> 00:17:22,950 ¿vale? 410 00:17:22,970 --> 00:17:26,630 si yo hago esto, ¿veis? 411 00:17:26,690 --> 00:17:28,829 las dos primeras inserciones las pudo hacer 412 00:17:28,829 --> 00:17:30,789 pero la siguiente inserción 413 00:17:30,789 --> 00:17:32,829 no pudo hacerla, no pudo hacerla 414 00:17:32,829 --> 00:17:33,869 porque ya había uno igual 415 00:17:33,869 --> 00:17:38,069 ¿vale? pues el valor de vuelta 416 00:17:38,069 --> 00:17:40,250 nos vale, pues el add no tiene 417 00:17:40,250 --> 00:17:42,670 Más que esto y el add all igual, remove lo mismo 418 00:17:42,670 --> 00:17:44,589 Podemos recorrer con iterador 419 00:17:44,589 --> 00:17:47,029 Para borrar por un criterio 420 00:17:47,029 --> 00:17:48,390 Que no sea la clave primaria 421 00:17:48,390 --> 00:17:50,230 Porque para borrar por clave primaria 422 00:17:50,230 --> 00:17:52,089 Pues me hago yo el remove y tan ricamente 423 00:17:52,089 --> 00:17:53,069 ¿Vale? 424 00:17:53,630 --> 00:17:56,750 ¿Que quiero borrar al alumno este 5, 6, 7, 8? 425 00:17:57,210 --> 00:18:00,759 Pues me hago esto 426 00:18:00,759 --> 00:18:02,640 Y ya está 427 00:18:02,640 --> 00:18:15,799 ¿Vale? 428 00:18:16,599 --> 00:18:18,839 Esto me eliminaría de la colección 429 00:18:18,839 --> 00:18:20,839 El alumno que sea igual a este 430 00:18:20,839 --> 00:18:23,059 Si es que hay alguno igual, si no, no 431 00:18:23,059 --> 00:18:24,359 ¿Vale? 432 00:18:24,779 --> 00:18:27,940 Funciona exactamente igual que en listas 433 00:18:27,940 --> 00:18:28,579 Ya está 434 00:18:28,579 --> 00:18:34,359 Que quiero borrar todos los alumnos 435 00:18:34,359 --> 00:18:36,180 Que han suspendido 436 00:18:36,180 --> 00:18:38,519 Eso no lo puedo hacer con el remove 437 00:18:38,519 --> 00:18:39,319 Así a palo seco 438 00:18:39,319 --> 00:18:41,900 Porque no estoy borrando por criterio de igualdad 439 00:18:41,900 --> 00:18:44,180 El remove si borro por criterio de igualdad 440 00:18:44,180 --> 00:18:45,500 Paso aquí uno igual y ya está 441 00:18:45,500 --> 00:18:47,359 Pero si quiero borrar 442 00:18:47,359 --> 00:18:49,160 Por otro criterio 443 00:18:49,160 --> 00:18:52,279 Borrar suspensos 444 00:18:52,279 --> 00:18:54,099 Pues entonces aquí 445 00:18:54,099 --> 00:18:55,140 Tengo que hacer un iterador 446 00:18:55,140 --> 00:19:00,849 iterator de alumno 447 00:19:00,849 --> 00:19:06,460 alumnos.iterator 448 00:19:06,460 --> 00:19:08,380 y ahora ya el bucle 449 00:19:08,380 --> 00:19:13,390 mientras tenga siguiente 450 00:19:13,390 --> 00:19:18,440 mientras tenga siguiente 451 00:19:18,440 --> 00:19:19,960 me voy a coger aquí al alumno 452 00:19:19,960 --> 00:19:26,440 vale, y ahora 453 00:19:26,440 --> 00:19:29,519 si este alumno resulta que su nota 454 00:19:29,519 --> 00:19:32,859 es menor que 5 455 00:19:32,859 --> 00:19:34,740 pues ala 456 00:19:34,740 --> 00:19:37,420 suspenso, o sea, borrado 457 00:19:37,420 --> 00:19:42,460 vale, pues esto lo haría así 458 00:19:42,460 --> 00:19:43,839 vale 459 00:19:43,839 --> 00:19:47,059 aquí no me queda más remedio 460 00:19:47,059 --> 00:19:48,700 como no puedo, no estoy borrando 461 00:19:48,700 --> 00:19:50,400 por clave primaria, por igualdad 462 00:19:50,400 --> 00:19:52,500 pues tengo que recorrer para encontrar 463 00:19:52,500 --> 00:19:54,359 el que cumple la condición 464 00:19:54,359 --> 00:19:56,019 y el que lo cumpla borro 465 00:19:56,019 --> 00:19:57,980 si en lugar de comiterador pongo un for each 466 00:19:57,980 --> 00:20:00,059 pues ya sabemos que me podría salir el concurren 467 00:20:00,059 --> 00:20:01,599 modificación excepción, pues no 468 00:20:01,599 --> 00:20:03,660 pues lo hacemos así 469 00:20:03,660 --> 00:20:10,259 te dice 470 00:20:10,259 --> 00:20:12,720 si ese iterador 471 00:20:12,720 --> 00:20:14,599 tiene un siguiente al que podría 472 00:20:14,599 --> 00:20:16,740 apuntar. ¿Te devuelve true o false? 473 00:20:16,880 --> 00:20:17,700 Como el link del link. 474 00:20:18,880 --> 00:20:20,259 No, no, no, no. 475 00:20:20,819 --> 00:20:22,839 A ver, tú tienes tu set, que tu set 476 00:20:22,839 --> 00:20:24,880 son un montón de cositas. Este, este 477 00:20:24,880 --> 00:20:26,619 y este y este. Y tú quieres 478 00:20:26,619 --> 00:20:28,940 recorrerlas para ver cosas en ellas. 479 00:20:29,279 --> 00:20:30,819 Pues llamas a un tío y te lo 480 00:20:30,819 --> 00:20:32,960 cuento. Ese tío es el iterador. 481 00:20:33,980 --> 00:20:34,940 Entonces, el iterador 482 00:20:34,940 --> 00:20:36,880 lo primero que hace es ponerse 483 00:20:36,880 --> 00:20:38,900 antes del primero de todos. 484 00:20:38,900 --> 00:20:41,400 entonces el hasnest 485 00:20:41,400 --> 00:20:43,380 te devuelve true o false en función 486 00:20:43,380 --> 00:20:45,500 de si hay un siguiente al que puedo 487 00:20:45,500 --> 00:20:46,059 avanzar 488 00:20:46,059 --> 00:20:49,480 pero no mueve al tío, no mueve al iterador 489 00:20:49,480 --> 00:20:51,519 vale, pues si el hasnest es true 490 00:20:51,519 --> 00:20:53,700 o lo que es lo mismo, hay un siguiente al que puede avanzar 491 00:20:53,700 --> 00:20:55,119 pues avanza 492 00:20:55,119 --> 00:20:57,460 pues el tío ya avanza y se queda 493 00:20:57,460 --> 00:20:59,119 colocado en el primero al que va a mirar 494 00:20:59,119 --> 00:21:01,539 eso lo hace el next, el avanzar 495 00:21:01,539 --> 00:21:03,559 una vez colocado en el que 496 00:21:03,559 --> 00:21:05,700 va a mirar, pues ya te lo devuelve 497 00:21:05,700 --> 00:21:07,619 como retorno o te lo 498 00:21:07,619 --> 00:21:09,839 borra, si tú quieres, le da el empujón y lo tira 499 00:21:09,839 --> 00:21:11,240 lo que tú quieras 500 00:21:11,240 --> 00:21:12,299 ahora 501 00:21:12,299 --> 00:21:15,359 vuelves a llamar al hash net, el hash net te dice 502 00:21:15,359 --> 00:21:17,900 oye, tienes un siguiente al que avanzar, pero no lo avanzas 503 00:21:17,900 --> 00:21:19,140 solamente tienes un siguiente 504 00:21:19,140 --> 00:21:21,599 si es que true tienes un siguiente, si es que false 505 00:21:21,599 --> 00:21:23,940 no, este es el último, no tengo más a los que avanzar 506 00:21:23,940 --> 00:21:25,319 entonces el bucle va a estar ahí 507 00:21:25,319 --> 00:21:26,480 mientras tengas un siguiente 508 00:21:26,480 --> 00:21:29,099 avanzas, te colocas en él 509 00:21:29,099 --> 00:21:31,640 no miras, lo borras, lo que sea 510 00:21:31,640 --> 00:21:32,660 ¿vale? 511 00:21:33,039 --> 00:21:41,440 ¿es una lista limpiada de la propiedad next 512 00:21:41,440 --> 00:21:43,259 que sea diferente del new? 513 00:21:43,440 --> 00:21:45,680 a recorrer una lista linkeada 514 00:21:45,680 --> 00:21:48,319 bueno, sí, pero eso luego 515 00:21:48,319 --> 00:21:50,779 bueno, pero en dos contextos distintos 516 00:21:50,779 --> 00:21:51,960 o sea, en 517 00:21:51,960 --> 00:21:54,339 una linked list 518 00:21:54,339 --> 00:21:56,539 cuando tú la recorres, internamente 519 00:21:56,539 --> 00:21:57,980 él mira si el siguiente es null 520 00:21:57,980 --> 00:21:59,460 pero para ti es transparente 521 00:21:59,460 --> 00:22:01,279 tú la recorres y ella separará 522 00:22:01,279 --> 00:22:03,420 ¿vale? pues aquí igual 523 00:22:03,420 --> 00:22:08,430 bueno 524 00:22:08,430 --> 00:22:10,809 bueno, tú si lo haces tú 525 00:22:10,809 --> 00:22:12,549 claro, lógico 526 00:22:12,549 --> 00:22:14,549 claro, pero es que una lista de algo va a un operador 527 00:22:14,549 --> 00:22:16,410 claro, o sea 528 00:22:16,410 --> 00:22:18,730 Literador es para colecciones en general, ¿vale? 529 00:22:18,730 --> 00:22:20,509 Para colecciones, independientemente de que sean 530 00:22:20,509 --> 00:22:22,650 ArrayList, LinkedList. 531 00:22:23,130 --> 00:22:25,150 Él ya se encarga de ver qué tiene que hacer en cada momento. 532 00:22:25,490 --> 00:22:27,210 Si el literador está asociado a una LinkedList, 533 00:22:27,809 --> 00:22:29,950 pues, lógicamente, Hasnest será ver 534 00:22:29,950 --> 00:22:32,410 si el nodo siguiente apunta a todo o no apunta. 535 00:22:32,910 --> 00:22:34,670 Si el literador está asociado a una ArrayList, 536 00:22:35,089 --> 00:22:37,670 su Hasnest será ver si soy el último del Array. 537 00:22:37,829 --> 00:22:40,869 En cada uno, la lógica del Hasnest será una u otra 538 00:22:40,869 --> 00:22:43,170 en función de si el literador está asociado a un LinkedList, 539 00:22:43,269 --> 00:22:44,809 a un ArrayList, a un set. 540 00:22:44,809 --> 00:22:50,680 vale, pues pocos más 541 00:22:50,680 --> 00:22:52,400 matices tiene el hash set que esto 542 00:22:52,400 --> 00:22:53,140 ya está 543 00:22:53,140 --> 00:22:54,119 es 544 00:22:54,119 --> 00:22:58,119 ser consciente 545 00:22:58,119 --> 00:23:00,920 de que al no tener elementos iguales 546 00:23:00,920 --> 00:23:02,480 eso tiene unas implicaciones 547 00:23:02,480 --> 00:23:04,380 en el funcionamiento, al no admitirlos 548 00:23:04,380 --> 00:23:06,660 como que puedas no estar insertando 549 00:23:06,660 --> 00:23:08,460 lo que crees que estás insertando, nada más 550 00:23:08,460 --> 00:23:10,880 y que para que ese funcionamiento 551 00:23:10,880 --> 00:23:12,380 sea coherente, tiene que estar el hash code 552 00:23:12,380 --> 00:23:13,579 de equals, vale 553 00:23:13,579 --> 00:23:16,039 ya está, si hacemos un set de integer 554 00:23:16,039 --> 00:23:17,920 como un integer ya tiene hash code de equals 555 00:23:17,920 --> 00:23:18,839 Pues no hay que hacer nada 556 00:23:18,839 --> 00:23:24,529 Bueno, pues entonces los ejercicios 557 00:23:24,529 --> 00:23:28,849 Linked has set y tree set 558 00:23:28,849 --> 00:23:31,670 Meten algunas cosas más 559 00:23:31,670 --> 00:23:32,470 Pero bueno, que ya 560 00:23:32,470 --> 00:23:33,829 Bueno, linked has set, ¿no? 561 00:23:34,410 --> 00:23:35,509 Que vemos el próximo día 562 00:23:35,509 --> 00:23:37,930 Entonces en los ejercicios 563 00:23:37,930 --> 00:23:39,670 Pues uno puede usar indistintamente 564 00:23:39,670 --> 00:23:41,230 Set o list 565 00:23:41,230 --> 00:23:42,009 Depende 566 00:23:42,009 --> 00:23:43,190 Si valen para lo mismo 567 00:23:43,190 --> 00:23:44,450 Para guardar un montón de cosas 568 00:23:44,450 --> 00:23:46,329 Un set 569 00:23:46,329 --> 00:23:48,349 Siempre es una opción natural 570 00:23:48,349 --> 00:23:50,650 Si yo no necesito 571 00:23:50,650 --> 00:23:51,490 La posición 572 00:23:51,490 --> 00:23:53,490 Si no la necesito, un set y ya está 573 00:23:53,490 --> 00:23:54,769 Y si no, pues una lista 574 00:23:54,769 --> 00:23:56,170 ¿Vale? 575 00:24:01,500 --> 00:24:03,200 Bueno, pues entonces seguís haciendo 576 00:24:03,200 --> 00:24:05,599 Los ejercicios y ya está 577 00:24:05,599 --> 00:24:07,880 ¿Vale?