1 00:00:00,690 --> 00:00:15,109 Bueno, pues recordáis que estábamos en colecciones. Las colecciones son clases que me permiten tener un montón de objetos de un tipo alojados dentro de una única referencia. 2 00:00:15,109 --> 00:00:30,230 Yo tengo una lista de alumnos, pues a partir de esa lista de alumnos tengo un montón. Tengo un set de jugadores, pues a partir de ese objeto set, de ese único objeto set, tengo dentro un montón de cosas sobre las que iterar, etc. 3 00:00:30,230 --> 00:00:45,829 Esas eran las colecciones. Había dos tipos, listas y conjuntos, de las que entendemos las diferencias. En las listas cuenta el orden, en los conjuntos no hay orden que valga. Esa es la diferencia fundamental. 4 00:00:45,829 --> 00:00:49,369 y luego ya dentro de las listas y los conjuntos 5 00:00:49,369 --> 00:00:51,049 hay varias versiones 6 00:00:51,049 --> 00:00:52,829 listas pues ArrayList, LinkedList 7 00:00:52,829 --> 00:00:54,609 más o menos de ellas ya contamos mucho 8 00:00:54,609 --> 00:00:57,109 y luego en conjuntos las basadas 9 00:00:57,109 --> 00:00:59,310 en tabla hash como el hashSet 10 00:00:59,310 --> 00:01:00,250 y el LinkedHashSet 11 00:01:00,250 --> 00:01:02,189 y las basadas en árbol 12 00:01:02,189 --> 00:01:04,430 que no tienen nada que ver con la tabla hash 13 00:01:04,430 --> 00:01:07,049 las basadas en hash 14 00:01:07,049 --> 00:01:08,849 ya vimos lo que era la tabla hash 15 00:01:08,849 --> 00:01:11,030 por dentro como estaba 16 00:01:11,030 --> 00:01:14,989 como funcionaba el hashSet 17 00:01:14,989 --> 00:01:17,810 que primero hacía el código hash para irse a la posición 18 00:01:17,810 --> 00:01:20,930 de la tabla hash y luego a partir de ahí navegaba 19 00:01:20,930 --> 00:01:23,950 por la lista con el equals hasta encontrar el objeto 20 00:01:23,950 --> 00:01:26,549 bueno, todo eso ya lo contamos 21 00:01:26,549 --> 00:01:30,189 bueno, pues la versión que nos queda de los conjuntos 22 00:01:30,189 --> 00:01:33,409 es el triset que está pensada 23 00:01:33,409 --> 00:01:36,109 para optimizar las búsquedas 24 00:01:36,109 --> 00:01:38,989 ya el hash set optimiza mucho porque a través 25 00:01:38,989 --> 00:01:42,030 del código hash ya pum, ya te sitúa 26 00:01:42,030 --> 00:01:43,989 ya se elimina muchos y ya te sitúa 27 00:01:43,989 --> 00:01:45,969 solamente en una porción de ellos 28 00:01:45,969 --> 00:01:48,450 ya con la tabla H se hacen las búsquedas eficientes 29 00:01:48,450 --> 00:01:50,090 pero con el trisel se hacen todavía más 30 00:01:50,090 --> 00:01:51,370 bueno, pues 31 00:01:51,370 --> 00:01:53,810 esos que piensan y dicen 32 00:01:53,810 --> 00:01:56,269 a ver, ¿cómo programamos estructuras 33 00:01:56,269 --> 00:01:57,590 por dentro 34 00:01:57,590 --> 00:02:00,310 útiles? pues el que pensó 35 00:02:00,310 --> 00:02:02,349 la lista enlazada, que es así que la programamos 36 00:02:02,349 --> 00:02:03,609 aquí, todo eso 37 00:02:03,609 --> 00:02:05,530 pues ¿qué otra cosa se le ocurrió? 38 00:02:06,629 --> 00:02:07,629 pues se le ocurrió 39 00:02:07,629 --> 00:02:10,009 organizar los objetos 40 00:02:10,009 --> 00:02:10,750 en un árbol 41 00:02:10,750 --> 00:02:13,449 Organizar los objetos en un árbol 42 00:02:13,449 --> 00:02:14,870 Entonces 43 00:02:14,870 --> 00:02:19,319 Mis objetos 44 00:02:19,319 --> 00:02:24,289 Qué pein más raro 45 00:02:24,289 --> 00:02:24,889 ¿Qué es esto? 46 00:02:28,289 --> 00:02:29,830 ¿Dónde tengo aquí el cuadrado de toda la vida? 47 00:02:31,069 --> 00:02:34,259 ¿Eh? ¿Qué? 48 00:02:36,879 --> 00:02:38,520 Ya, ya, ya, pero yo quiero el cuadradito 49 00:02:38,520 --> 00:02:40,099 Ah, formas, joder, parezco tonta 50 00:02:40,099 --> 00:02:42,419 Vale, pues entonces 51 00:02:42,419 --> 00:02:44,240 Ya está 52 00:02:44,240 --> 00:02:48,060 Vale, pues este es un objeto 53 00:02:48,060 --> 00:02:50,219 Este es otro objeto 54 00:02:50,219 --> 00:02:51,560 Este es otro objeto 55 00:02:51,560 --> 00:02:54,259 Este es otro, este es otro 56 00:02:54,259 --> 00:02:55,280 Este es otro 57 00:02:55,280 --> 00:02:58,099 Estos son mi mogollón de objetos 58 00:02:58,099 --> 00:03:00,020 Que yo quiero gestionar 59 00:03:00,020 --> 00:03:01,759 Fácilmente 60 00:03:01,759 --> 00:03:04,240 Entonces ya sabéis que la opción 61 00:03:04,240 --> 00:03:06,159 Básica es 62 00:03:06,159 --> 00:03:08,120 Ah, la tosa una raíz, venga, tosa una raíz 63 00:03:08,120 --> 00:03:09,439 Papapapa, tosa una raíz 64 00:03:09,439 --> 00:03:12,120 Pero ya sabemos por qué los a raíz 65 00:03:12,120 --> 00:03:13,539 Nos son a veces costosos 66 00:03:13,539 --> 00:03:15,080 Y por eso se hacen las colecciones 67 00:03:15,080 --> 00:03:17,039 Bueno, pues que otra opción tenemos 68 00:03:17,039 --> 00:03:19,460 Pues que 69 00:03:19,460 --> 00:03:21,259 A cada nodo de estos 70 00:03:21,259 --> 00:03:52,259 a cada objeto de estos, además de su dato en sí, le acompañe la dirección del nodo de la izquierda y la dirección del nodo de la derecha. 71 00:03:52,259 --> 00:03:55,439 luego este objeto tiene el dato en sí 72 00:03:55,439 --> 00:03:57,199 el alumno, el jugador, lo que sea 73 00:03:57,199 --> 00:04:00,099 y luego además tiene la dirección del objeto de la izquierda 74 00:04:00,099 --> 00:04:01,340 y la dirección del objeto de la derecha 75 00:04:01,340 --> 00:04:03,520 es igual que una lista enlazada 76 00:04:03,520 --> 00:04:06,400 que al dato en sí le acompañaba la dirección del siguiente 77 00:04:06,400 --> 00:04:10,379 pues aquí al dato en sí le acompañan dos direcciones ahora 78 00:04:10,379 --> 00:04:13,939 le acompaña la dirección del de la derecha y la dirección de la izquierda 79 00:04:13,939 --> 00:04:17,819 ahora este objeto tendrá el nodo en sí 80 00:04:17,819 --> 00:04:19,959 o sea el dato en sí, el jugador, el alumno, lo que sea 81 00:04:19,959 --> 00:04:25,300 y además le acompaña la dirección del objeto de la izquierda 82 00:04:25,300 --> 00:04:27,480 y la dirección del objeto de la derecha. 83 00:04:28,519 --> 00:04:30,720 Y así se construye un árbol binario 84 00:04:30,720 --> 00:04:38,959 que optimiza la iteración, optimiza la consulta. 85 00:04:39,720 --> 00:04:42,220 ¿Por qué? ¿Qué se hace? Se le ordena. 86 00:04:42,740 --> 00:04:44,199 Esto podría hacerse aleatoriamente. 87 00:04:44,699 --> 00:04:46,120 Estar ahí, pues no, se le ordena. 88 00:04:46,379 --> 00:04:49,040 Todos los elementos mayores que este 89 00:04:49,040 --> 00:04:51,160 van a su izquierda 90 00:04:51,160 --> 00:04:53,759 todos los mayores que este van a su izquierda 91 00:04:53,759 --> 00:04:55,339 todos los menores van a su derecha 92 00:04:55,339 --> 00:04:56,680 todos los menores van a su derecha 93 00:04:56,680 --> 00:04:58,500 entonces cuando hay que hacer una consulta 94 00:04:58,500 --> 00:05:00,879 pues se van comparando con el mayor que, menor que 95 00:05:00,879 --> 00:05:01,699 se van comparando 96 00:05:01,699 --> 00:05:03,779 es mayor que, ah pues está aquí 97 00:05:03,779 --> 00:05:05,660 y todos estos ya no tengo que recoger 98 00:05:05,660 --> 00:05:08,779 en una lista tienes que pasar por todos 99 00:05:08,779 --> 00:05:10,279 en una lista para llegar a uno 100 00:05:10,279 --> 00:05:12,720 es obligatorio pasar por todos 101 00:05:12,720 --> 00:05:13,439 no hay tutía 102 00:05:13,439 --> 00:05:15,860 cuando tienes una lista enlazada quieres llegar a este 103 00:05:15,860 --> 00:05:17,420 tienes que empezar en el primero 104 00:05:17,420 --> 00:05:20,279 eso es lo que hace el linked list por dentro 105 00:05:20,279 --> 00:05:21,720 para nosotros 106 00:05:21,720 --> 00:05:24,139 es transparente, nosotros llamamos a los métodos 107 00:05:24,139 --> 00:05:26,079 a remove, lo que sea 108 00:05:26,079 --> 00:05:28,199 y nos olvidamos, pero lo que hace 109 00:05:28,199 --> 00:05:30,019 él por dentro es colocarse 110 00:05:30,019 --> 00:05:32,339 en el primero e ir avanzando por todos 111 00:05:32,339 --> 00:05:33,759 es lo que hace por dentro, es un rollo 112 00:05:33,759 --> 00:05:35,519 pues este 113 00:05:35,519 --> 00:05:38,000 lo que hace por dentro es un poco 114 00:05:38,000 --> 00:05:40,120 más sencillo, porque no tiene que pasar por todos 115 00:05:40,120 --> 00:05:41,180 para llegar a este 116 00:05:41,180 --> 00:05:44,300 pasa por este y se acabó, no pasa por ninguno más 117 00:05:44,300 --> 00:05:46,120 todos los demás no tiene por qué pasar 118 00:05:46,120 --> 00:05:48,839 en una lista enlazada, como estarían todos en fila 119 00:05:48,839 --> 00:05:50,939 para llegar a uno, hay que pasar 120 00:05:50,939 --> 00:05:52,860 por todos, entonces es 121 00:05:52,860 --> 00:05:54,980 mucho más eficiente los recorridos 122 00:05:54,980 --> 00:05:56,560 en el árbol, porque 123 00:05:56,560 --> 00:05:58,860 llegas antes al nodo objetivo 124 00:05:58,860 --> 00:06:00,779 que en una lista, que están todos en fila 125 00:06:00,779 --> 00:06:02,660 entonces la idea, pues está bien 126 00:06:02,660 --> 00:06:03,399 la idea es buena 127 00:06:03,399 --> 00:06:06,740 lo que pasa es que luego hay que programarla 128 00:06:06,740 --> 00:06:08,259 y claro, no la vamos a programar nosotros 129 00:06:08,259 --> 00:06:10,480 porque ya está hecha, pero podríamos 130 00:06:10,480 --> 00:06:12,540 no es tan complicada, tendríamos que hacer 131 00:06:12,540 --> 00:06:14,720 una clase nodo, como hacíamos en la lista enlazada 132 00:06:14,720 --> 00:06:16,480 que la clase nodo tenía 133 00:06:16,480 --> 00:06:17,759 la propiedad valor 134 00:06:17,759 --> 00:06:21,180 y luego la propiedad siguiente nodo 135 00:06:21,180 --> 00:06:23,100 queda la misma y siguiente, pues aquí tendrá 136 00:06:23,100 --> 00:06:24,600 la propiedad valor 137 00:06:24,600 --> 00:06:26,480 nodo izquierda y nodo derecha 138 00:06:26,480 --> 00:06:28,839 y a partir de ahí lo podríamos 139 00:06:28,839 --> 00:06:30,699 programar esta estructura como hicimos 140 00:06:30,699 --> 00:06:32,740 la lista enlazada, igual, pero bueno 141 00:06:32,740 --> 00:06:34,759 no tiene sentido perder tiempo 142 00:06:34,759 --> 00:06:36,000 en eso porque ya lo está 143 00:06:36,000 --> 00:06:38,660 ¿esto está programado? sí, está programado 144 00:06:38,660 --> 00:06:39,519 el objeto triset 145 00:06:39,519 --> 00:06:44,439 bueno, pero ¿qué tenemos 146 00:06:44,439 --> 00:06:45,740 que saber para usarlo bien? 147 00:06:46,279 --> 00:06:49,019 yo he dicho muy alegremente antes 148 00:06:49,019 --> 00:06:49,740 sin pararme 149 00:06:49,740 --> 00:06:52,660 que todos los inferiores a este 150 00:06:52,660 --> 00:06:54,860 van a su izquierda y todos los superiores van a su derecha 151 00:06:54,860 --> 00:06:57,079 y aquí igual, todos los inferiores van a su izquierda 152 00:06:57,079 --> 00:06:57,980 y todos los superiores van a su derecha 153 00:06:57,980 --> 00:06:59,779 pero claro, inferior, superior 154 00:06:59,779 --> 00:07:01,379 da igual 155 00:07:01,379 --> 00:07:04,620 da lo mismo 156 00:07:04,620 --> 00:07:05,420 porque es como 157 00:07:05,420 --> 00:07:10,259 es como este hecho por dentro 158 00:07:10,259 --> 00:07:14,240 supongo que estará hecho 159 00:07:14,240 --> 00:07:16,579 si esto es un grafo, de teoría de grafos 160 00:07:16,579 --> 00:07:18,240 entiendo que 161 00:07:18,240 --> 00:07:20,600 es que no hay 162 00:07:20,600 --> 00:07:22,100 izquierda o derecha, es que no hay un plano 163 00:07:22,100 --> 00:07:24,620 me refiero, es que yo lo dibujo en un plano 164 00:07:24,620 --> 00:07:26,279 pero no es que exista izquierda o derecha 165 00:07:26,279 --> 00:07:28,100 eso lo que hay es un nodo 166 00:07:28,100 --> 00:07:30,379 tiene nodo izquierda y nodo derecha 167 00:07:30,379 --> 00:07:32,480 y cada nodo, o sea, hay dos direcciones 168 00:07:32,480 --> 00:07:34,319 de memoria, cuando tú las dibujas 169 00:07:34,319 --> 00:07:35,959 me da igual donde las dibujo 170 00:07:35,959 --> 00:07:38,699 físicamente es que no hay un nodo izquierda y un nodo derecha 171 00:07:38,699 --> 00:07:40,139 o sea, lo que hay es 172 00:07:40,139 --> 00:07:42,040 nodo para un lado y nodo para el otro 173 00:07:42,040 --> 00:07:44,680 ¿vale? no hay izquierda y derecha 174 00:07:44,680 --> 00:07:45,360 físicamente 175 00:07:45,360 --> 00:07:47,879 es como decir si hay arriba y abajo en el universo 176 00:07:47,879 --> 00:07:49,240 tú lo puedes dibujar, pero no lo hay 177 00:07:49,240 --> 00:07:52,920 pues aquí lo que hay es nodos y dos direcciones 178 00:07:52,920 --> 00:07:53,720 una 179 00:07:53,720 --> 00:07:56,079 te lleva hacia los mayores 180 00:07:56,079 --> 00:07:57,240 y otra hacia los menores 181 00:07:57,240 --> 00:07:59,759 ¿vale? entonces cada nodo tiene 182 00:07:59,759 --> 00:08:01,819 su valor y dos direcciones 183 00:08:01,819 --> 00:08:04,240 la dirección que te lleva a los que son mayores que él 184 00:08:04,240 --> 00:08:06,699 y la dirección que te lleva a los que son menores que él 185 00:08:06,699 --> 00:08:08,439 si tú quieres hacer un dibujo 186 00:08:08,439 --> 00:08:10,040 de eso, pues 187 00:08:10,040 --> 00:08:11,459 dibújalo como quieras 188 00:08:11,459 --> 00:08:12,360 pero vamos que en sí 189 00:08:12,360 --> 00:08:17,519 no es que no esté predefinido 190 00:08:17,519 --> 00:08:19,060 es que no es un concepto 191 00:08:19,060 --> 00:08:20,079 que exista 192 00:08:20,079 --> 00:08:21,939 no es un concepto que tenga sentido 193 00:08:21,939 --> 00:08:24,079 lo que hay físicamente 194 00:08:24,079 --> 00:08:25,540 lo que está programado es 195 00:08:25,540 --> 00:08:26,879 ese objeto nodo 196 00:08:26,879 --> 00:08:28,800 que tiene luego dos direcciones 197 00:08:28,800 --> 00:08:30,079 y una dirección es 198 00:08:30,079 --> 00:08:31,779 la dirección que me llevan los objetos 199 00:08:31,779 --> 00:08:32,799 que son mayores que yo 200 00:08:32,799 --> 00:08:35,059 pero no es que haya un espacio 201 00:08:35,059 --> 00:08:38,320 no sé si me explico 202 00:08:38,320 --> 00:08:39,820 no hay un dibujo ahí 203 00:08:39,820 --> 00:08:42,360 Esa sí es la pregunta. 204 00:08:42,840 --> 00:08:44,120 Esa sí, claro. 205 00:08:44,320 --> 00:08:46,240 Entonces, eso era justo lo que estaba diciendo. 206 00:08:46,399 --> 00:08:47,379 Yo he dicho antes, 207 00:08:49,000 --> 00:08:50,200 cada nodo te apunta 208 00:08:50,200 --> 00:08:51,820 a 209 00:08:51,820 --> 00:08:53,820 los que son mayores que tú 210 00:08:53,820 --> 00:08:55,779 hacia este lado, a través de esta dirección. 211 00:08:55,840 --> 00:08:58,159 Los que son mayores que tú hacia otro. Y lo he dicho así alegremente, 212 00:08:58,279 --> 00:08:59,519 pero claro, ahora la pregunta sería 213 00:08:59,519 --> 00:09:01,980 ¿y qué significa ser mayor 214 00:09:01,980 --> 00:09:02,759 o ser menor? 215 00:09:03,720 --> 00:09:05,940 Pues otra vez tenemos, volvemos a lo mismo. 216 00:09:06,600 --> 00:09:08,220 Hay clases en Java en los cuales 217 00:09:08,220 --> 00:09:10,340 el orden está definido y ya es natural 218 00:09:10,340 --> 00:09:12,220 que es la de los números 219 00:09:12,220 --> 00:09:13,740 y la de los char 220 00:09:13,740 --> 00:09:16,440 ya está, los números y los char 221 00:09:16,440 --> 00:09:18,379 tienen su orden natural, al que podemos 222 00:09:18,379 --> 00:09:20,039 acceder con el menor que y mayor que 223 00:09:20,039 --> 00:09:22,279 entonces 224 00:09:22,279 --> 00:09:24,419 eso está claro, pero ¿y el resto de los 225 00:09:24,419 --> 00:09:26,320 objetos? pues al resto 226 00:09:26,320 --> 00:09:28,580 de los objetos hay que darles desde arriba 227 00:09:28,580 --> 00:09:29,320 el orden 228 00:09:29,320 --> 00:09:32,259 ¿cómo? implementando el comparable y el 229 00:09:32,259 --> 00:09:34,120 comparétum, pues aquí 230 00:09:34,120 --> 00:09:36,120 es obligatorio que 231 00:09:36,120 --> 00:09:38,200 todas las clases que vayan a formar 232 00:09:38,200 --> 00:09:40,379 parte de un triset, aquí ya sí que sí 233 00:09:40,379 --> 00:09:42,100 es obligatorio que implementen 234 00:09:42,100 --> 00:09:44,039 comparable, porque el triset 235 00:09:44,039 --> 00:09:46,440 por dentro, necesita 236 00:09:46,440 --> 00:09:48,039 comparar unos con otros para 237 00:09:48,039 --> 00:09:50,059 decidir si yo te llevo a colgar 238 00:09:50,059 --> 00:09:51,960 del nodo de los mayores 239 00:09:51,960 --> 00:09:53,679 o te llevo a colgar del nodo de los menores 240 00:09:53,679 --> 00:09:55,779 entonces si yo uso un triset 241 00:09:55,779 --> 00:09:58,299 es obligatorio que la clase 242 00:09:58,299 --> 00:10:00,179 a la que pertenecen los objetos 243 00:10:00,179 --> 00:10:01,779 del triset, implemente comparable 244 00:10:01,779 --> 00:10:03,059 ¿vale? 245 00:10:03,860 --> 00:10:05,559 porque es lo que usa el triset 246 00:10:05,559 --> 00:10:26,559 Bueno, pues entonces, por ejemplo, aquí, pues nada, vamos a meter, ¿vale? Vamos a meter, por ejemplo, pues, ¿qué metemos en el triset? ¿Qué entidad? ¿Qué metemos? Que no sean alumnos, ni clientes, ni facturas, ni... 247 00:10:26,559 --> 00:10:31,399 Venga, vamos a meter ciudades 248 00:10:31,399 --> 00:10:32,940 Ala 249 00:10:32,940 --> 00:10:35,159 Tengo mi clase ciudad 250 00:10:35,159 --> 00:10:38,620 Y la clase ciudad 251 00:10:38,620 --> 00:10:39,679 Pues tiene el nombre 252 00:10:39,679 --> 00:10:42,340 Y tiene el número de habitantes 253 00:10:42,340 --> 00:10:50,450 Vale, y ahora vamos a trabajar con conjuntos de ciudades 254 00:10:50,450 --> 00:10:51,990 Pues para ver que ciudades 255 00:10:51,990 --> 00:10:53,429 Tienen más habitantes que otras 256 00:10:53,429 --> 00:10:54,590 Etcétera 257 00:10:54,590 --> 00:11:04,799 Aquí tenemos el constructor 258 00:11:04,799 --> 00:11:10,279 Y Getty Set 259 00:11:10,279 --> 00:11:17,509 Vale, pues ya está 260 00:11:17,509 --> 00:11:18,450 Esta es nuestra ciudad 261 00:11:18,450 --> 00:11:19,529 ahora 262 00:11:19,529 --> 00:11:23,009 queremos una aplicación para gestionar ciudades 263 00:11:23,009 --> 00:11:24,629 para gestionar 264 00:11:24,629 --> 00:11:28,720 para ordenar 265 00:11:28,720 --> 00:11:29,700 para, bueno 266 00:11:29,700 --> 00:11:32,679 pocas cosas se pueden hacer si solamente tenemos el nombre 267 00:11:32,679 --> 00:11:34,600 y la cantidad de habitantes, pero bueno 268 00:11:34,600 --> 00:11:36,500 pues venga 269 00:11:36,500 --> 00:11:37,840 hacemos ya ahora el main 270 00:11:37,840 --> 00:11:49,679 entonces vamos a gestionar un montón de ciudades 271 00:11:49,679 --> 00:11:51,299 de nuevo, lo de siempre 272 00:11:51,299 --> 00:11:53,799 las meto en un array, vaya rollo meterlas en un array 273 00:11:53,799 --> 00:11:54,879 venga, no, una colección 274 00:11:54,879 --> 00:11:57,480 ¿qué colección? 275 00:11:57,480 --> 00:11:58,940 Venga, pues vamos a usar un tríceps 276 00:11:58,940 --> 00:12:00,840 Pues entonces 277 00:12:00,840 --> 00:12:21,710 ¡Hala! Pues ahí se queda 278 00:12:21,710 --> 00:12:36,259 Efectivamente 279 00:12:36,259 --> 00:12:50,059 Vale 280 00:12:50,059 --> 00:12:58,080 Vale, pues yo he elegido tríceps 281 00:12:58,080 --> 00:12:59,620 Porque me han dicho que es muy eficiente 282 00:12:59,620 --> 00:13:00,440 Que está muy bien 283 00:13:00,440 --> 00:13:04,179 Bueno, y ya puedo trabajar 284 00:13:04,179 --> 00:13:06,159 Igual que trabajo con cualquier conjunto 285 00:13:06,159 --> 00:13:08,720 Igual que trabajo con cualquier conjunto 286 00:13:08,720 --> 00:13:12,379 Sabiendo lo que sabemos de los conjuntos 287 00:13:12,379 --> 00:13:14,179 Y es que no admiten duplicados 288 00:13:14,179 --> 00:13:15,539 Que no admiten duplicados 289 00:13:15,539 --> 00:13:19,179 entonces, pues venga, yo no voy a meter ciudades repetidas 290 00:13:19,179 --> 00:13:20,740 pues yo voy a empezar a meter ciudades 291 00:13:20,740 --> 00:13:22,659 así a lo bestia, a ver qué pasa 292 00:13:22,659 --> 00:13:24,399 y ya sabemos los métodos 293 00:13:24,399 --> 00:13:26,600 para las colecciones, el add para añadir 294 00:13:26,600 --> 00:13:28,259 el remove para borrar un elemento 295 00:13:28,259 --> 00:13:31,240 el contains para ver si lo tiene 296 00:13:31,240 --> 00:13:32,720 add all para añadir 297 00:13:32,720 --> 00:13:34,559 muchos de golpe, remove all para añadir 298 00:13:34,559 --> 00:13:36,720 muchos de golpe, ya sabemos los métodos 299 00:13:36,720 --> 00:13:37,779 si no lo sabemos ya de memoria 300 00:13:37,779 --> 00:13:40,500 bueno, pues aquí mismo también podemos usar esos métodos 301 00:13:40,500 --> 00:13:42,700 por ejemplo, vamos a 302 00:13:42,700 --> 00:13:43,679 añadir una ciudad 303 00:13:43,679 --> 00:13:48,250 ¿Vale? Todavía no he hecho el comparable 304 00:13:48,250 --> 00:13:50,529 Porque vamos a ver efectivamente el problema que nos da 305 00:13:50,529 --> 00:13:51,809 Venga 306 00:13:51,809 --> 00:13:55,330 A la Madrid 307 00:13:55,330 --> 00:13:59,769 Tenemos esta ciudad 308 00:13:59,769 --> 00:14:26,639 Vale, entonces sabemos recorrer 309 00:14:26,639 --> 00:14:27,740 Un set 310 00:14:27,740 --> 00:14:30,299 Sabemos que con un for de índice no 311 00:14:30,299 --> 00:14:31,279 Porque no hay posiciones 312 00:14:31,279 --> 00:14:33,720 Pero podemos recorrer con un iterador o un for each 313 00:14:33,720 --> 00:14:35,500 Si solamente vamos a consultar 314 00:14:35,500 --> 00:14:37,659 Pues bueno, un for each 315 00:14:37,659 --> 00:14:38,220 No es grave 316 00:14:38,220 --> 00:14:42,789 Pues venga, vamos a ver cada ciudad 317 00:14:42,789 --> 00:14:53,360 Vale, vamos a poner un toString 318 00:14:53,360 --> 00:14:54,259 en ciudad 319 00:14:54,259 --> 00:14:57,940 y así le paso directamente el objeto al system.println 320 00:14:57,940 --> 00:14:59,039 o ponemos un toString 321 00:14:59,039 --> 00:15:02,230 que no nos cuesta nada 322 00:15:02,230 --> 00:15:07,940 vale, y el compilador 323 00:15:07,940 --> 00:15:09,700 pues está encantado 324 00:15:09,700 --> 00:15:11,419 porque 325 00:15:11,419 --> 00:15:14,259 hemos usado el set correctamente 326 00:15:14,259 --> 00:15:15,679 pero a mí se me ha olvidado poner aquí 327 00:15:15,679 --> 00:15:17,700 esto, vale 328 00:15:17,700 --> 00:15:20,179 hemos usado el set correctamente 329 00:15:20,179 --> 00:15:22,179 hemos añadido que es un método 330 00:15:22,179 --> 00:15:24,019 de set, hemos recorrido 331 00:15:24,019 --> 00:15:24,960 lo hemos usado muy bien 332 00:15:24,960 --> 00:15:29,200 Porque todos los conjuntos se usan igual 333 00:15:29,200 --> 00:15:31,779 Se añade, se borra, se recorre 334 00:15:31,779 --> 00:15:32,639 Todos iguales 335 00:15:32,639 --> 00:15:36,100 Pues venga, ahora vamos a ejecutar esto 336 00:15:36,100 --> 00:15:37,139 A ver qué pasa 337 00:15:37,139 --> 00:15:41,309 Lo ejecutamos y efectivamente 338 00:15:41,309 --> 00:15:42,590 Me dice, oye 339 00:15:42,590 --> 00:15:49,230 Si leemos que esto es fundamental 340 00:15:49,230 --> 00:15:51,169 Me dice, espérate tú 341 00:15:51,169 --> 00:15:54,029 La ciudad esta 342 00:15:54,029 --> 00:15:57,080 Yo no puedo 343 00:15:57,080 --> 00:15:59,659 Hacerle un casting a comparable 344 00:15:59,659 --> 00:16:01,059 No puedo 345 00:16:01,059 --> 00:16:04,340 traducido al lenguaje natural 346 00:16:04,340 --> 00:16:06,299 es que yo no sé 347 00:16:06,299 --> 00:16:10,659 traducido al lenguaje natural 348 00:16:10,659 --> 00:16:11,179 es 349 00:16:11,179 --> 00:16:13,559 oye, yo soy el triset 350 00:16:13,559 --> 00:16:15,580 yo soy el triset 351 00:16:15,580 --> 00:16:17,240 y he intentado 352 00:16:17,240 --> 00:16:19,299 cuando me he cogido cada nodo decir 353 00:16:19,299 --> 00:16:21,940 tú eres mayor que este o menor, a ver de dónde te hago colgar 354 00:16:21,940 --> 00:16:23,259 y no he sabido 355 00:16:23,259 --> 00:16:25,539 no he sabido quién es mayor y quién es menor 356 00:16:25,539 --> 00:16:27,919 entonces como no he sabido quién es mayor y quién es menor 357 00:16:27,919 --> 00:16:29,399 no puedo meter en el triset 358 00:16:29,399 --> 00:16:30,779 y ahí se ha quejado 359 00:16:30,779 --> 00:16:32,779 claro, porque efectivamente 360 00:16:32,779 --> 00:16:34,720 un triset para gestionar 361 00:16:34,720 --> 00:16:36,379 sus objetos por dentro 362 00:16:36,379 --> 00:16:39,000 para gestionarlos, necesita saber 363 00:16:39,000 --> 00:16:40,379 cuál es mayor y cuál es menor 364 00:16:40,379 --> 00:16:41,539 compararlos entre sí 365 00:16:41,539 --> 00:16:43,480 y las ciudades 366 00:16:43,480 --> 00:16:46,399 no tienen un criterio de comparación natural 367 00:16:46,399 --> 00:16:48,039 si yo no se lo doy, no son como los números 368 00:16:48,039 --> 00:16:50,980 entonces, ¿cómo dábamos criterios 369 00:16:50,980 --> 00:16:51,659 de comparación 370 00:16:51,659 --> 00:16:54,659 a los objetos que no eran 371 00:16:54,659 --> 00:16:55,500 números ni char? 372 00:16:56,220 --> 00:16:58,120 pues haciéndoles implementar 373 00:16:58,120 --> 00:17:03,470 la interfaz, de esta manera 374 00:17:03,470 --> 00:17:05,609 ¿verdad? 375 00:17:06,710 --> 00:17:07,730 si le hacíamos implementar 376 00:17:07,730 --> 00:17:10,509 implementamos la interfaz 377 00:17:10,509 --> 00:17:12,670 comparable del objeto en particular 378 00:17:12,670 --> 00:17:14,609 y ahora ya al implementar 379 00:17:14,609 --> 00:17:16,549 comparable pues tenemos que 380 00:17:16,549 --> 00:17:18,869 añadir 381 00:17:18,869 --> 00:17:20,470 el método que 382 00:17:20,470 --> 00:17:20,809 falta 383 00:17:20,809 --> 00:17:23,250 y aquí 384 00:17:23,250 --> 00:17:26,650 es donde ponemos ya nuestro criterio de ordenación 385 00:17:26,650 --> 00:17:28,369 y aquí lo tenemos que 386 00:17:28,369 --> 00:17:29,750 decidir 387 00:17:29,750 --> 00:17:31,230 aquí tenemos que decidir 388 00:17:31,230 --> 00:17:32,869 esto pasa 389 00:17:32,869 --> 00:17:41,210 por decidir primero qué propiedad es la que identifica a mi clase de forma única. 390 00:17:41,670 --> 00:17:44,349 Lo normal para que un diseño esté bien hecho, lo natural, 391 00:17:44,869 --> 00:17:48,609 es que haya una única propiedad que me sirva como clave primaria. 392 00:17:49,250 --> 00:17:52,109 Pero como haya claves primarias múltiples ya se complica un montón. 393 00:17:53,450 --> 00:17:57,450 Por eso en las claves, yo no sé más o menos en bases de datos, en diseño, 394 00:17:57,589 --> 00:17:59,890 en qué estáis haciendo en general. 395 00:17:59,890 --> 00:18:03,930 pero normalmente veréis que en las tablas 396 00:18:03,930 --> 00:18:06,690 cuando no hay una clave primaria natural 397 00:18:06,690 --> 00:18:09,529 o sea, tenéis un alumno, nombre, apellido, edad, no sé qué 398 00:18:09,529 --> 00:18:13,950 y a veces se crea siempre un campo id 399 00:18:13,950 --> 00:18:16,309 que además se le pone que es autoincrement 400 00:18:16,309 --> 00:18:19,150 y además haciéndole autoincrement 401 00:18:19,150 --> 00:18:21,369 uno tiene la seguridad de que va a ser único 402 00:18:21,369 --> 00:18:23,109 distinto para cada campo 403 00:18:23,109 --> 00:18:26,829 y así tenemos además una clave primaria 404 00:18:26,829 --> 00:18:28,490 en un solo valor 405 00:18:28,490 --> 00:18:31,009 ¿habéis trabajado con tablas 406 00:18:31,009 --> 00:18:32,630 con claves primarias múltiples? 407 00:18:34,130 --> 00:18:36,930 ¿o la clave primaria siempre ha sido un campo? 408 00:18:41,880 --> 00:18:43,859 pues es una clave primaria múltiple 409 00:18:43,859 --> 00:18:45,079 que son dos campos 410 00:18:45,079 --> 00:18:49,640 en general es recomendable 411 00:18:49,640 --> 00:18:52,740 que las claves primarias 412 00:18:52,740 --> 00:18:54,380 se puedan recoger en un solo campo 413 00:18:54,380 --> 00:18:58,400 porque facilita muchísimo el trabajo con esos datos 414 00:18:58,400 --> 00:19:02,019 y por eso cuando hay una tabla 415 00:19:02,019 --> 00:19:03,240 que tiene una clave 416 00:19:03,240 --> 00:19:04,920 que tiene claves primarias dobles 417 00:19:04,920 --> 00:19:08,299 se suele generar un campo extra 418 00:19:08,299 --> 00:19:10,460 de tipo autoincrement 419 00:19:10,460 --> 00:19:12,140 y de que pueda hacer 420 00:19:12,140 --> 00:19:12,980 de clave primaria 421 00:19:12,980 --> 00:19:15,779 a ver, para qué quiero decir yo este rollo 422 00:19:15,779 --> 00:19:17,779 pues que en un buen diseño de clases 423 00:19:17,779 --> 00:19:18,940 también suele ocurrir lo mismo 424 00:19:18,940 --> 00:19:21,539 lo natural es que, y en el trícel sobre todo es fundamental 425 00:19:21,539 --> 00:19:22,359 para fitar el orden 426 00:19:22,359 --> 00:19:24,140 que haya un único campo 427 00:19:24,140 --> 00:19:26,980 que sea el campo que permita distinguir de forma única 428 00:19:26,980 --> 00:19:29,160 En este caso estaría claro 429 00:19:29,160 --> 00:19:31,779 ¿Qué distingue de forma única una ciudad de otro? 430 00:19:32,579 --> 00:19:33,259 El nombre 431 00:19:33,259 --> 00:19:35,279 Porque pueden tener dos ciudades los mismos habitantes 432 00:19:35,279 --> 00:19:35,940 El nombre 433 00:19:35,940 --> 00:19:38,500 Pues entonces tenemos una clave primaria 434 00:19:38,500 --> 00:19:40,619 Vale, pues entonces ahora ya 435 00:19:40,619 --> 00:19:42,640 Establecemos el orden 436 00:19:42,640 --> 00:19:44,319 En función de ese campo 437 00:19:44,319 --> 00:19:46,859 Tenemos que establecer el orden en función de ese campo 438 00:19:46,859 --> 00:19:49,039 Bueno, pues aquí como el campo 439 00:19:49,039 --> 00:19:50,640 Primario es 440 00:19:50,640 --> 00:19:51,880 Un string 441 00:19:51,880 --> 00:19:55,140 Aquí lo natural es que el orden que fijemos 442 00:19:55,140 --> 00:19:55,980 Sea el alfabético 443 00:19:55,980 --> 00:19:59,720 entonces uno decide, tiene que decidir un orden 444 00:19:59,720 --> 00:20:01,460 si quiere que esto 445 00:20:01,460 --> 00:20:03,359 forme parte de un tríceps, tiene que decidir un orden 446 00:20:03,359 --> 00:20:05,140 eso es incuestionable 447 00:20:05,140 --> 00:20:06,039 tiene que decidir un orden 448 00:20:06,039 --> 00:20:08,279 ¿cómo decide ese orden? ¿como le dé la gana? 449 00:20:08,759 --> 00:20:11,039 pues no, lo normal es que se vaya 450 00:20:11,039 --> 00:20:13,400 al campo que está funcionando 451 00:20:13,400 --> 00:20:14,460 como clave primaria 452 00:20:14,460 --> 00:20:17,559 al que distingue de forma única a los objetos 453 00:20:17,559 --> 00:20:19,259 en nuestro caso 454 00:20:19,259 --> 00:20:20,099 es esta propiedad 455 00:20:20,099 --> 00:20:23,640 y ahora ya en esa propiedad decide el orden 456 00:20:23,640 --> 00:20:25,119 pues si es un string 457 00:20:25,119 --> 00:20:37,519 El alfabético es el natural. Si es un número, pues el orden natural de los numeritos. Bueno, pues en nuestro caso el orden que tendría sentido decidir aquí para las ciudades es que se ordenen por orden alfabético de nombre. 458 00:20:38,359 --> 00:20:49,220 Bueno, pues una vez que ya tenemos claro que el orden que nos pega y que viene bien ahí es el orden alfabético por nombre, desde luego no tendría sentido ordenarlos por número de habitantes. 459 00:20:49,220 --> 00:20:51,299 porque ¿qué pasa con dos ciudades con el mismo 460 00:20:51,299 --> 00:20:53,359 número de habitantes? son dos ciudades 461 00:20:53,359 --> 00:20:54,180 distintas 462 00:20:54,180 --> 00:20:57,420 no tendría sentido ordenarlos así, tiene sentido ordenarlos por nombre 463 00:20:57,420 --> 00:20:58,359 que es lo que lo distingue 464 00:20:58,359 --> 00:21:01,480 pues una vez que hemos identificado que eso es el criterio que queremos 465 00:21:01,480 --> 00:21:03,720 nos vamos ya 466 00:21:03,720 --> 00:21:05,400 a programar el método 467 00:21:05,400 --> 00:21:08,259 y esto ya lo hemos hecho otras veces 468 00:21:08,259 --> 00:21:10,180 pues la clase string 469 00:21:10,180 --> 00:21:11,319 tiene el compareTo 470 00:21:11,319 --> 00:21:13,619 para comparar alfabéticamente 471 00:21:13,619 --> 00:21:16,259 entonces podríamos hacer 472 00:21:16,259 --> 00:21:17,559 esto 473 00:21:17,559 --> 00:21:21,660 y ya lo tenemos 474 00:21:21,660 --> 00:21:25,299 nombre es el nombre de la ciudad que llama el método 475 00:21:25,299 --> 00:21:29,180 o punto nombre es el nombre de la ciudad parámetro 476 00:21:29,180 --> 00:21:33,700 esto es ya el compare to de la clase string 477 00:21:33,700 --> 00:21:38,539 que ya me devuelve negativo si este alfabéticamente está antes 478 00:21:38,539 --> 00:21:41,059 cero si alfabéticamente son el mismo 479 00:21:41,059 --> 00:21:44,180 y positivo si este alfabéticamente está después 480 00:21:44,180 --> 00:21:46,440 pues es justo lo que queremos 481 00:21:46,440 --> 00:21:48,099 en mi compare to de ciudad 482 00:21:48,099 --> 00:21:49,539 ordenar 483 00:21:49,539 --> 00:21:52,920 vale, bueno esto ya lo hemos hecho 484 00:21:52,920 --> 00:21:53,779 muchas otras veces 485 00:21:53,779 --> 00:21:57,460 para usar el método sort de las listas 486 00:21:57,460 --> 00:21:59,099 o el de 487 00:21:59,099 --> 00:22:00,740 arrays, ya hemos hecho esto 488 00:22:00,740 --> 00:22:03,319 vale, pues ya le hemos 489 00:22:03,319 --> 00:22:04,700 dado al triset lo que necesita 490 00:22:04,700 --> 00:22:06,099 que es 491 00:22:06,099 --> 00:22:09,240 poder comparar ciudades entre sí 492 00:22:09,240 --> 00:22:10,900 poder comparar ciudades entre sí 493 00:22:10,900 --> 00:22:14,809 vale 494 00:22:14,809 --> 00:22:17,690 entonces ahora ya este mismo código 495 00:22:17,690 --> 00:22:19,869 este mismo código sin haberle cambiado 496 00:22:19,869 --> 00:22:21,670 nada, cuando ahora 497 00:22:21,670 --> 00:22:24,150 ejecutemos, ya está 498 00:22:24,150 --> 00:22:28,390 he puesto una O porque este se llama O 499 00:22:28,390 --> 00:22:32,799 claro, este, este 500 00:22:32,799 --> 00:22:38,549 vale, entonces hará esto mismo 501 00:22:38,549 --> 00:22:41,089 este mismo código sin cambiarlo, si lo ejecutamos 502 00:22:41,089 --> 00:22:42,769 ahora ya sí, ya no tendrá 503 00:22:42,769 --> 00:22:44,130 problema, vale 504 00:22:44,130 --> 00:22:50,079 y además el triset nos da 505 00:22:50,079 --> 00:22:51,759 otras prestaciones, otras comodidades 506 00:22:51,759 --> 00:22:53,779 que como el árbol está ordenado 507 00:22:53,779 --> 00:22:55,619 a la hora de iterar 508 00:22:55,619 --> 00:22:57,960 él itera según el orden 509 00:22:57,960 --> 00:22:59,900 que le hemos dicho, veis, Cádiz va antes que 510 00:22:59,900 --> 00:23:01,980 Madrid y va antes que Sevilla. Entonces, el orden 511 00:23:01,980 --> 00:23:03,940 de iteración en un tríceps es el 512 00:23:03,940 --> 00:23:05,339 orden de los objetos. Es ese. 513 00:23:07,079 --> 00:23:07,960 Entonces, cuando nos 514 00:23:07,960 --> 00:23:08,599 interesa 515 00:23:08,599 --> 00:23:11,759 que los objetos estén 516 00:23:11,759 --> 00:23:12,440 ordenados 517 00:23:12,440 --> 00:23:15,859 según el criterio de orden que 518 00:23:15,859 --> 00:23:17,880 yo he fijado, pues un tríceps es 519 00:23:17,880 --> 00:23:19,779 estupendo porque es que me los va colocando 520 00:23:19,779 --> 00:23:21,759 ordenaditos y cuando yo itero por él 521 00:23:21,759 --> 00:23:23,859 ya están ordenados según ese orden. 522 00:23:24,460 --> 00:23:25,740 No según el orden al que lo metí. 523 00:23:26,140 --> 00:23:27,880 No según ese orden al que lo metí, sino según 524 00:23:27,880 --> 00:23:28,900 el orden que yo he dicho. 525 00:23:29,900 --> 00:23:31,519 y si le meto aquí 526 00:23:31,519 --> 00:23:33,680 una ciudad 527 00:23:33,680 --> 00:23:36,079 le voy a añadir ahora otra 528 00:23:36,079 --> 00:23:38,519 pues si alfabéticamente 529 00:23:38,519 --> 00:23:40,460 es la primera, me la va a poner la primera 530 00:23:40,460 --> 00:23:52,980 bueno, aunque la 531 00:23:52,980 --> 00:23:55,200 voy a quitar la tilde porque no sé dónde está 532 00:23:55,200 --> 00:23:56,079 en la tabla 533 00:23:56,079 --> 00:24:03,650 vale, pues yo ahora cuando itere, veré que 534 00:24:03,650 --> 00:24:05,710 Alaba la ha colocado la primera, porque el triset 535 00:24:05,710 --> 00:24:07,470 va metiendo por orden y si yo itero 536 00:24:07,470 --> 00:24:08,569 va iterando por el orden 537 00:24:08,569 --> 00:24:10,869 del comparable 538 00:24:10,869 --> 00:24:16,480 entonces efectivamente pues 539 00:24:16,480 --> 00:24:18,779 conserva el orden que yo haya dicho 540 00:24:18,779 --> 00:24:21,059 que puede ser útil 541 00:24:21,059 --> 00:24:22,799 o puede no ser útil, nos puede dar igual o no 542 00:24:22,799 --> 00:24:24,099 pero bueno, pues 543 00:24:24,099 --> 00:24:26,900 es esa prestación que tiene 544 00:24:26,900 --> 00:24:29,339 conserva el orden a la hora de iterar 545 00:24:29,339 --> 00:24:32,420 ¿y ahora qué ocurre? 546 00:24:32,599 --> 00:24:33,740 en el set hemos dicho 547 00:24:33,740 --> 00:24:35,940 en el set en general, en cualquier set 548 00:24:35,940 --> 00:24:37,759 hemos dicho que el set no admite duplicados 549 00:24:37,759 --> 00:24:39,559 yo no puedo meter el mismo objeto 550 00:24:39,559 --> 00:24:42,079 una segunda vez, y aquí me podéis decir 551 00:24:42,079 --> 00:24:43,960 ¿y qué entiende por duplicados? 552 00:24:44,759 --> 00:24:45,660 porque aquí no has hecho 553 00:24:45,660 --> 00:24:47,700 un equal, si han hecho nada, un duplicado 554 00:24:47,700 --> 00:24:48,880 según el equals de object, no 555 00:24:48,880 --> 00:24:50,359 para el preset 556 00:24:50,359 --> 00:24:53,480 los duplicados 557 00:24:53,480 --> 00:24:55,680 son los que 558 00:24:55,680 --> 00:24:57,319 el compare to da 0 559 00:24:57,319 --> 00:24:59,460 ni equals ni nada 560 00:24:59,460 --> 00:25:01,700 este es el único método que a él le importa 561 00:25:01,700 --> 00:25:02,400 el único 562 00:25:02,400 --> 00:25:04,680 entonces si yo ahora meto aquí 563 00:25:04,680 --> 00:25:06,940 voy a intentar meter 564 00:25:06,940 --> 00:25:12,509 otra vez a esta 565 00:25:12,509 --> 00:25:20,490 voy a intentar meterla otra vez 566 00:25:20,490 --> 00:25:22,890 y voy a volver a recorrer 567 00:25:22,890 --> 00:25:30,039 ¿vale? 568 00:25:30,480 --> 00:25:32,900 tengo estas 4, las muestro, vuelvo a meter 569 00:25:32,900 --> 00:25:34,759 esta con otros habitantes 570 00:25:34,759 --> 00:25:36,880 otros, vuelvo 571 00:25:36,880 --> 00:25:39,019 a meter esta y vuelvo a recorrer 572 00:25:39,019 --> 00:25:40,180 vale 573 00:25:40,180 --> 00:25:43,240 ejecuto esto 574 00:25:43,240 --> 00:25:44,019 vale 575 00:25:44,019 --> 00:25:47,160 y veis, esta es 576 00:25:47,160 --> 00:25:49,000 la primera iteración 577 00:25:49,000 --> 00:25:50,500 y esta es la segunda 578 00:25:50,500 --> 00:25:52,640 no ha metido álava por segunda vez 579 00:25:52,640 --> 00:25:53,839 no lo ha metido 580 00:25:53,839 --> 00:25:56,779 y diréis, pero si no hay ningún equals aquí 581 00:25:56,779 --> 00:25:59,000 ¿cómo ha podido saber 582 00:25:59,000 --> 00:26:00,740 que no hay ningún equals basado en nombre? 583 00:26:00,740 --> 00:26:03,779 está el igual de obvio, el igual de obvio es proyección de memoria 584 00:26:03,779 --> 00:26:05,079 ¿por qué para él son iguales? 585 00:26:05,160 --> 00:26:06,480 si solo tienen igual el nombre 586 00:26:06,480 --> 00:26:09,579 porque para el triset la igualdad la da 587 00:26:09,579 --> 00:26:10,700 este método 588 00:26:10,700 --> 00:26:11,680 este 589 00:26:11,680 --> 00:26:14,480 la da ese 590 00:26:14,480 --> 00:26:17,019 entonces, este método dice 591 00:26:17,019 --> 00:26:19,700 que la álaba 592 00:26:19,700 --> 00:26:21,599 esta de aquí, de 4.000 habitantes 593 00:26:21,599 --> 00:26:23,420 y la álaba que yo he metido después 594 00:26:23,420 --> 00:26:25,839 de 10.000, según el compare 595 00:26:25,839 --> 00:26:27,039 tú, me está devolviendo 0 596 00:26:27,039 --> 00:26:28,640 luego son el mismo 597 00:26:28,640 --> 00:26:30,799 no se niega a meterlo 598 00:26:30,799 --> 00:26:32,579 porque en un set no se pueden meter duplicados 599 00:26:32,579 --> 00:26:36,259 bueno, pues estas son 600 00:26:36,259 --> 00:26:38,160 todas las particulares del tricer 601 00:26:38,160 --> 00:26:39,019 y ya está 602 00:26:39,019 --> 00:26:42,599 que necesita que haya un criterio 603 00:26:42,599 --> 00:26:44,859 de orden en las clases 604 00:26:44,859 --> 00:26:46,460 a las que 605 00:26:46,460 --> 00:26:47,700 pertenecen los objetos 606 00:26:47,700 --> 00:26:49,480 que van a formar parte del set 607 00:26:49,480 --> 00:26:52,579 que los va metiendo ordenados 608 00:26:52,579 --> 00:26:53,900 con lo cual cuando yo itere 609 00:26:53,900 --> 00:26:55,059 voy a ver ese orden 610 00:26:55,059 --> 00:26:57,380 que puede serme útil o no 611 00:26:57,380 --> 00:26:59,700 aquí no hace falta que haya un sort, por ejemplo 612 00:26:59,700 --> 00:27:01,180 aquí no hay que hacer un sort, es que ya 613 00:27:01,180 --> 00:27:02,700 van entrando ordenados 614 00:27:02,700 --> 00:27:06,259 y que los duplicados 615 00:27:06,259 --> 00:27:06,759 para él 616 00:27:06,759 --> 00:27:10,039 son los que devuelve 617 00:27:10,039 --> 00:27:12,079 este método, para él el equals lo ignora 618 00:27:12,079 --> 00:27:14,299 cuando yo 619 00:27:14,299 --> 00:27:15,220 haga aquí un remove 620 00:27:15,220 --> 00:27:17,660 por ejemplo, imaginaos que ahora queremos borrar 621 00:27:17,660 --> 00:27:20,319 vamos a borrar de ciudades 622 00:27:20,319 --> 00:27:24,119 quiero borrar Madrid 623 00:27:24,119 --> 00:27:26,019 pues con hacer esto 624 00:27:26,019 --> 00:27:26,619 es suficiente 625 00:27:26,619 --> 00:27:35,420 poniendo aquí cualquier cosa, me da igual 626 00:27:35,420 --> 00:27:40,180 vale, porque el remove que hace 627 00:27:40,180 --> 00:27:41,960 recordad que lo que hace es 628 00:27:41,960 --> 00:27:44,599 coge este objeto 629 00:27:44,599 --> 00:27:46,480 y busca en la colección 630 00:27:46,480 --> 00:27:48,680 el que sea igual a ese 631 00:27:48,680 --> 00:27:50,700 y cuando lo encuentra 632 00:27:50,700 --> 00:27:51,099 fuera 633 00:27:51,099 --> 00:27:54,319 pero aquí que significa igual para el remove 634 00:27:54,319 --> 00:27:56,200 aquí para el remove igual no significa 635 00:27:56,200 --> 00:27:56,880 llamar al equals 636 00:27:56,880 --> 00:28:00,460 aquí para el remove del triset 637 00:28:00,460 --> 00:28:02,539 igual va a significar 638 00:28:02,539 --> 00:28:03,779 el compare to 639 00:28:03,779 --> 00:28:06,319 con lo cual, aunque no hay 640 00:28:06,319 --> 00:28:07,900 ningún equals basado en el nombre 641 00:28:07,900 --> 00:28:10,000 si me va a eliminar esa ciudad 642 00:28:10,000 --> 00:28:12,440 me la va a eliminar porque cuando le aplique 643 00:28:12,440 --> 00:28:14,279 el compare to verá que me da cero 644 00:28:14,279 --> 00:28:15,720 con esta otra, luego es el mismo 645 00:28:15,720 --> 00:28:18,119 vale, vamos a comprobarlo 646 00:28:18,119 --> 00:28:20,299 porque yo no me fío nada de lo que digo 647 00:28:20,299 --> 00:28:27,799 espera, vamos a ponerle 648 00:28:27,799 --> 00:28:45,710 vale 649 00:28:45,710 --> 00:28:47,210 pues si ejecutamos esto 650 00:28:47,210 --> 00:28:51,049 los cuatro primeros 651 00:28:51,049 --> 00:28:53,670 el segundo alabato no lo ha metido 652 00:28:53,670 --> 00:28:55,569 y ha eliminado Madrid 653 00:28:55,569 --> 00:28:57,269 el remove, pues me ha eliminado Madrid 654 00:28:57,269 --> 00:28:59,509 me lo ha eliminado 655 00:28:59,509 --> 00:29:01,670 porque el remove en este caso 656 00:29:01,670 --> 00:29:03,390 no está tirando de equal, está tirando 657 00:29:03,390 --> 00:29:03,990 del compare to 658 00:29:03,990 --> 00:29:07,230 entonces el triset es 659 00:29:07,230 --> 00:29:09,109 si uno se pusiera a contar 660 00:29:09,109 --> 00:29:11,869 lo que pasa es que en números de objetos tan pequeños 661 00:29:11,869 --> 00:29:13,069 es difícil de estimar 662 00:29:13,069 --> 00:29:15,430 pero si en aplicaciones con 663 00:29:15,430 --> 00:29:16,990 volúmenes de datos grandes, si uno 664 00:29:16,990 --> 00:29:19,009 contara los milisegundos 665 00:29:19,009 --> 00:29:20,849 que tardan los accesos 666 00:29:20,849 --> 00:29:23,009 pues vería que el triset es 667 00:29:23,009 --> 00:29:24,529 el más rápido en realidad 668 00:29:24,529 --> 00:29:27,190 pero el triset lo que pasa es que exige 669 00:29:27,190 --> 00:29:28,309 que haya un criterio de orden 670 00:29:28,309 --> 00:29:31,230 y ese criterio de orden pues me puede complicar 671 00:29:31,230 --> 00:29:32,690 la vida o no me la puede complicar 672 00:29:32,690 --> 00:29:33,829 no sé, depende 673 00:29:33,829 --> 00:29:37,650 en general los conjuntos 674 00:29:37,650 --> 00:29:39,609 siempre son mejor elección que las listas 675 00:29:39,609 --> 00:29:41,109 si yo no necesito 676 00:29:41,109 --> 00:29:43,390 duplicados ni posición 677 00:29:43,390 --> 00:29:47,569 y el hash set es el más sencillo 678 00:29:47,569 --> 00:29:49,190 es el más sencillo 679 00:29:49,910 --> 00:29:51,190 esperamos, el triset se usa mucho 680 00:29:51,190 --> 00:29:53,069 porque es de accesos muy rápidos 681 00:29:53,069 --> 00:29:55,390 ¿vale? 682 00:29:55,390 --> 00:29:57,769 bueno, sí 683 00:29:57,769 --> 00:29:59,029 y ya con esto si queréis 684 00:29:59,029 --> 00:30:01,190 lo dejamos 685 00:30:01,190 --> 00:30:03,670 lo único, imaginaos que estáis en la situación 686 00:30:03,670 --> 00:30:04,829 en la que queréis usar un triset 687 00:30:04,829 --> 00:30:07,250 queréis usar un triset que es muy rápido 688 00:30:07,250 --> 00:30:08,609 y está muy bien y queréis usar un triset 689 00:30:08,609 --> 00:30:10,910 pero no tenéis acceso a las clases entidad 690 00:30:10,910 --> 00:30:12,329 no tenéis acceso 691 00:30:12,329 --> 00:30:15,289 entonces al no tener acceso, esto no lo podéis hacer 692 00:30:15,289 --> 00:30:17,289 imaginaos que estáis en ese caso 693 00:30:17,289 --> 00:30:19,349 a mí me han dicho 694 00:30:19,349 --> 00:30:20,349 que tire de ciudad 695 00:30:20,349 --> 00:30:22,990 pero, lo siento 696 00:30:22,990 --> 00:30:25,009 no puedo tocarla 697 00:30:25,009 --> 00:30:27,029 con lo cual si no puedo tocarla 698 00:30:27,029 --> 00:30:29,109 no puedo hacer que implemente 699 00:30:29,109 --> 00:30:31,269 entonces esto no estaría 700 00:30:31,269 --> 00:30:33,910 esto de aquí 701 00:30:33,910 --> 00:30:36,940 no estaría 702 00:30:36,940 --> 00:30:39,400 entonces 703 00:30:39,400 --> 00:30:41,559 según eso 704 00:30:41,559 --> 00:30:44,200 pues el triset no va a funcionar 705 00:30:44,200 --> 00:30:45,619 efectivamente no va a funcionar 706 00:30:45,619 --> 00:30:47,960 pero todavía se puede hacer un apaño que es 707 00:30:47,960 --> 00:30:50,660 al constructor de triset 708 00:30:50,660 --> 00:30:51,799 yo le puedo pasar 709 00:30:51,799 --> 00:30:54,220 un criterio de ordenación concreto 710 00:30:54,220 --> 00:30:55,960 para él y decirle oye tú 711 00:30:55,960 --> 00:30:57,019 usa este criterio 712 00:30:57,019 --> 00:31:00,000 y ya está, y eso a través de 713 00:31:00,000 --> 00:31:02,019 qué objeto se hacía, ¿alguien se acuerda? 714 00:31:02,079 --> 00:31:03,940 cuando quiero pasar un criterio de ordenación concreto 715 00:31:03,940 --> 00:31:06,079 por ejemplo, cuando ordenábamos una lista 716 00:31:06,079 --> 00:31:08,160 con sort y queríamos pasarle 717 00:31:08,160 --> 00:31:09,400 un criterio de ordenación 718 00:31:09,400 --> 00:31:13,750 a través del objeto 719 00:31:13,750 --> 00:31:16,230 comparator, que es otra cosa, no es el 720 00:31:16,230 --> 00:31:17,130 comparable, ¿vale? 721 00:31:17,950 --> 00:31:20,369 pues entonces, me voy a hacer un objeto 722 00:31:20,369 --> 00:31:22,269 comparator, que es un criterio de ordenación 723 00:31:22,269 --> 00:31:24,349 concreto, y ese criterio de ordenación 724 00:31:24,349 --> 00:31:25,549 concreto se lo paso al tríceps 725 00:31:25,549 --> 00:31:28,190 Y así no tengo que tocar la clase ciudad. 726 00:31:29,369 --> 00:31:32,029 Y ese criterio de ordenación va a valer para ese triseto. 727 00:31:32,589 --> 00:31:34,710 Entonces, ¿cómo se hacían esos comparator? 728 00:31:37,069 --> 00:31:52,539 Pues, hacíamos un objeto en orden ciudad, ciudades. 729 00:31:54,019 --> 00:31:58,579 Este objeto tenía que implementar este otro. 730 00:31:58,579 --> 00:32:04,980 Entonces, al implementar este otro 731 00:32:04,980 --> 00:32:07,839 Se hacía automáticamente 732 00:32:07,839 --> 00:32:11,259 Criterio de ordenación 733 00:32:11,259 --> 00:32:13,920 Y le tocaba implementar el método este 734 00:32:13,920 --> 00:32:17,359 Vale, entonces aquí decíamos 735 00:32:17,359 --> 00:32:18,299 Vale, muy bien 736 00:32:18,299 --> 00:32:22,019 Pues dame el orden entre la ciudad O1 y la ciudad O2 737 00:32:22,019 --> 00:32:24,819 Dame el orden entre la ciudad O1 y la ciudad O2 738 00:32:24,819 --> 00:32:26,500 Bueno, como es el alfabético 739 00:32:26,500 --> 00:32:29,119 Podríamos hacer O1.nombre 740 00:32:29,119 --> 00:32:32,059 compare-tool 741 00:32:32,059 --> 00:32:39,160 o dos.nombre 742 00:32:39,160 --> 00:32:41,759 ¡Hala! 743 00:32:44,619 --> 00:32:46,599 Ya tengo un criterio de ordenación concreto 744 00:32:46,599 --> 00:32:47,839 entre dos ciudades 745 00:32:47,839 --> 00:32:50,059 y este criterio de ordenación 746 00:32:50,059 --> 00:32:53,000 se lo paso a quien quiera. Al sort para ordenar 747 00:32:53,000 --> 00:32:54,819 al triset para sus usos 748 00:32:54,819 --> 00:32:56,559 se lo paso a quien quiera. Pues venga 749 00:32:56,559 --> 00:32:58,640 vamos a pasárselo a este triset 750 00:32:58,640 --> 00:33:00,700 como este triset me va a dar problemas 751 00:33:00,700 --> 00:33:02,740 porque ciudad no tiene comparable 752 00:33:02,740 --> 00:33:04,319 como me va a dar problemas 753 00:33:04,319 --> 00:33:06,240 pues le voy a decir, oye 754 00:33:06,240 --> 00:33:08,900 Cuidado, que te voy a pasar un nuevo criterio 755 00:33:08,900 --> 00:33:11,720 Orden 756 00:33:11,720 --> 00:33:14,099 Ciudades 757 00:33:14,099 --> 00:33:18,289 Ala, como veis el constructor de Triset 758 00:33:18,289 --> 00:33:19,869 Está sobrecargado, admite varias 759 00:33:19,869 --> 00:33:21,329 Vale, le decimos 760 00:33:21,329 --> 00:33:24,109 Ah, vale, me pasas un criterio de ordenación 761 00:33:24,109 --> 00:33:24,730 En concreto 762 00:33:24,730 --> 00:33:28,269 Pues muy bien, pues yo ya funciono 763 00:33:28,269 --> 00:33:30,130 Según ese criterio de ordenación 764 00:33:30,130 --> 00:33:32,190 Y ya está 765 00:33:32,190 --> 00:33:32,569 Y bueno 766 00:33:32,569 --> 00:33:35,089 Está funcionando igual 767 00:33:35,089 --> 00:33:37,529 Y ciudad no implementa comparable 768 00:33:37,529 --> 00:33:38,809 Pero le hemos dicho al triset 769 00:33:38,809 --> 00:33:40,049 Cómo solucionar ese problema 770 00:33:40,049 --> 00:33:43,180 Vale 771 00:33:43,180 --> 00:33:47,740 Bueno, pues este es el triset 772 00:33:47,740 --> 00:33:49,700 Su uso, etcétera, etcétera 773 00:33:49,700 --> 00:33:51,460 Vale 774 00:33:51,460 --> 00:33:53,160 Preguntas