1 00:00:03,500 --> 00:00:13,000 Bueno, pues esta era la famosa jerarquía de las colecciones, en las cuales efectivamente aquí nos falta eso de los mapas, nos falta, ¿verdad? 2 00:00:14,019 --> 00:00:31,879 Había una primera interfaz iterable que no ofrece prácticamente ningún método, solamente el de general iterator, de esa heredaba collection, que incorporaba métodos abstractos, porque esto que está en azulito son interfaces. 3 00:00:31,879 --> 00:00:34,679 lo que está en azulito 4 00:00:34,679 --> 00:00:37,140 son clases vacías 5 00:00:37,140 --> 00:00:38,979 o clases abstractas o interfaces 6 00:00:38,979 --> 00:00:40,079 lo que está en azulito 7 00:00:40,079 --> 00:00:41,740 y lo que está en amarillo 8 00:00:41,740 --> 00:00:45,320 esto ya sí que eran clases implementaciones 9 00:00:45,320 --> 00:00:46,280 y implementaciones 10 00:00:46,280 --> 00:00:48,939 entonces en la raíz 11 00:00:48,939 --> 00:00:50,920 de la jerarquía de colecciones estaba esta 12 00:00:50,920 --> 00:00:52,880 interfaz que lo único que 13 00:00:52,880 --> 00:00:55,000 obligaba era a tener un método vacío 14 00:00:55,000 --> 00:00:56,600 iterator para crear un iterador 15 00:00:56,600 --> 00:00:58,600 de ese le daba 16 00:00:58,600 --> 00:01:00,060 collection que además 17 00:01:00,060 --> 00:01:01,960 te incorporaba métodos para 18 00:01:01,960 --> 00:01:04,319 añadir, borrar 19 00:01:04,319 --> 00:01:06,280 y poquito más, entonces cualquiera 20 00:01:06,280 --> 00:01:08,180 que implementaba de aquí tenía que incorporar esos 21 00:01:08,180 --> 00:01:10,340 métodos y luego ya teníamos 22 00:01:10,340 --> 00:01:12,159 las dos grandes 23 00:01:12,159 --> 00:01:12,939 variantes 24 00:01:12,939 --> 00:01:16,239 la de list y la de set 25 00:01:16,239 --> 00:01:18,379 que la de list ya te incorporaba 26 00:01:18,379 --> 00:01:19,920 un chorizo de métodos 27 00:01:19,920 --> 00:01:22,459 para recuperar por posición, etc 28 00:01:22,459 --> 00:01:24,280 y luego serían las implementaciones 29 00:01:24,900 --> 00:01:25,879 ¿vale? 30 00:01:26,879 --> 00:01:28,219 que de list pues ya 31 00:01:28,219 --> 00:01:29,560 sabemos que teníamos estas 32 00:01:29,560 --> 00:01:32,480 ArrayList, LinkedList 33 00:01:32,480 --> 00:01:34,040 y estas dos 34 00:01:34,040 --> 00:01:35,079 antiguas 35 00:01:35,079 --> 00:01:36,480 las 36 00:01:36,480 --> 00:01:39,640 primeras versiones 37 00:01:39,640 --> 00:01:41,840 y luego de Set, pues 38 00:01:41,840 --> 00:01:45,719 estas. Vale, entonces aquí en esta 39 00:01:45,719 --> 00:01:47,920 jerarquía no aparecen los mapas 40 00:01:47,920 --> 00:01:49,980 ¿vale? Porque los mapas 41 00:01:49,980 --> 00:01:51,420 no heredan de aquí, van por libre 42 00:01:51,420 --> 00:01:52,760 Entonces, ¿qué es un mapa? 43 00:01:53,480 --> 00:01:55,799 Dentro del término colecciones, en general 44 00:01:55,799 --> 00:01:57,680 se mete lo de los mapas porque vale 45 00:01:57,680 --> 00:01:58,780 para guardar cosas 46 00:01:58,780 --> 00:02:01,640 entonces en general se interpreta como colecciones 47 00:02:01,640 --> 00:02:03,560 todo lo que vale para guardar objetos 48 00:02:03,560 --> 00:02:06,340 entonces los mapas valen para guardar objetos 49 00:02:06,340 --> 00:02:08,719 pero de una forma un poquito distinta 50 00:02:08,719 --> 00:02:11,599 entonces vale para guardar objetos 51 00:02:11,599 --> 00:02:13,099 pero de una forma un poquito distinta 52 00:02:13,099 --> 00:02:16,120 y por eso no heredan ni de colección 53 00:02:16,120 --> 00:02:17,639 ni de iterator ni de nada 54 00:02:17,639 --> 00:02:19,400 porque funcionan de manera un poco distinta 55 00:02:19,400 --> 00:02:20,039 y van por libre 56 00:02:20,039 --> 00:02:22,479 pero valen también para guardar cosas 57 00:02:22,479 --> 00:02:25,259 bueno pues los mapas 58 00:02:25,259 --> 00:02:26,120 ¿en qué se basan? 59 00:02:26,139 --> 00:02:27,939 los mapas en realidad tienen una jerarquía 60 00:02:27,939 --> 00:02:29,419 Mucho más sencillita 61 00:02:29,419 --> 00:02:30,939 Que es 62 00:02:30,939 --> 00:02:33,180 Esto de aquí, en realidad 63 00:02:33,180 --> 00:02:34,400 ¿Me lo doy? 64 00:02:39,159 --> 00:02:40,800 ¿Me puedo poner esto más grande o qué? 65 00:02:42,780 --> 00:02:43,259 Ay 66 00:02:43,259 --> 00:02:45,939 De verdad, estos niños tan listos de hoy en día 67 00:02:45,939 --> 00:02:47,719 A ver, venga 68 00:02:47,719 --> 00:02:48,379 Vamos a ver 69 00:02:48,379 --> 00:02:50,560 Esto, le di 70 00:02:50,560 --> 00:02:53,599 Lo conseguí, me costó 71 00:02:53,599 --> 00:02:54,060 Vale 72 00:02:54,060 --> 00:02:57,759 Eh, destruir más, ¿verdad? 73 00:02:57,759 --> 00:03:00,439 Sí, vale, la jerarquía es más sencillita 74 00:03:00,439 --> 00:03:01,479 ¿Vale? 75 00:03:01,479 --> 00:03:20,759 Esta es la interfaz map, la superinterfaz, que tiene unos métodos que luego implementan las implementaciones HashMap, LinkedHashMap y TrimMap. Estas son, ¿vale? Las tres implementaciones, porque esta es otra interfaz intermedia, esta también es una interfaz. 76 00:03:20,759 --> 00:03:22,879 estas son las tres impermeaciones 77 00:03:22,879 --> 00:03:23,580 y como veis 78 00:03:23,580 --> 00:03:25,439 tienen un nombrecito 79 00:03:25,439 --> 00:03:27,780 prácticamente igual 80 00:03:27,780 --> 00:03:30,919 que haset, linked, haset 81 00:03:30,919 --> 00:03:32,520 y triset, pero cambiando 82 00:03:32,520 --> 00:03:33,379 set por map 83 00:03:33,379 --> 00:03:36,060 porque por dentro en realidad 84 00:03:36,060 --> 00:03:37,159 el funcionamiento 85 00:03:37,159 --> 00:03:40,719 es como haset, linked, haset 86 00:03:40,719 --> 00:03:42,520 triset, salvo 87 00:03:42,520 --> 00:03:44,180 por una pequeña variante que veremos ahora 88 00:03:44,180 --> 00:03:46,400 y el hastable 89 00:03:46,400 --> 00:03:48,159 esta es como la versión antigua 90 00:03:48,159 --> 00:03:50,599 del diccionario, del mapa 91 00:03:50,599 --> 00:03:52,620 la versión antigua, pues como vector y stack 92 00:03:52,620 --> 00:03:55,000 eran la versión antigua de las listas 93 00:03:55,000 --> 00:03:56,539 pues el hash table es como 94 00:03:56,539 --> 00:03:58,759 la primera versión de este concepto de mapa 95 00:03:58,759 --> 00:03:59,699 la primera versión 96 00:03:59,699 --> 00:04:02,539 pero estas de alguna manera son un poco las 97 00:04:02,539 --> 00:04:04,620 implementaciones más 98 00:04:04,620 --> 00:04:06,620 utilizadas, no nos vamos a 99 00:04:06,620 --> 00:04:08,199 volver locos con ellas, simplemente 100 00:04:08,199 --> 00:04:09,900 ¿para qué existen? 101 00:04:10,860 --> 00:04:12,520 existen para reproducir 102 00:04:12,520 --> 00:04:14,520 una idea que se utiliza 103 00:04:14,520 --> 00:04:16,339 muchísimo y está 104 00:04:16,339 --> 00:04:18,399 precisamente relacionada con la famosa 105 00:04:18,399 --> 00:04:20,040 clave primaria que mencionamos siempre 106 00:04:20,779 --> 00:04:30,860 La mayoría de los objetos, de los conceptos, de las cosas, es muy útil que tengan algo que los identifique de forma única para poder gestionarlos de forma fácil. 107 00:04:31,779 --> 00:04:37,779 Si todos los objetos tienen algo que los identifica de forma única, los vamos a gestionar de manera mucho más fácil. 108 00:04:38,279 --> 00:04:39,480 ¿Vale? Esa es la idea de partida. 109 00:04:40,699 --> 00:04:48,819 Entonces, esa propiedad que los identifica de forma única es lo que normalmente conocemos como clave, con el término clave, ¿verdad? 110 00:04:48,819 --> 00:04:53,819 En informática, el término clave está asociado a identificador único. 111 00:04:55,220 --> 00:05:00,000 Clave tiene como significado, en términos informáticos, identificador único. 112 00:05:01,660 --> 00:05:10,420 Bueno, pues entonces, lo que hacen los mapas es guardar objetos con un identificador único asociado. 113 00:05:10,819 --> 00:05:16,000 Pero ese identificador único asociado va fuera del objeto, no es una propiedad interna. 114 00:05:16,000 --> 00:05:16,939 No es una propiedad interna. 115 00:05:17,060 --> 00:05:20,620 Entonces tienes tu objeto ciudad, lo guardas en el mapa 116 00:05:20,620 --> 00:05:24,779 y le asocias un identificador único que lo guardas por libre. 117 00:05:25,500 --> 00:05:27,480 Entonces por eso los mapas se le llaman diccionarios. 118 00:05:27,680 --> 00:05:28,939 ¿Por qué un diccionario es eso? 119 00:05:29,360 --> 00:05:35,019 La lista de palabras del diccionario serían las claves o identificadores únicos. 120 00:05:35,560 --> 00:05:37,160 Todas las palabras de diccionario son distintas. 121 00:05:37,379 --> 00:05:38,019 Todas son diferentes. 122 00:05:38,459 --> 00:05:38,779 Todas. 123 00:05:38,860 --> 00:05:39,660 Las 3.000 que haya. 124 00:05:39,759 --> 00:05:40,519 Todas son distintas. 125 00:05:41,339 --> 00:05:44,480 Y el significado sería el objeto en sí. 126 00:05:44,480 --> 00:05:46,680 lo que se llama en el mapa el valor 127 00:05:46,680 --> 00:05:48,339 entonces un mapa 128 00:05:48,339 --> 00:05:50,339 o un diccionario que son 129 00:05:50,339 --> 00:05:52,420 sinónimos, son sinónimos mapa 130 00:05:52,420 --> 00:05:54,439 y diccionario, es un 131 00:05:54,439 --> 00:05:55,620 conjunto de pares 132 00:05:55,620 --> 00:05:58,180 que son clave, valor 133 00:05:58,180 --> 00:06:00,480 clave, valor, clave, valor, es un conjunto 134 00:06:00,480 --> 00:06:02,680 de pares y la clave 135 00:06:02,680 --> 00:06:03,980 tiene que ser única 136 00:06:03,980 --> 00:06:06,660 y el valor puede estar repetido 137 00:06:06,660 --> 00:06:08,519 en diferentes pares, puede estar repetido 138 00:06:08,519 --> 00:06:10,079 entonces es como un diccionario 139 00:06:10,079 --> 00:06:12,459 un diccionario es una secuencia 140 00:06:12,459 --> 00:06:14,300 de palabras donde las palabras serían 141 00:06:14,300 --> 00:06:15,699 la clave, son todas distintas. 142 00:06:16,339 --> 00:06:17,860 Y los significados 143 00:06:17,860 --> 00:06:18,899 serían el valor. 144 00:06:20,000 --> 00:06:21,759 Los significados sí que se pueden repetir. 145 00:06:23,339 --> 00:06:24,199 ¿No? Puede haber 146 00:06:24,199 --> 00:06:26,459 dos palabras distintas 147 00:06:26,459 --> 00:06:28,519 que tengan el mismo significado. 148 00:06:29,439 --> 00:06:30,040 ¿Verdad? 149 00:06:30,879 --> 00:06:32,639 Bueno, pues ese es el concepto 150 00:06:32,639 --> 00:06:33,579 de mapa o diccionario. 151 00:06:33,879 --> 00:06:35,399 Un conjunto de pares 152 00:06:35,399 --> 00:06:41,329 es un conjunto de pares 153 00:06:41,329 --> 00:06:43,740 ¿vale? 154 00:06:44,600 --> 00:06:46,959 De esta forma, clave, valor. 155 00:06:46,959 --> 00:06:51,449 eso es un diccionario, clave, valor 156 00:06:51,449 --> 00:06:59,480 eso es un mapa, un conjunto de pares 157 00:06:59,480 --> 00:07:00,740 clave, valor, clave, valor 158 00:07:00,740 --> 00:07:03,420 lo que lo define 159 00:07:03,420 --> 00:07:05,279 las claves tienen que ser 160 00:07:05,279 --> 00:07:07,480 distintas, las claves tienen que ser 161 00:07:07,480 --> 00:07:09,360 distintas para todos los elementos 162 00:07:09,360 --> 00:07:09,920 del mapa 163 00:07:09,920 --> 00:07:12,980 todos los elementos que forman un mapa 164 00:07:12,980 --> 00:07:14,860 tienen que tener claves diferentes 165 00:07:14,860 --> 00:07:16,420 la clave tiene que ser única 166 00:07:16,420 --> 00:07:18,339 pero los valores 167 00:07:18,339 --> 00:07:20,360 se pueden repetir 168 00:07:20,360 --> 00:07:23,259 este sería un mapa válido 169 00:07:23,259 --> 00:07:24,939 uno 170 00:07:24,939 --> 00:07:27,180 por lo que fuera 171 00:07:27,180 --> 00:07:48,759 ¿vale? esto es un mapa válido 172 00:07:48,759 --> 00:07:50,600 porque las claves son únicas 173 00:07:50,600 --> 00:07:52,240 uno, dos, tres 174 00:07:52,240 --> 00:07:54,879 no tienen por qué ser numéricas 175 00:07:54,879 --> 00:07:56,480 no tienen por qué ser numéricas 176 00:07:56,480 --> 00:07:59,420 la clave puede ser cualquier valor, cualquier tipo de dato 177 00:07:59,420 --> 00:08:02,500 no tienen por qué ser numéricas 178 00:08:02,500 --> 00:08:05,100 lo importante es que todos los pares 179 00:08:05,100 --> 00:08:06,019 que forman el mapa 180 00:08:06,019 --> 00:08:08,860 tengan diferentes valores en esta clave 181 00:08:08,860 --> 00:08:11,180 sean números, sean letras 182 00:08:11,180 --> 00:08:12,000 pero sean diferentes 183 00:08:12,000 --> 00:08:14,279 pero el valor puede estar repetido 184 00:08:14,279 --> 00:08:15,480 entonces este es un mapa válido 185 00:08:15,480 --> 00:08:18,459 este también es un mapa válido 186 00:08:18,459 --> 00:08:20,199 también es un mapa perfectamente válido 187 00:08:20,199 --> 00:08:22,759 el valor de este y el valor de este son iguales 188 00:08:22,759 --> 00:08:24,199 pero la clave no 189 00:08:24,199 --> 00:08:25,139 que es lo que importa 190 00:08:25,139 --> 00:08:28,420 este sin embargo no es un mapa válido 191 00:08:28,420 --> 00:08:29,959 este no es un mapa válido porque 192 00:08:29,959 --> 00:08:31,540 hay dos claves repetidas 193 00:08:31,540 --> 00:08:35,299 bueno pues entonces 194 00:08:35,299 --> 00:08:36,899 la interfaz map 195 00:08:36,899 --> 00:08:39,059 lo que busca es una manera 196 00:08:39,059 --> 00:08:42,460 lo que programa es una manera de guardar mapas 197 00:08:42,460 --> 00:08:43,899 guardar conjuntos de pares 198 00:08:43,899 --> 00:08:45,860 que funcionen así, es lo que guarda 199 00:08:45,860 --> 00:08:47,720 es lo que, para lo que está hecha esa interfaz 200 00:08:47,720 --> 00:08:49,759 map, para guardar conjuntos 201 00:08:49,759 --> 00:08:52,019 de pares, y es muy útil 202 00:08:52,019 --> 00:08:53,840 porque muchas veces a nuestros objetos 203 00:08:53,840 --> 00:08:55,919 no tienen ellos 204 00:08:55,919 --> 00:08:58,039 en sí una propiedad 205 00:08:58,039 --> 00:08:59,860 interna, que podamos 206 00:08:59,860 --> 00:09:01,980 asegurar que es única, no la tienen 207 00:09:01,980 --> 00:09:03,360 es que eso es lo que hay que ver con 208 00:09:03,360 --> 00:09:07,480 cualquier objeto que esté 209 00:09:07,480 --> 00:09:11,649 almacenado en un set, yo supongo que tiene 210 00:09:11,649 --> 00:09:13,590 una hash, y la hash es 211 00:09:13,590 --> 00:09:15,450 un identificador también, sí 212 00:09:15,450 --> 00:09:17,110 claro, pero esto 213 00:09:17,110 --> 00:09:18,809 lo que te permite es 214 00:09:18,809 --> 00:09:20,889 que sea visible para ti 215 00:09:20,889 --> 00:09:22,809 claro, entonces lo que te permite 216 00:09:22,809 --> 00:09:24,570 es otra forma de guardar las cosas 217 00:09:24,570 --> 00:09:27,429 y localizar por ella 218 00:09:27,429 --> 00:09:28,889 entonces es más fácil 219 00:09:28,889 --> 00:09:31,149 porque si cada uno tiene un código 220 00:09:31,149 --> 00:09:32,990 único, asociado, visible 221 00:09:32,990 --> 00:09:34,529 para ti, que tú has decidido 222 00:09:34,529 --> 00:09:36,929 pues puedes recuperar por él, por ejemplo 223 00:09:36,929 --> 00:09:38,929 puedes decir, devuélveme 224 00:09:38,929 --> 00:09:41,169 el objeto de clave 2, por ejemplo 225 00:09:41,169 --> 00:09:43,090 entonces te optimiza a trabajar 226 00:09:43,090 --> 00:09:43,549 con ello 227 00:09:43,549 --> 00:09:46,370 de alguna manera es que hay 228 00:09:46,370 --> 00:09:48,929 muchas situaciones 229 00:09:48,929 --> 00:09:50,750 en las cuales hay objetos 230 00:09:50,750 --> 00:09:52,389 que ya de por sí tienen asociado 231 00:09:52,389 --> 00:09:54,529 un identificador que es único, que no tiene por qué 232 00:09:54,529 --> 00:09:56,269 estar generado por una clave hash 233 00:09:56,269 --> 00:09:58,669 sino el identificador que tú asocias, pues por ejemplo 234 00:09:58,669 --> 00:10:00,049 yo tengo aquí un conjunto de alumnos 235 00:10:00,049 --> 00:10:02,090 y cada uno de ellos tiene un DNI 236 00:10:02,090 --> 00:10:04,610 claro, entonces 237 00:10:04,610 --> 00:10:07,029 yo aquí tengo un conjunto de alumnos 238 00:10:07,029 --> 00:10:08,529 entonces los alumnos están 239 00:10:08,529 --> 00:10:10,830 caracterizados por nombre y nota 240 00:10:10,830 --> 00:10:12,470 por ejemplo, pero yo sé 241 00:10:12,470 --> 00:10:14,990 que además cada uno de ellos tiene un DNI que es único 242 00:10:14,990 --> 00:10:17,970 entonces puedo decidir que mi forma de gestionarlo 243 00:10:17,970 --> 00:10:19,809 sea un conjunto 244 00:10:19,809 --> 00:10:21,389 de pares donde 245 00:10:21,389 --> 00:10:23,789 la clave sea el DNI que elijo yo 246 00:10:23,789 --> 00:10:25,669 cuál es la clave, no tiene por qué provenir de 247 00:10:25,669 --> 00:10:27,789 aplicar una función hash, la clave 248 00:10:27,789 --> 00:10:29,730 sea el DNI y el objeto 249 00:10:29,730 --> 00:10:31,230 sea el objeto alumno, el valor 250 00:10:31,230 --> 00:10:33,450 entonces es una opción más 251 00:10:33,450 --> 00:10:35,710 y en este caso es interesante porque entonces yo 252 00:10:35,710 --> 00:10:37,090 ya puedo recuperar por DNI 253 00:10:37,090 --> 00:10:39,370 dame el par con DNI 3 254 00:10:39,370 --> 00:10:41,730 por ejemplo, 3 tiene mucho más sentido 255 00:10:41,730 --> 00:10:43,710 porque yo aquí elijo la clave que me da la gana 256 00:10:43,710 --> 00:10:47,529 Con que sea única, no hace falta que sea una función de hash ni nada. 257 00:10:49,870 --> 00:10:54,350 Entonces, en una situación que se da, que yo me di cuenta de que le pega esto, 258 00:10:54,590 --> 00:10:58,789 que le pega, pues uso los mapas y son muy útiles por eso, 259 00:10:58,909 --> 00:11:04,629 porque la clave ahora ya me sirve como elemento para decidir cuál borro, cuál recupero, etc. 260 00:11:05,649 --> 00:11:09,250 En un set, yo no puedo recuperar por clave hash. 261 00:11:09,809 --> 00:11:12,169 En un set yo lo que puedo hacer es iterar a ver lo que tengo. 262 00:11:12,169 --> 00:11:14,450 o puedo borrar y le doy un objeto 263 00:11:14,450 --> 00:11:15,789 y que me borre el igual a ese 264 00:11:15,789 --> 00:11:17,929 pero no puedo hacer más que eso 265 00:11:17,929 --> 00:11:20,289 ¿vale? sin embargo en esta estructura 266 00:11:20,289 --> 00:11:22,009 pues tengo más posibilidades 267 00:11:22,009 --> 00:11:24,830 ¿vale? pues entonces puede ocurrir 268 00:11:24,830 --> 00:11:26,610 que yo ya he decidido que hay una situación 269 00:11:26,610 --> 00:11:28,789 que se presta a eso, tengo objetos 270 00:11:28,789 --> 00:11:30,990 y tengo además 271 00:11:30,990 --> 00:11:31,750 algo 272 00:11:31,750 --> 00:11:34,429 que los identifica de forma única 273 00:11:34,429 --> 00:11:36,629 que no tiene por qué ser una propiedad del objeto 274 00:11:36,629 --> 00:11:38,409 que esa es otra ventaja, no tiene por qué ser 275 00:11:38,409 --> 00:11:40,570 a lo mejor mi objeto alumno tiene DNI dentro 276 00:11:40,570 --> 00:11:42,570 y yo no se lo puedo poner 277 00:11:42,570 --> 00:11:44,870 no se lo puedo poner porque no puedo modificar la clase 278 00:11:44,870 --> 00:11:46,450 no puedo poner el DNI 279 00:11:46,450 --> 00:11:49,330 pero yo sí sé que hay una propiedad 280 00:11:49,330 --> 00:11:51,289 DNI, o sea que los abogados tienen un DNI único 281 00:11:51,289 --> 00:11:52,450 pues digo, estupendo 282 00:11:52,450 --> 00:11:54,269 me hago un map 283 00:11:54,269 --> 00:11:56,769 que tenga por un lado el DNI 284 00:11:56,769 --> 00:11:58,269 y por otro lado el propio objeto 285 00:11:58,269 --> 00:12:01,570 y me permite hacer ya muchas cosas 286 00:12:01,570 --> 00:12:02,629 con esta estructura 287 00:12:02,629 --> 00:12:05,370 entonces como en otros casos 288 00:12:05,370 --> 00:12:07,070 esta es una, un recurso más 289 00:12:07,070 --> 00:12:08,409 es un recurso más para usar 290 00:12:08,409 --> 00:12:10,970 un recurso más y uno selecciona 291 00:12:10,970 --> 00:12:13,049 de todos los recursos que tiene el que ve que le pega 292 00:12:13,049 --> 00:12:14,730 más con la situación que está estudiando 293 00:12:14,730 --> 00:12:16,909 ¿vale? bueno pues este 294 00:12:16,909 --> 00:12:18,529 recurso en concreto vale para eso 295 00:12:18,529 --> 00:12:20,610 para guardar pares 296 00:12:20,610 --> 00:12:23,230 y en esos pares 297 00:12:23,230 --> 00:12:24,950 el primer elemento que es el que 298 00:12:24,950 --> 00:12:27,090 se llama clave, tiene que ser único 299 00:12:27,090 --> 00:12:29,190 y normalmente elegiremos 300 00:12:29,190 --> 00:12:31,029 algo que identifique de forma única 301 00:12:31,029 --> 00:12:32,570 al objeto que viene después 302 00:12:32,570 --> 00:12:34,110 que es lo que se llama valor 303 00:12:34,110 --> 00:12:37,129 y el valor puede estar repetido, puede no estarlo 304 00:12:37,129 --> 00:12:37,350 etc. 305 00:12:38,409 --> 00:12:39,269 Entonces, es un mapa. 306 00:12:41,129 --> 00:12:41,350 ¿Vale? 307 00:12:41,429 --> 00:12:43,950 Entonces, vamos a hacer unos pequeños ejemplos 308 00:12:43,950 --> 00:12:47,309 de cómo se usan y poco más. 309 00:12:48,110 --> 00:12:53,409 Ejemplo triset y ejemplo mapas. 310 00:13:20,320 --> 00:13:21,279 Bueno, pues, por ejemplo, 311 00:13:21,700 --> 00:13:25,120 vamos a hacer eso mismo que ha surgido. 312 00:13:26,820 --> 00:13:27,299 ¿Vale? 313 00:13:27,360 --> 00:13:29,539 Pues, resulta que estamos trabajando con alumnos, 314 00:13:29,620 --> 00:13:30,279 la clase alumno, 315 00:13:30,299 --> 00:13:32,100 y la clase alumno, por la razón que sea, 316 00:13:32,100 --> 00:13:33,700 solo tiene estas dos propiedades. 317 00:13:33,700 --> 00:13:48,419 vamos a hacerle un constructor 318 00:13:48,419 --> 00:13:49,679 con los dos parámetros 319 00:13:49,679 --> 00:13:55,490 y get y set, pues bueno, ya por hábito 320 00:13:55,490 --> 00:14:04,500 vale, y ahora ya 321 00:14:04,500 --> 00:14:06,139 para trabajar con estos alumnos 322 00:14:06,139 --> 00:14:08,700 habría millones de 323 00:14:08,700 --> 00:14:09,480 posibilidades 324 00:14:09,480 --> 00:14:12,480 en función de la aplicación con la que ya estoy trabajando 325 00:14:12,480 --> 00:14:14,259 ahora ya, claro 326 00:14:14,259 --> 00:14:16,759 hay millones de cosas que se puede hacer con esto 327 00:14:16,759 --> 00:14:17,679 en función de la aplicación 328 00:14:17,679 --> 00:14:19,899 entonces, pues bueno 329 00:14:19,899 --> 00:14:22,500 resulta que ahora mi aplicación 330 00:14:22,500 --> 00:14:24,799 vamos a meterla en la clase main 331 00:14:24,799 --> 00:14:25,500 como siempre 332 00:14:25,500 --> 00:14:34,759 mi aplicación es esta, la que está allá en el main 333 00:14:34,759 --> 00:14:36,480 entonces mi aplicación 334 00:14:36,480 --> 00:14:37,860 tiene que trabajar con alumnos 335 00:14:37,860 --> 00:14:40,320 y hacer cosas con los alumnos 336 00:14:40,320 --> 00:14:42,480 pues las medias, las notas 337 00:14:43,120 --> 00:14:44,620 recuperar un alumno 338 00:14:44,620 --> 00:14:46,419 lo que sea, lo que sea, tiene que hacer cosas 339 00:14:46,419 --> 00:14:48,480 con alumnos, entonces ahora 340 00:14:48,480 --> 00:14:50,220 aquí hay un montón de posibilidades 341 00:14:50,220 --> 00:14:52,139 hay un montón de opciones sobre, vale, dónde guardar 342 00:14:52,139 --> 00:14:54,259 los alumnos, en un set 343 00:14:54,259 --> 00:14:55,019 en un list 344 00:14:55,019 --> 00:14:57,399 aquí vendría lo de siempre 345 00:14:57,399 --> 00:15:00,259 va a haber alumnos duplicados 346 00:15:00,259 --> 00:15:02,080 que significa que los alumnos sean iguales 347 00:15:02,080 --> 00:15:03,899 bueno, aquí hay un montón de opciones 348 00:15:03,899 --> 00:15:06,220 que dependerán de 349 00:15:06,220 --> 00:15:07,799 mi problema en concreto 350 00:15:07,799 --> 00:15:09,840 que tendré que estudiar, tendré que hablar 351 00:15:09,840 --> 00:15:12,259 con el secretario de un instituto que me diga 352 00:15:12,259 --> 00:15:13,659 estos son los datos 353 00:15:13,659 --> 00:15:15,899 que se pueden repetir, los que no, lo que sea 354 00:15:15,899 --> 00:15:18,039 pero bueno, nosotros ahora 355 00:15:18,039 --> 00:15:20,179 lo que sí que tenemos claro 356 00:15:20,179 --> 00:15:21,620 es que vamos a trabajar con un montón de alumnos 357 00:15:21,620 --> 00:15:23,220 ¿dónde metemos ese montón de alumnos? 358 00:15:24,080 --> 00:15:24,759 bueno, pues 359 00:15:24,759 --> 00:15:27,799 en este caso podríamos decir, vale, además 360 00:15:27,799 --> 00:15:29,759 tengo el dato del DNI del alumno 361 00:15:29,759 --> 00:15:30,860 lo tengo 362 00:15:30,860 --> 00:15:33,659 con la ventaja de que ese dato me identifica 363 00:15:33,659 --> 00:15:35,080 al alumno de forma única 364 00:15:35,080 --> 00:15:37,820 el DNI del alumno no está 365 00:15:37,820 --> 00:15:39,679 dentro del objeto alumno 366 00:15:39,679 --> 00:15:41,519 no está dentro 367 00:15:41,519 --> 00:15:43,919 podría estar dentro 368 00:15:43,919 --> 00:15:45,480 podría estar dentro 369 00:15:45,480 --> 00:15:47,799 y entonces ya me hago un set 370 00:15:47,799 --> 00:15:48,639 de los de toda la vida 371 00:15:48,639 --> 00:15:51,580 con el equals y el hashcode con el nif 372 00:15:51,580 --> 00:15:53,899 por ejemplo, y tendría un diseño 373 00:15:53,899 --> 00:15:55,519 de aplicación, tendría un diseño 374 00:15:55,519 --> 00:15:58,019 me meto el nif aquí dentro 375 00:15:58,019 --> 00:15:59,639 me meto el nif aquí dentro 376 00:15:59,639 --> 00:16:02,039 me hago el hascode y el equals 377 00:16:02,039 --> 00:16:03,080 basado en el nif 378 00:16:03,080 --> 00:16:05,740 porque el nif identifica de forma única 379 00:16:05,740 --> 00:16:07,580 al alumno y trabajo 380 00:16:07,580 --> 00:16:09,419 con un set de alumnos 381 00:16:09,419 --> 00:16:11,720 o con un list si yo quiero que haya 382 00:16:11,720 --> 00:16:13,120 duplicados, como me dé la gana 383 00:16:13,120 --> 00:16:14,940 pues ya está, es una opción más de diseño 384 00:16:14,940 --> 00:16:16,840 ¿vale? pero vamos a hacer otra 385 00:16:16,840 --> 00:16:18,379 para trabajar con el map 386 00:16:18,379 --> 00:16:21,440 bueno, pues resulta que el nif no está dentro de esta clase 387 00:16:21,440 --> 00:16:23,080 alumno por la razón que sea 388 00:16:23,080 --> 00:16:26,100 pero el dato del NIF 389 00:16:26,100 --> 00:16:27,340 yo sí que lo voy a conocer 390 00:16:27,340 --> 00:16:29,519 tengo disposición de él, tengo ese dato 391 00:16:29,519 --> 00:16:31,159 es una información que tengo del alumno 392 00:16:31,159 --> 00:16:33,179 vale, pues entonces 393 00:16:33,179 --> 00:16:34,759 el diseño que me puedo hacer 394 00:16:34,759 --> 00:16:37,659 que es un diseño que me va a facilitar muchísimo 395 00:16:37,659 --> 00:16:39,779 la vida es, vale, pues voy a 396 00:16:39,779 --> 00:16:40,879 guardar a mis alumnos 397 00:16:40,879 --> 00:16:43,879 en un mapa, que es un conjunto 398 00:16:43,879 --> 00:16:45,860 de pares, donde la clave 399 00:16:45,860 --> 00:16:46,720 va a ser el NIF 400 00:16:46,720 --> 00:16:49,820 y el valor va a ser ya el objeto 401 00:16:49,820 --> 00:16:51,740 alumno concreto asociado a ese NIF 402 00:16:51,740 --> 00:16:52,980 el objeto alumno concreto 403 00:16:52,980 --> 00:16:55,039 Entonces me he hecho otro diseño distinto 404 00:16:55,039 --> 00:16:57,919 Un diseño basado en un mapa 405 00:16:57,919 --> 00:17:00,460 Y ese diseño es muy útil 406 00:17:00,460 --> 00:17:03,899 Bueno, pues entonces 407 00:17:03,899 --> 00:17:06,940 ¿Cómo declaro yo un objeto map? 408 00:17:08,579 --> 00:17:09,180 Vale 409 00:17:09,180 --> 00:17:11,720 Pues de nuevo es un objeto genérico 410 00:17:11,720 --> 00:17:14,160 Es una clase genérica, perdón 411 00:17:14,160 --> 00:17:15,980 Y en este caso depende 412 00:17:15,980 --> 00:17:17,599 De dos tipos 413 00:17:17,599 --> 00:17:19,119 De datos 414 00:17:19,119 --> 00:17:20,619 De hecho, si nos vamos aquí a 415 00:17:20,619 --> 00:17:24,839 Espera, voy a ver si 416 00:17:24,839 --> 00:17:29,589 Open implement 417 00:17:29,589 --> 00:17:31,609 A esta, quería yo, vale 418 00:17:31,609 --> 00:17:34,289 Si nos vamos a la implementada 419 00:17:34,289 --> 00:17:35,549 No, esta no quiero 420 00:17:35,549 --> 00:17:42,269 Quiero la de útil 421 00:17:42,269 --> 00:17:43,490 Esta 422 00:17:43,490 --> 00:17:45,950 Joder, ¿por qué no me abre la de útil? 423 00:17:52,359 --> 00:17:53,019 Open map 424 00:17:53,019 --> 00:17:55,140 A esta quería yo, vale 425 00:17:55,140 --> 00:17:57,619 De hecho, si nos vamos a interfaz map 426 00:17:57,619 --> 00:17:59,240 Vemos que es genérica 427 00:17:59,240 --> 00:18:01,660 Y en este caso depende de dos tipos de datos 428 00:18:01,660 --> 00:18:04,180 depende de dos tipos de datos 429 00:18:04,180 --> 00:18:06,460 la lista dependía de uno 430 00:18:06,460 --> 00:18:08,940 los set dependían de uno 431 00:18:08,940 --> 00:18:10,799 que era el tipo de dato al que pertenecían los objetos 432 00:18:10,799 --> 00:18:11,519 que iban dentro 433 00:18:11,519 --> 00:18:14,819 pues el map es una clase genérica 434 00:18:14,819 --> 00:18:16,779 interfaz genérica que depende de dos 435 00:18:16,779 --> 00:18:17,779 tipos de datos 436 00:18:17,779 --> 00:18:20,140 y esos dos tipos de datos ¿cuáles son? 437 00:18:21,400 --> 00:18:23,019 el tipo de dato al que pertenece 438 00:18:23,019 --> 00:18:24,759 la clave y el tipo de dato 439 00:18:24,759 --> 00:18:27,140 al que pertenece el valor que yo los puedo elegir 440 00:18:27,140 --> 00:18:28,400 ¿vale? 441 00:18:28,619 --> 00:18:30,559 este es el tipo de dato al que van a pertenecer 442 00:18:30,559 --> 00:18:31,900 las claves de los pares 443 00:18:31,900 --> 00:18:34,160 y este es el tipo de dato 444 00:18:34,160 --> 00:18:35,220 al que van a pertenecer 445 00:18:35,220 --> 00:18:36,619 los valores de los pares 446 00:18:36,619 --> 00:18:37,480 y yo elijo 447 00:18:37,480 --> 00:18:38,900 los que me interesen 448 00:18:38,900 --> 00:18:39,819 según mi aplicación 449 00:18:39,819 --> 00:18:42,359 bueno pues en mi caso 450 00:18:42,359 --> 00:18:44,539 la clave 451 00:18:44,539 --> 00:18:46,240 es 452 00:18:46,240 --> 00:18:47,220 el NIF 453 00:18:47,220 --> 00:18:48,619 el NIF 454 00:18:48,619 --> 00:18:49,619 ¿en qué lo guardamos? 455 00:18:49,740 --> 00:18:50,660 pues en string 456 00:18:50,660 --> 00:18:51,680 por ejemplo 457 00:18:51,680 --> 00:18:53,420 pues entonces aquí coloco 458 00:18:53,420 --> 00:18:54,039 string 459 00:18:54,039 --> 00:18:58,599 la cosa es que entonces 460 00:18:58,599 --> 00:18:59,720 la clave tiene su número entero 461 00:18:59,720 --> 00:19:02,839 entonces el nif lo unió que no podía tener la letra 462 00:19:02,839 --> 00:19:04,740 pero vamos 463 00:19:04,740 --> 00:19:06,039 que aquí lo que importa es que 464 00:19:06,039 --> 00:19:08,900 pongas el tipo de dato al que pertenece tu clave 465 00:19:08,900 --> 00:19:10,619 si tu clave es un número entero 466 00:19:10,619 --> 00:19:11,940 pones integer efectivamente 467 00:19:11,940 --> 00:19:14,279 si tu clave es un número decimal 468 00:19:14,279 --> 00:19:16,720 pones double, tu clave puede ser cualquier tipo de dato 469 00:19:16,720 --> 00:19:18,380 eso sí 470 00:19:18,380 --> 00:19:19,819 tiene que ser un tipo de dato 471 00:19:19,819 --> 00:19:21,259 de tipo objeto 472 00:19:21,259 --> 00:19:23,779 efectivamente si fuera un número 473 00:19:23,779 --> 00:19:25,500 aquí nunca podríamos poner int 474 00:19:25,500 --> 00:19:27,099 pero esto es lo mismo que en las listas 475 00:19:27,099 --> 00:19:28,279 esto ya nos ha pasado 476 00:19:28,279 --> 00:19:30,200 aquí no podríamos poner esto 477 00:19:30,200 --> 00:19:32,380 ya lo sabemos, pero para eso podríamos 478 00:19:32,380 --> 00:19:34,019 la envolvente 479 00:19:34,019 --> 00:19:36,220 ¿verdad? que es lo mismo, ya lo sabemos 480 00:19:36,220 --> 00:19:37,980 bueno, pues en nuestro caso 481 00:19:37,980 --> 00:19:39,400 si yo he decidido 482 00:19:39,400 --> 00:19:42,000 que mi DNI se guarde en string 483 00:19:42,000 --> 00:19:44,359 pues aquí pondría el tipo string 484 00:19:44,359 --> 00:19:46,180 porque las claves son nil que va en string 485 00:19:46,180 --> 00:19:47,819 ahora, el valor 486 00:19:47,819 --> 00:19:49,940 el valor de cada par, ¿cuál va a ser? 487 00:19:50,200 --> 00:19:51,720 el objeto alumno en concreto 488 00:19:51,720 --> 00:19:54,279 el objeto alumno, pues entonces aquí 489 00:19:54,279 --> 00:19:55,440 pongo alumno 490 00:19:55,440 --> 00:20:01,950 pues aquí tengo ya 491 00:20:01,950 --> 00:20:04,210 mi la declaración 492 00:20:04,210 --> 00:20:06,250 lo que pasa es que a la instancia 493 00:20:06,250 --> 00:20:08,549 a la hora de instanciar 494 00:20:08,549 --> 00:20:10,250 tengo que elegir una implementación 495 00:20:10,250 --> 00:20:12,170 concreta, recordad que 496 00:20:12,170 --> 00:20:14,390 la variable se puede declarar 497 00:20:14,390 --> 00:20:16,410 de la superclase, pero luego 498 00:20:16,410 --> 00:20:18,750 no instancia ya una implementación 499 00:20:18,750 --> 00:20:19,569 obviamente 500 00:20:19,569 --> 00:20:22,990 tres implementaciones, hashMap, linkedHashMap 501 00:20:22,990 --> 00:20:24,569 trimap, vamos a coger la primera 502 00:20:24,569 --> 00:20:45,450 de ellas, vale 503 00:20:45,450 --> 00:20:47,210 pues ya tenemos nuestra estructura de datos 504 00:20:47,210 --> 00:20:49,450 vale, es otra 505 00:20:49,450 --> 00:20:51,349 variante, en lugar de meter todos los 506 00:20:51,349 --> 00:20:52,289 alumnos en un set 507 00:20:52,289 --> 00:20:56,269 y ya sabemos lo que podemos hacer con eso 508 00:20:56,269 --> 00:20:58,750 pues hemos metido los alumnos 509 00:20:58,750 --> 00:20:59,930 en un mapa 510 00:20:59,930 --> 00:21:02,630 donde además van acompañados de su DNI 511 00:21:02,630 --> 00:21:04,170 que es su clave 512 00:21:04,170 --> 00:21:07,130 entonces ahora, ¿qué podemos hacer con una colección? 513 00:21:07,130 --> 00:21:08,190 como esta, con un mapa 514 00:21:08,190 --> 00:21:11,170 lo mismo que con todas, meter pares 515 00:21:11,170 --> 00:21:13,109 recuperar pares 516 00:21:13,109 --> 00:21:15,250 en este caso, recuperar por clave 517 00:21:15,250 --> 00:21:16,670 que esa es la principal ventaja 518 00:21:16,670 --> 00:21:19,009 borrar por clave, podemos hacer mil cosas 519 00:21:19,009 --> 00:21:20,230 por ejemplo, vamos a meter 520 00:21:20,230 --> 00:21:22,289 pues un alumno, pues nada 521 00:21:22,289 --> 00:21:24,549 alumnos, uno ya puede 522 00:21:24,549 --> 00:21:26,410 mirar aquí todos los métodos que hay 523 00:21:26,410 --> 00:21:28,069 en los mapas 524 00:21:28,069 --> 00:21:32,099 ¿vale? que hay pues 525 00:21:32,099 --> 00:21:38,549 pues unos cuantos 526 00:21:38,549 --> 00:21:39,470 métodos 527 00:21:39,470 --> 00:21:41,670 de map 528 00:21:41,670 --> 00:21:44,690 algunos por su propio 529 00:21:44,690 --> 00:21:46,390 nombre, pues ya podemos deducir lo que hacen 530 00:21:46,390 --> 00:21:48,670 pues este obviamente eliminará todos los pares 531 00:21:48,670 --> 00:21:49,569 de la colección 532 00:21:49,569 --> 00:21:54,990 ¿vale? no hay muchos 533 00:21:54,990 --> 00:21:57,289 porque lo único que es meter pares, borrar 534 00:21:57,289 --> 00:21:59,230 pares, no hay ningún at 535 00:21:59,230 --> 00:22:01,269 no hay ningún at porque aquí 536 00:22:01,269 --> 00:22:02,809 no se llama at, se llama put 537 00:22:02,809 --> 00:22:04,609 simplemente, porque ha cambiado el nombre 538 00:22:04,609 --> 00:22:06,170 aquí se llama put 539 00:22:06,170 --> 00:22:08,890 vale, el at aquí se llama put 540 00:22:08,890 --> 00:22:10,789 bueno, pues en nuestro caso 541 00:22:10,789 --> 00:22:13,529 que queremos meter un nuevo alumno 542 00:22:13,529 --> 00:22:20,839 que queremos meter un nuevo 543 00:22:20,839 --> 00:22:22,680 alumno, pues tenemos que meter el par entero 544 00:22:22,680 --> 00:22:24,579 clave, pues venga, alumno con dni 545 00:22:24,579 --> 00:22:28,349 este, y aquí tenemos que 546 00:22:28,349 --> 00:22:30,210 meter un alumno, pues venga, new 547 00:22:30,210 --> 00:22:38,990 alumno, pues el alumno 548 00:22:38,990 --> 00:22:40,569 que sea, que era nombre y nota 549 00:22:40,569 --> 00:22:54,819 con esta cacholetraza no me 550 00:22:54,819 --> 00:22:57,160 no me aclaro, vale 551 00:22:57,160 --> 00:22:59,180 pues ya hemos metido un par, entonces aquí 552 00:22:59,180 --> 00:23:00,799 va todo por pares 553 00:23:00,799 --> 00:23:25,400 vale, entonces después de meter aquí 554 00:23:25,400 --> 00:23:29,359 esto vamos a ejecutarlo 555 00:23:29,359 --> 00:23:31,140 solamente para verificar que no nos sale 556 00:23:31,140 --> 00:23:32,759 ningún error de ejecución ni nada 557 00:23:32,759 --> 00:23:35,019 no vayamos a haber escrito algo mal, pero no vamos a ver nada 558 00:23:35,019 --> 00:23:37,099 no vamos a ver nada porque 559 00:23:37,099 --> 00:23:39,039 no he hecho nada, solamente meter 560 00:23:39,039 --> 00:23:40,000 dos pares y ya está 561 00:23:40,000 --> 00:23:41,480 vale 562 00:23:41,480 --> 00:23:44,720 vale, pues esos dos pares ya están aquí 563 00:23:44,720 --> 00:23:47,200 entonces vamos a ver, tendrá un size 564 00:23:47,200 --> 00:23:49,339 para ver cuántos hemos metido 565 00:23:49,339 --> 00:23:50,599 vamos a 566 00:23:50,599 --> 00:23:55,240 que está aquí 567 00:23:55,240 --> 00:23:58,420 vale, entonces efectivamente si ejecutamos 568 00:23:58,420 --> 00:23:59,980 esto, veremos, se supone que dos 569 00:23:59,980 --> 00:24:01,240 veremos dos 570 00:24:01,240 --> 00:24:04,480 lo ejecutamos y sí, hemos metido dos pares 571 00:24:04,480 --> 00:24:06,940 vale 572 00:24:06,940 --> 00:24:09,859 entonces, insertar pares, ninguna complicación 573 00:24:09,859 --> 00:24:11,039 con put se van insertando 574 00:24:11,039 --> 00:24:14,240 que queremos insertar un montón de pares 575 00:24:14,240 --> 00:24:16,019 a la vez, tiene un put all 576 00:24:16,019 --> 00:24:16,539 también 577 00:24:16,539 --> 00:24:19,940 entonces al put all le pasamos 578 00:24:19,940 --> 00:24:21,259 a su vez dentro otro mapa 579 00:24:21,259 --> 00:24:24,160 y todos los pares del mapa 580 00:24:24,160 --> 00:24:24,920 los mete en ese 581 00:24:24,920 --> 00:24:28,079 igual que en la lista 582 00:24:28,079 --> 00:24:29,640 o el set tenía también un add all 583 00:24:29,640 --> 00:24:31,740 que le pasábamos una colección 584 00:24:31,740 --> 00:24:34,000 y te metía todos los elementos de esa colección 585 00:24:34,000 --> 00:24:35,460 en la lista 586 00:24:35,460 --> 00:24:37,420 pues este tiene un put all donde le metes 587 00:24:37,420 --> 00:24:39,400 un mapa y todos los del mapa se van 588 00:24:39,400 --> 00:25:02,349 Pero bueno, no tiene mayor. Aquí lo único es que, lógicamente, si yo repito a un alumno con la misma clave, no lo va a meter. Es decir, yo meto a otro alumno distinto, que es el Carlos II este, otro distinto, pero para la misma clave. 589 00:25:02,349 --> 00:25:05,259 ¿Vale? 590 00:25:07,460 --> 00:25:08,819 Meto otro alumno distinto 591 00:25:08,819 --> 00:25:12,380 Y sigue teniendo dos 592 00:25:12,380 --> 00:25:15,400 ¿Por qué? Porque este lo ha ignorado 593 00:25:15,400 --> 00:25:16,799 Es como al set 594 00:25:16,799 --> 00:25:18,339 Cuando al set le intentábamos meter 595 00:25:18,339 --> 00:25:20,740 La clave siempre va a ser 596 00:25:20,740 --> 00:25:21,859 El primer parámetro 597 00:25:21,859 --> 00:25:24,140 Siempre, va en ese orden 598 00:25:24,140 --> 00:25:25,059 Clave, valor 599 00:25:25,059 --> 00:25:27,859 Siempre va a ser el primero 600 00:25:27,859 --> 00:25:28,680 Tiene que ser el primero 601 00:25:28,680 --> 00:25:31,000 Entonces, este lo ha ignorado 602 00:25:31,000 --> 00:25:32,579 Pues el segundo no lo ha metido 603 00:25:32,579 --> 00:25:35,160 Como cuando en un set intentas meter un objeto duplicado 604 00:25:35,160 --> 00:25:37,079 Pues no lo ha metido 605 00:25:37,079 --> 00:25:38,579 vale 606 00:25:38,579 --> 00:25:49,940 entonces, vamos a hacer 607 00:25:49,940 --> 00:25:50,579 otro cambio 608 00:25:50,579 --> 00:25:54,140 vamos a hacer ahora un cambio en el cual 609 00:25:54,140 --> 00:25:55,940 imaginaos que ahora 610 00:25:55,940 --> 00:25:57,680 queremos 611 00:25:57,680 --> 00:26:00,279 trabajar con alumnos 612 00:26:00,279 --> 00:26:02,319 y a cada alumno asociarle 613 00:26:02,319 --> 00:26:03,420 un aula 614 00:26:03,420 --> 00:26:05,700 es una cosa un poco retorcida, pero bueno, un aula 615 00:26:05,700 --> 00:26:07,380 que va a ser el nombre de aula en stream 616 00:26:07,380 --> 00:26:09,220 entonces yo decido 617 00:26:09,220 --> 00:26:11,160 que mi estructura de datos 618 00:26:11,160 --> 00:26:12,019 entonces sea un mapa 619 00:26:12,019 --> 00:26:15,019 donde la clave en este caso sea 620 00:26:15,019 --> 00:26:17,039 el alumno, el objeto alumno 621 00:26:17,039 --> 00:26:18,339 y el valor el aula 622 00:26:18,339 --> 00:26:19,900 entonces en ese mapa 623 00:26:19,900 --> 00:26:22,579 todos los objetos alumnos son distintos 624 00:26:22,579 --> 00:26:24,720 por eso me he funcionado como clave 625 00:26:24,720 --> 00:26:27,220 y el valor es la clase 626 00:26:27,220 --> 00:26:28,880 en la que está, el valor se puede repetir 627 00:26:28,880 --> 00:26:30,220 puede haber dos alumnos en la misma aula 628 00:26:30,220 --> 00:26:32,500 entonces imaginaos que yo decido ahora 629 00:26:32,500 --> 00:26:34,259 porque me interesa para mi aplicación 630 00:26:34,259 --> 00:26:36,400 una estructura de datos que sea así 631 00:26:36,400 --> 00:26:38,819 un conjunto de pares que son 632 00:26:38,819 --> 00:26:41,180 objeto alumno, clase en la que está 633 00:26:41,180 --> 00:26:43,039 objeto alumno, clase en la que está 634 00:26:43,039 --> 00:26:44,940 por ejemplo, me apetece a mí 635 00:26:44,940 --> 00:26:45,799 hacer un mapa de esos 636 00:26:45,799 --> 00:26:46,539 porque resulta que luego 637 00:26:46,539 --> 00:26:47,240 me va a ser útil 638 00:26:47,240 --> 00:26:48,480 para las operaciones 639 00:26:48,480 --> 00:26:49,140 que voy a hacer. 640 00:26:50,059 --> 00:26:50,619 Pues venga, 641 00:26:50,700 --> 00:26:51,259 vamos a hacernos ahora 642 00:26:51,259 --> 00:26:51,859 ese otro mapa. 643 00:26:52,380 --> 00:26:53,420 Este está entendido, ¿no? 644 00:26:53,420 --> 00:26:54,619 Es un mapa normal y corriente 645 00:26:54,619 --> 00:26:55,380 donde yo meto 646 00:26:55,380 --> 00:26:56,559 nif, objeto, 647 00:26:56,920 --> 00:26:57,680 nif, objeto. 648 00:26:58,880 --> 00:26:59,920 Vale, pues ahora resulta 649 00:26:59,920 --> 00:27:00,579 que me interesa a mí 650 00:27:00,579 --> 00:27:01,180 hacer un mapa 651 00:27:01,180 --> 00:27:02,579 asignaciones 652 00:27:02,579 --> 00:27:03,519 que es alumno, aula, 653 00:27:03,599 --> 00:27:04,000 en la que está, 654 00:27:04,099 --> 00:27:04,559 alumno, aula, 655 00:27:04,619 --> 00:27:05,079 en la que está. 656 00:27:05,960 --> 00:27:06,460 Pues entonces, 657 00:27:06,579 --> 00:27:07,400 me hago yo mi mapa. 658 00:27:07,680 --> 00:27:08,400 En este caso, 659 00:27:10,579 --> 00:27:11,099 mi mapa, 660 00:27:12,099 --> 00:27:13,480 los tipos de datos serían 661 00:27:13,480 --> 00:27:14,140 alumno, 662 00:27:14,960 --> 00:27:15,940 el primero de todos, 663 00:27:16,319 --> 00:27:30,119 Porque el tipo de dato al que pertenece la clave es alumno, la clave será el objeto alumno, distinto para cada entrada del mapa. Cada elemento de un mapa se les llama la entrada, normalmente la entrada del mapa para cada entrada. 664 00:27:30,119 --> 00:27:32,839 y ahora el valor, el nombre 665 00:27:32,839 --> 00:27:34,119 del aula, le ponemos un string 666 00:27:34,119 --> 00:27:36,000 pues entonces aquí ponemos un string 667 00:27:36,000 --> 00:27:39,119 vale, pues bueno, imagínate 668 00:27:39,119 --> 00:27:42,329 a este mapa 669 00:27:42,329 --> 00:27:44,049 se llama asignación sin más 670 00:27:44,049 --> 00:27:46,009 y ahora ya lo 671 00:27:46,009 --> 00:27:48,630 lo instanciamos como hash map 672 00:27:48,630 --> 00:27:57,329 vale, pues venga 673 00:27:57,329 --> 00:27:59,309 vamos a colocar al primer alumno en un aula 674 00:27:59,309 --> 00:28:03,400 pues asignación 675 00:28:03,400 --> 00:28:07,329 put, vamos a 676 00:28:07,329 --> 00:28:08,309 poner al alumno 677 00:28:08,309 --> 00:28:20,519 este que tiene nota 4, a este alumno 678 00:28:20,519 --> 00:28:22,859 Lo vamos a poner en el aula 679 00:28:22,859 --> 00:28:23,900 Esta de aquí 680 00:28:23,900 --> 00:28:30,859 Ahí se queda 681 00:28:30,859 --> 00:28:32,460 Vamos a poner aquí 682 00:28:32,460 --> 00:28:35,539 Unos asteriscos para cuando lo ejecutemos 683 00:28:35,539 --> 00:28:37,119 Sepamos 684 00:28:37,119 --> 00:28:38,599 Que es lo que estamos viendo 685 00:28:38,599 --> 00:28:47,089 Vale, pues ya hemos metido la primera asignación 686 00:28:47,089 --> 00:28:48,690 Y ahora 687 00:28:48,690 --> 00:28:52,089 No me falta un paréntesis 688 00:28:52,089 --> 00:28:53,170 Si me falta un paréntesis 689 00:28:53,170 --> 00:28:54,609 Ah no, no me falta 690 00:28:54,609 --> 00:28:59,390 Entonces vamos a meter a otro 691 00:28:59,390 --> 00:29:03,589 Entonces según lo que yo he dicho 692 00:29:03,589 --> 00:29:06,710 Si vuelvo a meter al mismo alumno 693 00:29:06,710 --> 00:29:07,450 Y me equivoco 694 00:29:07,450 --> 00:29:10,630 Vuelvo a por alumno carlos4 695 00:29:10,630 --> 00:29:12,789 Le pongo en dos dam 696 00:29:12,789 --> 00:29:15,910 Según lo que yo he dicho 697 00:29:15,910 --> 00:29:18,670 Como he metido dos veces la misma clave 698 00:29:18,670 --> 00:29:21,779 No me lo va a meter 699 00:29:21,779 --> 00:29:23,599 La segunda asignación no lo va a meter 700 00:29:23,599 --> 00:29:25,819 Vamos a verlo 701 00:29:25,819 --> 00:29:28,440 Asignación 702 00:29:28,440 --> 00:29:29,559 Punto 6 703 00:29:29,559 --> 00:29:36,130 Vale, hemos dicho que la clave tiene que ser única 704 00:29:36,130 --> 00:29:37,950 He metido dos veces 705 00:29:37,950 --> 00:29:40,130 el mismo objeto, igual que aquí he metido 706 00:29:40,130 --> 00:29:42,170 dos veces este mismo 707 00:29:42,170 --> 00:29:44,089 objeto y efectivamente he comprobado que el 708 00:29:44,089 --> 00:29:46,230 segundo lo ha ignorado, pues aquí he metido 709 00:29:46,230 --> 00:29:47,329 dos veces el mismo objeto 710 00:29:47,329 --> 00:29:49,910 vamos a ver 711 00:29:49,910 --> 00:29:52,369 qué es lo que 712 00:29:52,369 --> 00:29:53,349 me hace 713 00:29:53,349 --> 00:29:56,190 y sin embargo aquí sí que 714 00:29:56,190 --> 00:29:59,710 me lo ha metido, aquí sí 715 00:29:59,710 --> 00:30:01,750 claro 716 00:30:01,750 --> 00:30:03,269 pero seguro que podéis contestarme 717 00:30:03,269 --> 00:30:05,029 ¿por qué para el HashMap 718 00:30:05,029 --> 00:30:07,789 este y este no son el mismo? 719 00:30:07,789 --> 00:30:09,869 ¿por qué no son el mismo? 720 00:30:11,210 --> 00:30:17,160 a ver, esto y esto es igual 721 00:30:17,160 --> 00:30:19,339 es clavado, pero para el HashMap 722 00:30:19,339 --> 00:30:21,279 esto y esto 723 00:30:21,279 --> 00:30:23,140 es distinto, ¿por qué es distinto? 724 00:30:24,240 --> 00:30:25,319 ¿por qué estos objetos 725 00:30:25,319 --> 00:30:26,019 son distintos? 726 00:30:27,460 --> 00:30:29,019 porque tienen otro valor distinto 727 00:30:29,019 --> 00:30:30,599 ¿o no se acuerdan? 728 00:30:30,599 --> 00:30:31,960 no, no, no 729 00:30:31,960 --> 00:30:34,220 sí, pero no es por eso 730 00:30:34,220 --> 00:30:37,279 es que antes de 731 00:30:37,279 --> 00:30:37,859 mirar el valor 732 00:30:37,859 --> 00:30:40,720 claro, o sea, antes de mirar el valor 733 00:30:40,720 --> 00:30:42,960 él cuando, él ha metido esto 734 00:30:42,960 --> 00:30:45,019 ahora tú le pasas esto, y dice, a ver, clave 735 00:30:45,019 --> 00:30:46,519 ¿esta clave existe ya? 736 00:30:47,059 --> 00:30:48,779 sí existe, entonces lo ignoro 737 00:30:48,779 --> 00:30:50,079 que es lo que nos ha hecho antes 738 00:30:50,079 --> 00:30:52,720 ¿esta clave no existe? es que ya ni mira el valor 739 00:30:52,720 --> 00:30:54,380 entonces él ha llegado a la conclusión 740 00:30:54,380 --> 00:30:57,180 de que este objeto no existía previamente 741 00:30:57,180 --> 00:30:58,240 porque lo ha vuelto a meter 742 00:30:58,240 --> 00:30:59,779 ¿por qué 743 00:30:59,779 --> 00:31:01,759 no ha encontrado 744 00:31:01,759 --> 00:31:05,160 no se ha dado cuenta de que este objeto es igual que el anterior? 745 00:31:05,640 --> 00:31:07,039 no sabemos si está guardando 746 00:31:07,039 --> 00:31:07,880 ¿eh? 747 00:31:08,359 --> 00:31:09,759 si está guardando el objeto 748 00:31:09,759 --> 00:31:12,740 ¿cómo que no se está guardando? 749 00:31:13,660 --> 00:31:13,700 pero 750 00:31:13,700 --> 00:31:17,819 exactamente 751 00:31:17,819 --> 00:31:20,180 es que no son iguales 752 00:31:20,180 --> 00:31:21,799 porque la clase alumno 753 00:31:21,799 --> 00:31:24,559 no tiene su hashcode ni su equals 754 00:31:24,559 --> 00:31:26,700 con lo cual el que usa 755 00:31:26,700 --> 00:31:27,920 es la de object 756 00:31:27,920 --> 00:31:29,720 y object como siempre 757 00:31:29,720 --> 00:31:32,380 la implementación de equals de object 758 00:31:32,380 --> 00:31:35,119 es dos objetos son iguales 759 00:31:35,119 --> 00:31:36,420 si está en la misma dirección de memoria 760 00:31:36,420 --> 00:31:37,519 si no, no 761 00:31:37,519 --> 00:31:39,779 entonces este objeto 762 00:31:39,779 --> 00:31:41,779 se ha creado en la dirección de memoria 763 00:31:41,779 --> 00:31:44,220 y este otro se ha creado en otra 764 00:31:44,220 --> 00:31:45,779 los valores son los mismos 765 00:31:45,779 --> 00:31:48,619 pero son dos objetos en diferentes direcciones de memoria 766 00:31:48,619 --> 00:31:50,779 es el problema de siempre 767 00:31:50,779 --> 00:31:52,960 que se manifiesta en todas las situaciones 768 00:31:52,960 --> 00:31:54,740 que yo no he hecho ningún 769 00:31:54,740 --> 00:31:56,079 equals en alumno 770 00:31:56,079 --> 00:31:58,119 entonces al no haber hecho ningún equals 771 00:31:58,119 --> 00:31:59,359 esos objetos son distintos 772 00:31:59,359 --> 00:32:01,480 entonces yo ahora es cuando tengo que decidir 773 00:32:01,480 --> 00:32:03,700 ah no, perdona, es que para mí 774 00:32:03,700 --> 00:32:06,279 la igualdad se basa en esto 775 00:32:06,279 --> 00:32:08,799 pues tengo que programarla para que el resto lo entienda 776 00:32:08,799 --> 00:32:10,160 yo no puedo esperar 777 00:32:10,160 --> 00:32:13,019 es que el string 778 00:32:13,019 --> 00:32:13,759 sí que tiene el equals 779 00:32:13,759 --> 00:32:16,180 porque la clase string ya está hecha 780 00:32:16,180 --> 00:32:18,380 esta es la clase string 781 00:32:18,380 --> 00:32:19,839 y la clase string 782 00:32:19,839 --> 00:32:22,259 es una clase que ya está hecha 783 00:32:22,259 --> 00:32:24,319 y tiene su propia implementación de equals 784 00:32:24,319 --> 00:32:26,740 que está hecha en función de que los caracteres 785 00:32:26,740 --> 00:32:27,740 sean iguales 786 00:32:27,740 --> 00:32:28,900 entonces dos string 787 00:32:28,900 --> 00:32:33,099 no, alumno lo acabo de hacer yo 788 00:32:33,099 --> 00:32:34,599 y no tiene ninguna implementación de equals 789 00:32:34,599 --> 00:32:35,279 alumno es esta 790 00:32:35,279 --> 00:32:38,460 claro 791 00:32:38,460 --> 00:32:41,980 pero coge el equals de object 792 00:32:41,980 --> 00:32:43,660 y el de object está basado en dirección de memoria 793 00:32:43,660 --> 00:32:45,599 entonces 794 00:32:45,599 --> 00:32:47,460 el equals de string 795 00:32:47,460 --> 00:32:49,319 ya ha sobrescrito el de object 796 00:32:49,319 --> 00:32:52,000 basado en que los caracteres sean iguales 797 00:32:52,000 --> 00:32:53,440 pero alguno no lo ha sobrescrito 798 00:32:53,440 --> 00:32:55,880 es el problema con el que nos hemos 799 00:32:55,880 --> 00:32:58,039 encontrado en un montón de situaciones 800 00:32:58,039 --> 00:33:00,000 pues aquí con el mapa 801 00:33:00,000 --> 00:33:01,220 exactamente igual 802 00:33:01,220 --> 00:33:04,039 entonces para el map este objeto 803 00:33:04,039 --> 00:33:05,640 y este objeto son distintos 804 00:33:05,640 --> 00:33:07,140 porque yo no les he dado 805 00:33:07,140 --> 00:33:08,140 un criterio de igualdad 806 00:33:08,140 --> 00:33:10,140 vale, pues ahora viene lo importante 807 00:33:10,140 --> 00:33:12,059 y es, para el map 808 00:33:12,059 --> 00:33:13,759 ¿cuál es el criterio de igualdad? 809 00:33:14,099 --> 00:33:16,279 pues depende de si es hash map 810 00:33:16,279 --> 00:33:17,759 linked hash map o tree map 811 00:33:17,759 --> 00:33:20,160 para el hash map 812 00:33:20,160 --> 00:33:22,319 el criterio de igualdad es el mismo 813 00:33:22,319 --> 00:33:23,400 que para el hash set 814 00:33:23,400 --> 00:33:26,259 que es hash code equals 815 00:33:26,259 --> 00:33:28,079 con lo cual, en la clase 816 00:33:28,079 --> 00:33:29,920 a la que pertenezcan las claves 817 00:33:29,920 --> 00:33:31,480 y solo las claves 818 00:33:31,480 --> 00:33:33,480 hay que implementar 819 00:33:33,480 --> 00:33:35,059 hay que implementar hash code equals 820 00:33:35,059 --> 00:33:37,779 porque ahí es donde importa, él es donde mira la igualdad 821 00:33:37,779 --> 00:33:40,119 entonces el hashMap, por eso se llama así 822 00:33:40,119 --> 00:33:43,180 internamente guarda las claves en un hashSet 823 00:33:43,180 --> 00:33:45,779 las claves las guarda en un hashSet, internamente 824 00:33:45,779 --> 00:33:49,660 y por tanto necesita que haya hashCodeEquals 825 00:33:49,660 --> 00:33:52,220 en esta clase para poder 826 00:33:52,220 --> 00:33:54,279 comprobar si son iguales o no 827 00:33:54,279 --> 00:33:58,700 igual que el hashSet necesitaba hashCodeEquals en la clase 828 00:33:58,700 --> 00:34:00,180 para ver si dos eran iguales o no 829 00:34:00,180 --> 00:34:04,740 pues como en el hashMap las claves se guardan en un hashSet 830 00:34:04,740 --> 00:34:06,259 pues aquí tiene que haber 831 00:34:06,259 --> 00:34:08,000 jasco de equals, si no hay jasco de equals 832 00:34:08,000 --> 00:34:09,219 para él esto es distinto 833 00:34:09,219 --> 00:34:12,079 vale, pues entonces será bien 834 00:34:12,079 --> 00:34:13,659 bueno, y nosotros 835 00:34:13,659 --> 00:34:16,199 que hace que los alumnos sean 836 00:34:16,199 --> 00:34:18,340 iguales, en este 837 00:34:18,340 --> 00:34:20,340 caso, el nombre, tiene que haber un criterio 838 00:34:20,340 --> 00:34:22,500 de igualdad, porque es que si lo estoy usando como clave 839 00:34:22,500 --> 00:34:24,360 si los uso como 840 00:34:24,360 --> 00:34:26,559 clave, tiene que haber un criterio de igualdad en ellos mismos 841 00:34:26,559 --> 00:34:28,039 aquí no hay nada 842 00:34:28,039 --> 00:34:29,280 es que son ellos la clave 843 00:34:29,280 --> 00:34:32,139 pues tengo que dar un criterio de igualdad 844 00:34:32,139 --> 00:34:34,400 para ellos, pues mi criterio de igualdad 845 00:34:34,400 --> 00:34:35,880 ¿cuál decido? pues por nombre 846 00:34:35,880 --> 00:34:38,280 decido que por nombre, porque puede haber alumnos 847 00:34:38,280 --> 00:34:39,699 distintos con la misma nota 848 00:34:39,699 --> 00:34:42,260 pues nada, me hago el jasco de 849 00:34:42,260 --> 00:34:46,829 equals, por nombre 850 00:34:46,829 --> 00:34:48,230 solamente, por nota no 851 00:34:48,230 --> 00:34:49,809 por nombre 852 00:34:49,809 --> 00:34:52,889 ala, ya tengo el jasco 853 00:34:52,889 --> 00:34:53,789 de equals por nombre 854 00:34:53,789 --> 00:34:56,869 pues estupendo, ahora ya 855 00:34:56,869 --> 00:34:58,530 sí, ahora ya 856 00:34:58,530 --> 00:35:00,849 si yo repito esta aplicación 857 00:35:00,849 --> 00:35:02,909 el hashmap ya va a ver 858 00:35:02,909 --> 00:35:04,969 que carlos4 es igual que el carlos4 859 00:35:04,969 --> 00:35:06,190 como si pusiera carlos5 860 00:35:06,190 --> 00:35:09,389 porque para él 861 00:35:09,389 --> 00:35:10,769 la igualdad viene por nombre 862 00:35:10,769 --> 00:35:13,449 entonces ahora si ejecutamos esto 863 00:35:13,449 --> 00:35:15,150 efectivamente el segundo 864 00:35:15,150 --> 00:35:17,849 no lo va a haber metido 865 00:35:17,849 --> 00:35:21,550 ¿vale? el segundo ahora ya 866 00:35:21,550 --> 00:35:22,170 no lo ha metido 867 00:35:22,170 --> 00:35:24,929 ¿vale? 868 00:35:26,869 --> 00:35:29,110 entonces de nuevo, si usamos 869 00:35:29,110 --> 00:35:30,530 hasMap o linked hasMap 870 00:35:30,530 --> 00:35:33,190 tenemos que tener en cuenta que la clase 871 00:35:33,190 --> 00:35:34,829 a la que pertenecen las claves 872 00:35:34,829 --> 00:35:36,949 tiene que tener el hasCode equals 873 00:35:36,949 --> 00:35:39,130 tiene que tenerlo porque si no va a funcionar 874 00:35:39,130 --> 00:35:40,170 con coherencia 875 00:35:40,170 --> 00:35:48,179 la diferencia entre HashMap y LinkedHashMap 876 00:35:48,179 --> 00:35:50,280 la misma que entre HashSet y LinkedHashSet 877 00:35:50,280 --> 00:35:52,079 que si ahora iteramos 878 00:35:52,079 --> 00:35:54,159 por el map, iteramos 879 00:35:54,159 --> 00:35:55,820 en el HashMap 880 00:35:55,820 --> 00:35:57,739 me va a iterar en el orden que 881 00:35:57,739 --> 00:36:00,420 dé el dedo a entender y en el LinkedHashMap 882 00:36:00,420 --> 00:36:01,860 me va a iterar 883 00:36:01,860 --> 00:36:03,679 en el mismo orden en el que inserté 884 00:36:03,679 --> 00:36:05,320 es la única diferencia 885 00:36:05,320 --> 00:36:07,199 ¿vale? 886 00:36:11,719 --> 00:36:12,500 bueno pues 887 00:36:12,500 --> 00:36:15,480 ventaja de usar un map, pues efectivamente 888 00:36:15,480 --> 00:36:18,400 que recuperar 889 00:36:18,400 --> 00:36:20,940 para recuperar, consultar 890 00:36:20,940 --> 00:36:24,659 es más fácil porque lo puedo hacer por clave 891 00:36:24,659 --> 00:36:26,539 directamente, por ejemplo 892 00:36:26,539 --> 00:36:28,059 que ahora yo quiero en mis alumnos 893 00:36:28,059 --> 00:36:32,940 borrar el que tenga un DNI 894 00:36:32,940 --> 00:36:38,139 pues bueno, tengo mi método 895 00:36:38,139 --> 00:36:40,840 remove, al que yo le paso la clave 896 00:36:40,840 --> 00:36:45,980 entonces la ventaja de los mapas es que yo puedo 897 00:36:45,980 --> 00:36:48,800 hacer operaciones basadas en la clave 898 00:36:48,800 --> 00:36:50,539 operaciones basadas en la clave 899 00:36:50,539 --> 00:36:52,579 cuando tengo set y list 900 00:36:52,579 --> 00:36:54,840 no puedo trabajar con clave, no hay clave 901 00:36:54,840 --> 00:36:56,800 yo tengo que pasar al remove el objeto 902 00:36:56,800 --> 00:36:58,820 entero y me borra uno 903 00:36:58,820 --> 00:37:00,719 igual que ese objeto, es un poco 904 00:37:00,719 --> 00:37:02,099 más farragoso y más complicado 905 00:37:02,099 --> 00:37:04,639 con un mapa le paso la clave 906 00:37:04,639 --> 00:37:06,460 y él me borra por clave 907 00:37:06,460 --> 00:37:08,820 pues este me va a 908 00:37:08,820 --> 00:37:10,739 borrar el alumno cuya clave sea esta 909 00:37:10,739 --> 00:37:12,579 por ejemplo 910 00:37:12,579 --> 00:37:14,619 entonces esa es la ventaja que tiene 911 00:37:14,619 --> 00:37:16,239 que es muy práctico para eso 912 00:37:16,239 --> 00:37:18,980 cuando yo tengo muy claro 913 00:37:18,980 --> 00:37:21,280 que mis objetos de mi aplicación 914 00:37:21,280 --> 00:37:22,500 tienen una clave asociada 915 00:37:22,500 --> 00:37:24,739 pues me va a ser mucho más fácil 916 00:37:24,739 --> 00:37:26,940 meter esos objetos en un mapa 917 00:37:26,940 --> 00:37:29,179 con la clave, porque luego ya borro 918 00:37:29,179 --> 00:37:31,260 por clave, recupero por clave, hago por clave 919 00:37:31,260 --> 00:37:33,679 lo que quiera, y es mucho más sencillo 920 00:37:33,679 --> 00:37:37,130 ¿qué quiero recuperar 921 00:37:37,130 --> 00:37:38,869 por clave? pues ya está 922 00:37:38,869 --> 00:37:40,469 tendré el método 923 00:37:40,469 --> 00:37:42,090 get por ahí 924 00:37:42,090 --> 00:37:45,130 le paso la clave y me dice cuál es el que tiene 925 00:37:45,130 --> 00:38:07,309 esa clave, bueno pues 926 00:38:07,309 --> 00:38:08,309 queda mucho más bonito 927 00:38:08,309 --> 00:38:10,889 hacer accesos por clave 928 00:38:10,889 --> 00:38:13,429 queda más bonito que para borrar 929 00:38:13,429 --> 00:38:14,989 tener que dar un objeto entero 930 00:38:14,989 --> 00:38:17,510 y decir, bórrame uno igual a este, eso es mucho más feo 931 00:38:17,510 --> 00:38:19,429 digo, bórrame el que tiene este DNI y ya está 932 00:38:19,429 --> 00:38:20,690 es mucho mejor 933 00:38:20,690 --> 00:38:22,750 pero para eso tengo que haberlo guardado en un mapa 934 00:38:22,750 --> 00:38:24,150 tengo que haberlo guardado en un mapa 935 00:38:24,150 --> 00:38:29,260 entonces es la ventaja que tiene 936 00:38:29,260 --> 00:38:31,500 los accesos por clave y ya está 937 00:38:31,500 --> 00:38:34,280 recorrer el map 938 00:38:34,280 --> 00:38:36,320 recorrer el map es un poquito 939 00:38:36,320 --> 00:38:37,179 más pesado 940 00:38:37,179 --> 00:38:39,980 es un poquito más pesado porque estos son pares 941 00:38:39,980 --> 00:38:42,260 entonces tengo que transformarlo 942 00:38:42,260 --> 00:38:43,599 primero 943 00:38:43,599 --> 00:38:46,159 puedo recorrer de muchas maneras 944 00:38:46,159 --> 00:38:46,980 un mapa en realidad 945 00:38:46,980 --> 00:38:49,800 pero una de las más sencillas 946 00:38:49,800 --> 00:38:52,739 tengo un método para transformarlo 947 00:38:52,739 --> 00:38:53,900 a un conjunto 948 00:38:53,900 --> 00:38:56,599 y luego ya iterar por ese conjunto 949 00:38:56,599 --> 00:38:58,079 como hemos iterado de toda la vida 950 00:38:58,079 --> 00:39:00,579 queda muy largo 951 00:39:00,579 --> 00:39:02,699 escrito porque el nombre de las clases es largo 952 00:39:02,699 --> 00:39:03,860 pero luego es una tontería 953 00:39:03,860 --> 00:39:06,760 entonces vamos a ver 954 00:39:06,760 --> 00:39:09,599 si volvemos a ver 955 00:39:09,599 --> 00:39:10,539 los métodos de 956 00:39:10,539 --> 00:39:15,389 ¿vale? lo que vamos a hacer ahora es 957 00:39:15,389 --> 00:39:16,389 recorrer el map 958 00:39:16,389 --> 00:39:21,909 ¿cómo recorrería uno un map para ver lo que tiene? 959 00:39:22,190 --> 00:39:23,449 para ver lo que tiene simplemente 960 00:39:23,449 --> 00:39:27,739 vale, pues bueno, si uno ve 961 00:39:27,739 --> 00:39:28,960 los métodos que tiene 962 00:39:28,960 --> 00:39:31,860 ¿veis? hay un 963 00:39:31,860 --> 00:39:33,880 contents key que también es muy práctico 964 00:39:33,880 --> 00:39:35,840 que te dice si hay algún par 965 00:39:35,840 --> 00:39:36,820 que tenga esa clave 966 00:39:36,820 --> 00:39:39,960 tiene un contents value que te dice si hay 967 00:39:39,960 --> 00:39:41,480 algún par que tenga ese valor 968 00:39:41,480 --> 00:39:42,679 que puede ser más de uno 969 00:39:42,679 --> 00:39:45,000 en este caso solo va a ser uno 970 00:39:45,000 --> 00:39:47,000 en caso de existir, en este caso puede ser más de uno 971 00:39:47,000 --> 00:39:48,760 entonces tiene una serie de métodos 972 00:39:48,760 --> 00:39:50,940 que bueno, te dice si está vacío 973 00:39:50,940 --> 00:39:53,619 ¿vale? 974 00:39:54,320 --> 00:39:54,659 y 975 00:39:54,659 --> 00:39:58,280 este método 976 00:39:58,280 --> 00:39:59,920 por ejemplo, el key set 977 00:39:59,920 --> 00:40:02,239 te devuelve un conjunto 978 00:40:02,239 --> 00:40:03,119 con las claves 979 00:40:03,119 --> 00:40:06,679 el key set devuelve un conjunto con las claves 980 00:40:06,679 --> 00:40:08,440 entonces 981 00:40:08,440 --> 00:40:10,219 este lo podemos usar 982 00:40:10,219 --> 00:40:12,159 para recorrer 983 00:40:12,159 --> 00:40:13,679 por ejemplo, si queremos, ¿vale? 984 00:40:13,679 --> 00:40:15,619 Xset te devuelve un set que tiene 985 00:40:15,619 --> 00:40:17,000 las claves, solamente. 986 00:40:17,599 --> 00:40:19,099 Solo las claves, los valores los ha quitado. 987 00:40:19,599 --> 00:40:20,860 Entonces, imaginaos que 988 00:40:20,860 --> 00:40:23,480 a ver, 989 00:40:28,699 --> 00:40:29,900 pues me voy a quedar yo con las 990 00:40:29,900 --> 00:40:30,480 claves 991 00:40:30,480 --> 00:40:33,780 de mis alumnos, que eran 992 00:40:33,780 --> 00:40:35,099 DNI, lo van en string, 993 00:40:38,699 --> 00:40:39,420 pues por ejemplo, 994 00:40:45,079 --> 00:40:45,880 estas serían 995 00:40:45,880 --> 00:40:49,239 solamente las claves, un conjunto 996 00:40:49,239 --> 00:40:49,900 con las claves. 997 00:40:51,260 --> 00:40:53,079 Y ahora ya, pues por ejemplo, 998 00:40:53,079 --> 00:40:54,400 puedo hacer esto, por ejemplo, 999 00:40:54,400 --> 00:40:56,300 Recorrer este conjunto 1000 00:40:56,300 --> 00:40:58,960 Para cada clave 1001 00:40:58,960 --> 00:41:01,960 En mi conjunto de claves 1002 00:41:01,960 --> 00:41:04,460 ¿Vale? Pues puedo hacer esto 1003 00:41:04,460 --> 00:41:07,239 Mostrar esa clave 1004 00:41:07,239 --> 00:41:18,630 Y el valor que hay en el mapa asociado a esa clave 1005 00:41:18,630 --> 00:41:20,309 Por ejemplo, voy a poner aquí abajo 1006 00:41:20,309 --> 00:41:25,849 Eh... 1007 00:41:25,849 --> 00:41:30,440 Alumno 1008 00:41:30,440 --> 00:41:33,659 Y ahora cojo del mapa de alumnos 1009 00:41:33,659 --> 00:41:36,579 El alumno asociado a esa clave 1010 00:41:36,579 --> 00:41:44,519 Por ejemplo 1011 00:41:44,519 --> 00:41:47,719 voy recorriendo todas las claves 1012 00:41:47,719 --> 00:41:48,739 que están en este set 1013 00:41:48,739 --> 00:41:50,960 y ahora muestro la clave 1014 00:41:50,960 --> 00:41:53,900 y el objeto alumno que está asociado a esa clave 1015 00:41:53,900 --> 00:41:55,599 recordad que get es el método para 1016 00:41:55,599 --> 00:41:56,500 recuperar por clave 1017 00:41:56,500 --> 00:41:59,420 aquí lo que pasa es que como lo he metido en un 1018 00:41:59,420 --> 00:42:00,460 system.out.println 1019 00:42:00,460 --> 00:42:03,500 el alumno como no tiene 1020 00:42:03,500 --> 00:42:05,019 un toString me lo va a mostrar raro 1021 00:42:05,019 --> 00:42:07,119 pues vamos a ponerle un toString alumno 1022 00:42:07,119 --> 00:42:09,440 para que me muestre el objeto alumno más bonito 1023 00:42:09,440 --> 00:42:11,760 le vamos a poner un toString 1024 00:42:11,760 --> 00:42:21,079 vale, ya tiene un toString 1025 00:42:21,079 --> 00:42:29,500 en el alumno. Entonces, si ejecutamos esto, voy a quitar el remove porque si no solamente 1026 00:42:29,500 --> 00:42:49,110 va a mostrar un alumno. Vamos a, pues aquí están los dos alumnos, ¿vale? Este es el 1027 00:42:49,110 --> 00:42:57,019 recorrido, el resultado de mi recorrido. DNI el alumno. Bueno, pues esta es una posibilidad 1028 00:42:57,019 --> 00:43:02,760 para recorrer el mapa. Y bueno, hay otra que mencionamos ahora. Paramos un momentito y 1029 00:43:02,760 --> 00:43:03,579 la mencionamos.