1 00:00:00,750 --> 00:00:07,990 Voy a grabar esta clase, por lo tanto, si habláis, me autorizáis a grabar vuestra voz, ¿vale? 2 00:00:08,830 --> 00:00:12,929 Vale, hoy vamos a ver la parte teórica de las estructuras dinámicas. 3 00:00:12,929 --> 00:00:21,170 En las clases anteriores lo que hemos hecho es implementar nosotros dos típicas estructuras dinámicas, 4 00:00:21,829 --> 00:00:25,149 que son la ReList y la LinkedList, ¿vale? 5 00:00:25,149 --> 00:00:27,109 después de haber echado un vistazo 6 00:00:27,109 --> 00:00:28,929 a lo que nos espera 7 00:00:28,929 --> 00:00:30,809 desde una perspectiva práctica, digamos, 8 00:00:31,309 --> 00:00:33,250 pues vamos a ver la perspectiva, 9 00:00:33,390 --> 00:00:35,189 el marco teórico en el que nos 10 00:00:35,189 --> 00:00:36,509 movemos, ¿vale? 11 00:00:37,469 --> 00:00:38,990 Estas se llaman estructuras 12 00:00:38,990 --> 00:00:40,590 dinámicas, ¿por qué? 13 00:00:45,049 --> 00:00:45,890 Porque puede 14 00:00:45,890 --> 00:00:51,460 poner varios datos 15 00:00:51,460 --> 00:00:53,659 y nos ayuda a manipularlo. 16 00:00:54,280 --> 00:00:55,579 ¿Y un array 17 00:00:55,579 --> 00:00:56,899 no nos permite 18 00:00:56,899 --> 00:00:59,359 guardar varios datos y nos 19 00:00:59,359 --> 00:01:00,320 ayuda a manipularlo? 20 00:01:01,299 --> 00:01:18,680 Si os acordáis, uno de los problemas principales del array, que era una colección de datos al fin y al cabo, de todos iguales, pero que era una colección de datos, yo puedo hacer un array de objetos y poner ahí dentro lo que me da la gana, pero tenía este problema de que es fijo. 21 00:01:18,680 --> 00:01:37,500 A la vez que tenía que modificar el tamaño del array, tenía que construir literalmente un nuevo array, recolocar todos los punteros, todas las referencias de los objetos en el nuevo array, y a este punto tenía un array más grande o más pequeño o lo que sea. 22 00:01:37,500 --> 00:01:49,680 Era un trabajo bastante engorroso desde la perspectiva del array, pero hay que considerar que el array existía antes, digamos, de este tipo de estructuras. 23 00:01:50,200 --> 00:02:00,980 Efectivamente, los arrays son complejos, o sea, no son complejos, pero complican el código porque cada vez que tienes que hacer una operación pequeña, 24 00:02:00,980 --> 00:02:05,900 tienes que ponerte allí, recorrerlo entero, hacer varias estructuras, varios problemas. 25 00:02:06,560 --> 00:02:10,759 Y por lo tanto, en el mundo de Java, en el mundo de la programación en general, 26 00:02:11,340 --> 00:02:17,740 la gente dijo, ¿por qué no hacemos unas estructuras dinámicas que me esconden lo que pasa detrás de un array 27 00:02:17,740 --> 00:02:20,120 y hacen prácticamente lo mismo que un array? 28 00:02:20,259 --> 00:02:25,300 Es decir, puedo manipular datos y almacenar ahí datos y luego recuperarlos como me da la gana. 29 00:02:25,300 --> 00:02:28,180 y entonces se crearon estas estructuras dinámicas 30 00:02:28,180 --> 00:02:33,360 cuya implementación puede o no depender de Arrays. 31 00:02:33,699 --> 00:02:34,240 Lo hemos visto. 32 00:02:34,460 --> 00:02:36,259 ArrayList depende de Array. 33 00:02:36,479 --> 00:02:40,039 La LinkedList no hemos visto ni un Array allí dentro. 34 00:02:42,039 --> 00:02:45,860 Una estructura dinámica es una colección de datos 35 00:02:45,860 --> 00:02:49,120 que puede variar su tamaño en tiempo de ejecución. 36 00:02:49,719 --> 00:02:52,680 La diferencia fundamental es que un Array 37 00:02:52,680 --> 00:02:54,919 no puede cambiar su tamaño 38 00:02:54,919 --> 00:02:56,900 en tiempo de ejecución, mientras que 39 00:02:56,900 --> 00:02:59,020 en estructura dinámica sí. En tiempo de ejecución 40 00:02:59,020 --> 00:03:01,060 quiere decir una vez que he lanzado el programa. 41 00:03:01,819 --> 00:03:03,060 O sea, un array, yo le digo 42 00:03:03,060 --> 00:03:04,979 tamaño 10, si añado 11 43 00:03:04,979 --> 00:03:06,439 alumnos, tengo un problema. 44 00:03:07,219 --> 00:03:08,919 ¿Vale? O sea, tengo 45 00:03:08,919 --> 00:03:11,060 que crear un nuevo array más grande, 46 00:03:11,360 --> 00:03:13,099 pero el array original 47 00:03:13,099 --> 00:03:14,879 no lo puedo aumentar del 1000. 48 00:03:15,379 --> 00:03:17,099 Mientras que este de aquí, la idea 49 00:03:17,099 --> 00:03:18,900 es que esta estructura dinámica, 50 00:03:19,000 --> 00:03:20,919 yo no sé cuántos alumnos voy a añadir, 51 00:03:21,020 --> 00:03:22,460 puedo añadir 100, puedo añadir 1000, 52 00:03:22,680 --> 00:03:31,460 él encontrará la forma de organizar estos datos de una forma o de otra. 53 00:03:31,580 --> 00:03:34,419 Está claro que, como todos en el mundo de la informática, hay un límite. 54 00:03:34,900 --> 00:03:36,759 El límite me lo da mi hardware. 55 00:03:37,479 --> 00:03:41,620 Si yo tengo un giga de RAM, yo no lo tengo. 56 00:03:42,159 --> 00:03:46,379 Pues no puedo poner seis gigas de datos. 57 00:03:46,819 --> 00:03:49,379 Llega el momento que dirá, oye, mirad, esta estructura de datos no cabe. 58 00:03:49,379 --> 00:03:57,180 Pues el sistema operativo hará un swapping con el disco duro y entonces todo irá tremendamente lento, pero podrá hacerlo. 59 00:03:57,379 --> 00:03:58,000 Lo mejor. 60 00:03:58,400 --> 00:04:05,500 Pero aún así, si yo tengo 100 millones de datos en un programa, pues no los puedo manipular. 61 00:04:05,639 --> 00:04:11,759 Si yo genero 100 teras de datos en un ordenador, pues llegará un momento que mi ordenador dice, 62 00:04:11,919 --> 00:04:15,159 oye, mira, tengo espacio donde guardar estos datos, tengo que borrarlos. 63 00:04:16,019 --> 00:04:16,199 ¿Sí? 64 00:04:17,819 --> 00:04:19,220 Para entender la idea. 65 00:04:19,379 --> 00:04:29,550 ¿Cuáles son las estructuras dinámicas más conocidas, básicas, digamos así? 66 00:04:29,689 --> 00:04:31,970 Luego ya veremos las implementaciones que puede haber. 67 00:04:32,730 --> 00:04:34,949 Pues listas, colas, pilas y árboles. 68 00:04:35,370 --> 00:04:36,209 Estos son cuatro. 69 00:04:36,209 --> 00:04:44,769 Si os habéis fijado, en esta última semana hemos hablado de las primeras tres. 70 00:04:45,069 --> 00:04:46,629 O sea, han salido de vez en cuando. 71 00:04:47,009 --> 00:04:51,449 Y los árboles, hemos hablado de ellos alguna vez en episodios anteriores. 72 00:04:51,449 --> 00:05:00,970 o sea, no es la primera vez que se habla de árboles, pero bueno, ahora vamos a repasar qué es cada una de ellas para entender las diferencias. 73 00:05:01,449 --> 00:05:13,180 Una lista es una estructura dinámica que permite almacenar un objeto y tener un modo para poder acceder al siguiente elemento de la lista, ¿vale? 74 00:05:13,180 --> 00:05:20,879 Es decir, tú tienes un inicio o una cabeza, accedes al primer objeto de esta lista 75 00:05:20,879 --> 00:05:24,939 y puedes desde allí, de alguna forma, acceder al siguiente. 76 00:05:25,579 --> 00:05:33,579 Esta es una lista, es lo que llamamos comúnmente una lista, 77 00:05:33,639 --> 00:05:37,800 una lista a la compra, una lista de peticiones, una lista... 78 00:05:37,800 --> 00:05:47,660 Lo que me puede interesar a este nivel es el orden de inserción de los objetos. 79 00:05:47,660 --> 00:05:53,759 O sea que normalmente cuando se inserta un elemento se inserta al final. 80 00:05:54,560 --> 00:06:00,980 Pero en realidad en una lista yo puedo insertar los objetos donde quiera. 81 00:06:01,240 --> 00:06:06,379 Uno de los métodos que nosotros hemos implementado es el añádeme este objeto en posición 3, por ejemplo. 82 00:06:06,379 --> 00:06:11,379 Una lista, en teoría, podría hacerlo. Podría añadirlo delante, podría añadirlo al final. 83 00:06:11,379 --> 00:06:19,379 La idea es que al final tenga una lista de cosas, no necesariamente ordenadas por prioridad o por cualquier orden. 84 00:06:19,379 --> 00:06:24,379 Está claro que si yo la uso de un determinado modo, como por ejemplo siempre añado al final, 85 00:06:24,379 --> 00:06:30,379 pues tendré el orden de inserción preservado. 86 00:06:30,379 --> 00:06:37,160 Pero la lista por sí misma es más flexible. Puede hacer un poquito lo que le da la gana. 87 00:06:37,160 --> 00:06:40,160 A diferencia de las otras dos que tenemos. 88 00:06:40,160 --> 00:06:42,759 Para recorrer la lista lo haré desde el inicio al final. 89 00:06:42,759 --> 00:06:48,959 Como tengo el inicio, pues no puedo entrar donde me da la gana, tendría que entrar en el inicio. 90 00:06:48,959 --> 00:06:55,680 Aún así, dependiendo de la implementación, hay algunas implementaciones que sí me permiten un acceso aleatorio. 91 00:06:55,680 --> 00:07:00,319 Por ejemplo, la ArrayList, como por debajo es un Array, 92 00:07:00,379 --> 00:07:03,720 No tiene problema en entrar en la posición 3. 93 00:07:04,519 --> 00:07:04,639 ¿Vale? 94 00:07:04,879 --> 00:07:07,620 Array, procedo a la posición 3 del array y llego directamente. 95 00:07:08,620 --> 00:07:12,560 Una lista enlazada, pues llegar a la posición 3 es más complejo. 96 00:07:12,759 --> 00:07:13,980 No puedo llegar directamente. 97 00:07:14,660 --> 00:07:17,079 No tengo un puntero directamente a la posición 3. 98 00:07:17,079 --> 00:07:20,939 Tengo que entrar por la cabeza y luego siguiente, siguiente, siguiente. 99 00:07:22,120 --> 00:07:22,800 ¿Dudas? 100 00:07:28,069 --> 00:07:33,290 Ahora, una cola es, lo sabéis, también lo habéis visto antes, lo habéis dicho, 101 00:07:33,290 --> 00:07:43,310 es parecida a una lista pero mantiene un estricto orden cifo first in first out es decir que cuando 102 00:07:43,310 --> 00:07:50,629 tú insertas algo luego este algo que has insertado es el primero que puedes pillar entonces tú tendrás 103 00:07:50,629 --> 00:08:01,610 dos métodos uno es añade uno es la pilla vale y al añadir siempre se añadirá al final vale y al 104 00:08:01,610 --> 00:08:04,810 al pillar, siempre se pillará desde el principio. 105 00:08:05,389 --> 00:08:07,750 Si yo mantengo esta función de aquí, 106 00:08:07,750 --> 00:08:12,750 es decir, que siempre saco de la lista, 107 00:08:13,670 --> 00:08:14,949 digamos, de esta lista especial, 108 00:08:15,470 --> 00:08:17,149 el elemento más viejo, 109 00:08:17,610 --> 00:08:19,370 entonces el primero que ha entrado 110 00:08:19,370 --> 00:08:21,550 es el primero que sale, fijo, 111 00:08:22,290 --> 00:08:24,470 pues entonces estoy haciendo una cola. 112 00:08:24,889 --> 00:08:27,689 Es la cola que tengo a un banco, 113 00:08:27,990 --> 00:08:31,149 o al correo, o a un cine, ¿vale? 114 00:08:31,149 --> 00:08:36,409 El primero que ha llegado es el primero que será servido por ese servicio, 115 00:08:36,549 --> 00:08:40,990 por mandarle su carta o que la gente se le pasa. 116 00:08:41,429 --> 00:08:42,649 Hombre, que no sean italianos. 117 00:08:44,519 --> 00:08:45,519 Pila, ¿vale? 118 00:08:46,159 --> 00:08:48,639 Parecida siempre a una lista, ¿vale? 119 00:08:48,700 --> 00:08:50,460 Pero sigue otro mecanismo. 120 00:08:51,139 --> 00:08:55,559 En vez de first in, first out, es que el último que ha entrado es el primero que sale. 121 00:08:56,120 --> 00:08:56,299 ¿Vale? 122 00:08:56,679 --> 00:08:59,179 Entonces yo puedo añadir cuando se añadan las cosas, 123 00:08:59,179 --> 00:09:02,559 Entonces es como si se añadan en la cima de la pila. 124 00:09:03,000 --> 00:09:04,440 Estoy apilando las cosas. 125 00:09:04,639 --> 00:09:10,659 Entonces los elementos más viejos se quedan más abajo en la pila. 126 00:09:10,799 --> 00:09:12,700 Y como están más abajo y los otros están encima, 127 00:09:12,840 --> 00:09:17,580 no puedo alcanzar los que están abajo sin antes quitarlos de arriba. 128 00:09:18,279 --> 00:09:21,220 Aquí los métodos se suelen llamar push y pop. 129 00:09:22,120 --> 00:09:26,980 Push lo empujo desde arriba y pop lo saco desde arriba. 130 00:09:26,980 --> 00:09:36,559 ¿Vale? ¿Hemos visto algún ejemplo de una pila? 131 00:09:36,559 --> 00:09:47,149 Por ejemplo, no me es que cosa, en el campo lo hemos visto cuando hemos visto el ejercicio de recursividad, sí. 132 00:09:47,149 --> 00:09:53,230 Pero ¿qué era esa pila? ¿Qué pila era? 133 00:09:53,230 --> 00:09:57,230 La pila de llamada de métodos. Pues eso es lo que hemos visto, ¿vale? 134 00:09:57,230 --> 00:10:02,230 Que luego en la recursividad la hemos hecho explotar llamando siempre lo mismo. 135 00:10:02,230 --> 00:10:08,490 sustancialmente la gestión como Java o como muchos de los programas lenguaje 136 00:10:08,490 --> 00:10:14,289 programación gestiona las llamadas de métodos es con una pila vale porque yo 137 00:10:14,289 --> 00:10:18,470 llamo el primer método que es el main si el main llama otro método pues ese 138 00:10:18,470 --> 00:10:24,129 método se pondrá a la cima de la pila porque hasta que no haya acabado ese 139 00:10:24,129 --> 00:10:29,330 método no volveré al main vale entonces cada llamada añade un nivel en la pila 140 00:10:29,330 --> 00:10:38,330 y cada vez que acaba un método, pues, se quitará de la pila y se volverá a reanudar. 141 00:10:38,330 --> 00:10:44,690 Eso, el método que lo había llamado, en el punto en que se había llamado, ¿vale? Entonces está 142 00:10:44,690 --> 00:10:55,120 haciendo, si os lo pensáis bien, ¿cuál es el último método que acaba? En vuestros programas, 143 00:10:55,120 --> 00:11:02,500 ¿cuál es el último método que acaba siempre? Main. Si vosotros no tenéis threads, entonces, 144 00:11:02,500 --> 00:11:04,559 si llamáis el main como primero, 145 00:11:04,980 --> 00:11:06,340 luego dentro del main podéis llamar 146 00:11:06,340 --> 00:11:08,320 un montón de otros métodos, pero al final 147 00:11:08,320 --> 00:11:09,899 volveréis al main y el main acaba. 148 00:11:10,460 --> 00:11:12,039 O sea, que es el main el primero que 149 00:11:12,039 --> 00:11:14,500 ejecutáis y el último que se para. 150 00:11:18,700 --> 00:11:19,659 Preguntas, lista, 151 00:11:19,899 --> 00:11:21,559 colas y pilas. 152 00:11:23,440 --> 00:11:24,200 Entiendo más o menos. 153 00:11:25,519 --> 00:11:26,460 Un árbol. 154 00:11:27,059 --> 00:11:29,639 Un árbol es otra estructura, un poquito más 155 00:11:29,639 --> 00:11:31,919 distinta en vez de la lista 156 00:11:31,919 --> 00:11:33,639 porque no es no lineal. 157 00:11:34,000 --> 00:11:39,620 ¿Vale? Mientras la lista, la cola, la pieza son todas más o menos lineales, pues este de aquí es un poquito más complejo. 158 00:11:39,620 --> 00:11:44,940 ¿Vale? Un árbol en informática es una serie de nodos conectados entre ellos. 159 00:11:45,120 --> 00:11:50,659 ¿Vale? Cada nodo suele tener un nodo progenitor y unos cuantos nodos hijos. 160 00:11:51,179 --> 00:11:59,799 ¿Vale? Entonces, aquí por ejemplo vemos que hay algunos nodos que tienen, o sea, todos, perdón, tienen un solo progenitor, 161 00:11:59,799 --> 00:12:06,200 pero hay algunos nodos que tienen tres hijos, algunos nodos que tienen dos, algunos que tienen uno y algunos que no tienen ninguno. 162 00:12:07,080 --> 00:12:14,259 El primer nodo arriba, que no tiene padre, o que no tiene madre, o que no tiene procedidor, es el nodo raíz. 163 00:12:15,159 --> 00:12:16,539 Es la raíz del árbol. 164 00:12:17,320 --> 00:12:21,019 Los nodos que no tienen hijos se llaman hojas. 165 00:12:22,080 --> 00:12:23,320 Es un árbol, pero arriba. 166 00:12:23,320 --> 00:12:36,120 También la profundidad al que está un nodo se llama nivel, el grado de un nodo es cuántos 167 00:12:36,120 --> 00:12:45,419 hijos tiene, el grado de un árbol es el mayor grado de todos sus nodos, y cosas por el estilo. 168 00:12:45,419 --> 00:12:59,860 Son cosas para, si os metéis en teoría de grados, en algorítmica más avanzada, pues salen estos conceptos para indicar algunas necesidades de algunos teoremas o cosas por el estilo. 169 00:12:59,860 --> 00:13:06,139 Para que esto funcione el árbol tiene que ser de grado máximo 2 y bla bla bla. 170 00:13:06,500 --> 00:13:10,980 No sé si está diciendo esta cosa, pero a nuestro nivel nos interesa relativamente poco. 171 00:13:10,980 --> 00:13:15,360 existen árboles especiales 172 00:13:15,360 --> 00:13:18,480 uno famoso es el árbol binario de búsqueda 173 00:13:18,480 --> 00:13:23,799 en el que sostancialmente cada nodo tiene solo como máximo dos hijos 174 00:13:23,799 --> 00:13:27,360 y sostancialmente es me comparo 175 00:13:27,360 --> 00:13:31,440 cuando inserto un nuevo nodo me comparo con el nodo actual 176 00:13:31,440 --> 00:13:35,039 si soy mayor que este nodo me pongo a la derecha 177 00:13:35,039 --> 00:13:39,100 si soy menor que este nodo me pongo a la izquierda 178 00:13:39,100 --> 00:13:51,200 Y entonces, sustancialmente, se crea un árbol que es bueno para las búsquedas, porque los elementos están medianamente ordenados. 179 00:13:51,840 --> 00:14:04,700 Si lo hago bien, el árbol me permite búsquedas logarítmicas, o sea, con velocidad mucho mejor con respecto a una búsqueda lineal, simplemente buscando el elemento. 180 00:14:04,700 --> 00:14:08,240 El precio que pago, que es insertarlo 181 00:14:08,240 --> 00:14:10,080 Es mucho más complejo 182 00:14:10,080 --> 00:14:11,740 Que simplemente añadirlo al fondo 183 00:14:11,740 --> 00:14:12,639 De una lista 184 00:14:12,639 --> 00:14:15,639 Pero es más o menos una cosa común 185 00:14:15,639 --> 00:14:17,320 Si yo quiero una ventaja 186 00:14:17,320 --> 00:14:19,220 Pues esa ventaja la tendré que pagar 187 00:14:19,220 --> 00:14:20,940 Con una desventaja por otro lado 188 00:14:20,940 --> 00:14:23,899 Si quiero inserciones rápidas 189 00:14:23,899 --> 00:14:26,320 Posiblemente luego buscar será un infierno 190 00:14:26,320 --> 00:14:27,919 Si quiero búsquedas rápidas 191 00:14:27,919 --> 00:14:29,740 Posiblemente la inserción será un infierno 192 00:14:29,740 --> 00:14:33,919 Luego existen árboles balanceados 193 00:14:34,700 --> 00:14:36,620 en el que no hay una rama 194 00:14:36,620 --> 00:14:38,179 mucho más profunda que la otra 195 00:14:38,179 --> 00:14:41,019 y por ejemplo un árbol de búsqueda 196 00:14:41,019 --> 00:14:42,340 binario de búsqueda 197 00:14:42,340 --> 00:14:44,899 para que sea eficiente tiene que ser balanceado 198 00:14:44,899 --> 00:14:46,759 y un montón de cosas 199 00:14:46,759 --> 00:14:47,600 aquí hay 200 00:14:47,600 --> 00:14:50,440 asignaturas de la universidad 201 00:14:50,440 --> 00:14:52,700 que van sobre estas cosas, interesantes 202 00:14:52,700 --> 00:14:55,240 pero no tenemos el tiempo 203 00:14:55,240 --> 00:14:57,200 aquí un poco las cosas que decía antes 204 00:14:57,200 --> 00:14:59,399 que es una hoja, que es un nodo interior 205 00:14:59,399 --> 00:15:00,460 que es una raíz 206 00:15:00,460 --> 00:15:02,259 el nivel del árbol 207 00:15:02,259 --> 00:15:04,919 el grado de un nodo, el grado del árbol 208 00:15:04,919 --> 00:15:06,279 ¿vale? que son unidos 209 00:15:06,279 --> 00:15:08,039 como hemos visto antes 210 00:15:08,039 --> 00:15:08,919 ¿sí? 211 00:15:09,740 --> 00:15:12,840 todo esto es conceptos generales 212 00:15:12,840 --> 00:15:14,480 de estructuras dinámicas, de estructuras 213 00:15:14,480 --> 00:15:16,220 de datos ¿vale? estos son 214 00:15:16,220 --> 00:15:17,940 cuatro tipos de estructuras de datos 215 00:15:17,940 --> 00:15:20,399 bien conocidos que se usan en el mundo 216 00:15:20,399 --> 00:15:21,960 de la informática y que 217 00:15:21,960 --> 00:15:24,399 matemáticos se han metido a estudiarlos 218 00:15:24,399 --> 00:15:26,440 para encontrar propiedades interesantes 219 00:15:26,440 --> 00:15:28,320 y cosas guay que se pueden 220 00:15:28,320 --> 00:15:30,399 utilizar, si el árbol tiene esta 221 00:15:30,399 --> 00:15:32,120 gratis y así la cola tiene esta otra 222 00:15:32,120 --> 00:15:34,379 gratis y así, ¿vale? 223 00:15:35,559 --> 00:15:36,659 ¿Qué pasa 224 00:15:36,659 --> 00:15:38,600 en nuestro mundo, o sea, en Java? 225 00:15:39,139 --> 00:15:40,620 ¿Vale? En Java 226 00:15:40,620 --> 00:15:42,399 existe una interfaz 227 00:15:42,399 --> 00:15:44,500 que se llama la interfaz collection. 228 00:15:45,039 --> 00:15:46,539 ¿Vale? La interfaz collection 229 00:15:46,539 --> 00:15:47,379 es como 230 00:15:47,379 --> 00:15:49,179 una 231 00:15:49,179 --> 00:15:52,539 una generalización, 232 00:15:53,220 --> 00:15:54,220 una abstracción 233 00:15:54,220 --> 00:15:56,500 de todas las que hemos visto hasta ahora. 234 00:15:56,500 --> 00:15:58,299 ¿Vale? Todas las estructuras 235 00:15:58,299 --> 00:16:00,179 dinámicas que veremos nosotros 236 00:16:00,179 --> 00:16:11,279 heredan o implementan mejor la interfaz collection. Entonces aquí estarán metidas los métodos, 237 00:16:11,279 --> 00:16:19,899 el contrato de los métodos más básicos que tendrán que tener todas las posibles estructuras 238 00:16:19,899 --> 00:16:26,799 dinámicas de Java, sean una cola, sean una pila, sean un árbol, etcétera. Principalmente cosas 239 00:16:26,799 --> 00:16:30,519 como añadir un elemento, sacar un elemento, 240 00:16:30,659 --> 00:16:31,159 y cosas por el estilo. 241 00:16:31,320 --> 00:16:33,480 Lo que quiera hacer con cualquier estructura dinámica, 242 00:16:33,580 --> 00:16:37,440 que si no hiciera eso, no tendría sentido crear una estructura dinámica. 243 00:16:40,159 --> 00:16:44,559 Las colecciones representan grupos de objetos denominados elementos. 244 00:16:44,899 --> 00:16:47,379 Podemos encontrar diversos tipos de colecciones 245 00:16:47,379 --> 00:16:50,279 según si sus elementos están ordenados 246 00:16:50,279 --> 00:16:52,860 o si permiten repeticiones de elementos o no. 247 00:16:53,080 --> 00:16:56,220 Dos de las características fundamentales que tenemos que preguntarnos es 248 00:16:56,220 --> 00:16:59,779 ¿quiero ordenar los elementos cuando los inserto? 249 00:17:00,059 --> 00:17:02,379 O sea, ¿me da igual que los insertos están allí 250 00:17:02,379 --> 00:17:04,220 o quiero que mantengan un orden 251 00:17:04,220 --> 00:17:06,460 para que sea más fácil luego organizarlos, 252 00:17:06,579 --> 00:17:07,680 buscarlos, etcétera, etcétera? 253 00:17:08,000 --> 00:17:09,240 Dependiendo de esta elección, 254 00:17:09,640 --> 00:17:12,920 voy a una u otra estructura dinámica. 255 00:17:13,339 --> 00:17:14,140 Y otra cosa es, 256 00:17:14,359 --> 00:17:17,480 ¿puedo permitir la repetición de elementos o no? 257 00:17:18,039 --> 00:17:20,180 Si yo añado dos veces el mismo alumno, 258 00:17:20,859 --> 00:17:22,599 añado dos veces el mismo alumno 259 00:17:22,599 --> 00:17:24,799 o hago algo para decir, 260 00:17:24,799 --> 00:17:28,480 No, el de alumno este aquí ya existe, entonces no lo voy a añadir otra vez. 261 00:17:29,839 --> 00:17:39,579 Está claro que esta cosa de la repetición de elementos está muy, muy, muy relacionada con 262 00:17:39,579 --> 00:17:48,710 que me puede afectar muchísimo la repetición de alumnos. 263 00:17:48,710 --> 00:17:54,430 O sea, ¿cómo sé si un elemento se repite o no? 264 00:18:01,099 --> 00:18:01,619 ¿Cómo sé? 265 00:18:04,180 --> 00:18:11,180 ¿Cómo puedo saber si este objeto que ahora tengo y quiero insertar, ya existe o no? 266 00:18:11,180 --> 00:18:16,190 ¿Qué tendré que hacer para saber si ya existe o no? 267 00:18:16,190 --> 00:18:19,190 Compararlo con los objetos que tengo. 268 00:18:19,190 --> 00:18:27,950 Por lo tanto, saber si se repite o no se basará sobre la implementación de equals. 269 00:18:27,950 --> 00:18:36,950 Dependiendo de mi definición de equals, yo te diré si lo puedes añadir o no. 270 00:18:36,950 --> 00:18:39,329 dos alumnos. Si yo te digo 271 00:18:39,329 --> 00:18:40,769 el equals es el de object, 272 00:18:41,230 --> 00:18:43,390 pues si creo un nuevo alumno Estefan, un nuevo alumno 273 00:18:43,390 --> 00:18:45,329 Estefan, pues pondré los dos, porque 274 00:18:45,329 --> 00:18:47,569 son dos instancias distintas. 275 00:18:47,690 --> 00:18:49,230 Entonces, igual, igual, da la falsa, 276 00:18:49,630 --> 00:18:51,289 pues perfecto, se añaden los dos Estefan. 277 00:18:52,289 --> 00:18:53,130 Pero si yo digo, no, 278 00:18:53,269 --> 00:18:55,509 mis alumnos se comparan 279 00:18:55,509 --> 00:18:57,509 por nombre. Si tienen el mismo nombre, 280 00:18:57,710 --> 00:18:58,970 entonces es el mismo alumno, 281 00:18:59,410 --> 00:19:01,190 definición distinta de igualdad 282 00:19:01,190 --> 00:19:03,190 entre alumnos, pues ahora, cuando 283 00:19:03,190 --> 00:19:05,150 he añadido Estefan, añado otro que sea 284 00:19:05,150 --> 00:19:09,789 año Estefano, pero como la igualdad se basa sobre el nombre, me dice, no, el alumno Estefano 285 00:19:09,789 --> 00:19:16,109 ya existe. Entonces no me la llevo. ¿Sí? Volveremos a hablar de esto. 286 00:19:20,019 --> 00:19:26,319 El tipo más genérico en cuanto a que se refiere a cualquier tipo de contexto. Esto 287 00:19:26,319 --> 00:19:31,099 es genérico, es una abstracción, ¿vale? Es cualquier colección de datos. ¿Cómo 288 00:19:31,099 --> 00:19:35,240 funciona? Pues no lo sé todavía, ¿vale? Luego vamos a ver las implementaciones de 289 00:19:35,240 --> 00:19:43,569 esta colección para ver qué características tiene y esto es un poco el esquema de lo que 290 00:19:43,569 --> 00:19:53,349 tenemos aquí esta colección de colección de extender vale otra clase otra interfaz 291 00:19:53,349 --> 00:19:58,990 porque las azules son interfaces la verde son clases para extender otra interfaz que 292 00:19:58,990 --> 00:20:09,670 la iterable. O sea que cualquier colección tiene que tener un mecanismo mágico para decir, oye, 293 00:20:09,670 --> 00:20:16,329 quiero recorrer la colección entera. No sé cómo está hecha la colección, pero quiero entrar en 294 00:20:16,329 --> 00:20:24,910 todos los elementos, en todos y una vez por cada elemento. Haz algo, pónmelos en una pila, 295 00:20:24,910 --> 00:20:31,390 ponmelos en una columna, ponmelos en un saco, pero yo lo que quiero ahora es mirar todos los 296 00:20:31,390 --> 00:20:39,849 elementos que están en esta colección, de uno en uno, todos. ¿Entienden? Entonces, esto me lo da 297 00:20:39,849 --> 00:20:46,750 iterable. ¿Ok? Iterable es algo que se puede iterar, es algo que se puede ciclar sobre él, 298 00:20:46,750 --> 00:20:53,430 es algo que se puede mirar uno tras otro, ¿vale? Y mi colección es un iterable, ¿vale? Luego, 299 00:20:53,430 --> 00:20:58,910 Aquí están las colecciones, que es lo básico. Es una colección genérica de datos, de elementos. 300 00:20:59,109 --> 00:21:05,289 No sé bien cómo funciona, pero tendrá los mecanismos más básicos para que sea una colección. 301 00:21:05,609 --> 00:21:07,369 Añadir un elemento, quitar un elemento. 302 00:21:08,470 --> 00:21:14,329 A partir de aquí se crean tres distintas interfaces. 303 00:21:14,569 --> 00:21:18,930 Las tres se heredan de colecciones, entonces son colecciones ellas también. 304 00:21:18,930 --> 00:21:35,930 Pero asumen cosas distintas. El contrato de estas colecciones ya asume un comportamiento distinto con respecto a las colecciones en general, que son las listas, las colas y los conjuntos. 305 00:21:35,930 --> 00:22:03,170 Ahora los tenemos en concreto, pero en la lista, sustancialmente, es la que hemos implementado nosotros, ¿vale? Una lista de elementos, de hecho aquí está ArrayList y LinkedList, que son verdes, estas son implementaciones, estas implementan List, que implementa Collection, que implementa Iterable, ¿vale? 306 00:22:03,170 --> 00:22:09,769 Por lo tanto, una ArrayList es estas tres cosas, tiene métodos de estas tres interfaz, ¿sí? 307 00:22:09,769 --> 00:22:16,849 Y la LinkedList lo mismo, hace lo mismo, ¿sí? La única cosa es que la LinkedList veis que 308 00:22:16,849 --> 00:22:22,549 extiende también otra, ¿sí? Luego está la Queue, ¿vale? La Queue es en inglés, ¿se acuerdan? 309 00:22:22,549 --> 00:22:29,450 Que, sustancialmente, lo que hace es, vale, lo mismo, siempre puedes añadir elementos y quitarlos, 310 00:22:29,450 --> 00:22:39,470 pero la Q mantiene un first in, first out. Entonces, si tú vas a ver la interfaz de cola 311 00:22:39,470 --> 00:22:46,569 y vas a mirar que dice sus métodos añadir, no te dice añádelos donde te da la gana, te dice está 312 00:22:46,569 --> 00:22:56,009 forzado a añadirlo al final. Como que no seas una deck, que es la doble ended Q, que es una cola 313 00:22:56,009 --> 00:22:59,170 que puedes añadir 314 00:22:59,170 --> 00:23:00,670 tanto por un lado como por el otro. 315 00:23:01,509 --> 00:23:03,450 Son, ¿para qué me sirve? 316 00:23:03,529 --> 00:23:05,269 No lo sé. Habrá algunos 317 00:23:05,269 --> 00:23:07,289 problemas en el que yo quiero 318 00:23:07,289 --> 00:23:09,109 que los datos funcionen como una cola, 319 00:23:09,230 --> 00:23:11,529 por lo tanto usaré una priority queue 320 00:23:11,529 --> 00:23:12,930 o algo que 321 00:23:12,930 --> 00:23:15,369 es un implement queue. Habrá otros 322 00:23:15,369 --> 00:23:17,109 en el que me interesa una lista, 323 00:23:17,269 --> 00:23:19,130 entonces usaré una relista o un linked list. 324 00:23:19,509 --> 00:23:21,170 Habrá otros en que me interesa 325 00:23:21,170 --> 00:23:23,390 una pila, pues entonces usaré 326 00:23:23,390 --> 00:23:23,710 stack. 327 00:23:23,710 --> 00:23:26,990 depende de mis necesidades 328 00:23:26,990 --> 00:23:28,769 aquí tengo un conjunto de 329 00:23:28,769 --> 00:23:30,849 todas distintas 330 00:23:30,849 --> 00:23:33,069 posibilidades que hacen 331 00:23:33,069 --> 00:23:34,670 cada uno un poquito distinto 332 00:23:34,670 --> 00:23:36,410 las cosas, por ejemplo 333 00:23:36,410 --> 00:23:39,049 quiero usar una lista, puedo usar una linked list 334 00:23:39,049 --> 00:23:40,970 quiero usar una 335 00:23:40,970 --> 00:23:42,049 coda doble 336 00:23:42,049 --> 00:23:44,869 doble final 337 00:23:44,869 --> 00:23:46,369 pues puedo usar una linked list 338 00:23:46,369 --> 00:23:48,710 linked list me vale para las dos cosas 339 00:23:48,710 --> 00:23:50,549 la linked list es muy flexible 340 00:23:50,549 --> 00:23:52,130 de hecho, la doble 341 00:23:52,130 --> 00:24:01,230 la lista doblemente enlazada que hemos implementado nosotros vale pues puede funcionar sea como cola 342 00:24:01,230 --> 00:24:08,450 de doble doble final que como lista que como otras cosas depende de cómo la uso vale si yo 343 00:24:08,450 --> 00:24:13,490 siempre añado de una parte y quito de la otra pues lo que está haciendo es una una cola una 344 00:24:13,490 --> 00:24:22,970 Sí, una cola. Si en vez de pillo como me da la gana es una lista. Si yo añado siempre delante 345 00:24:22,970 --> 00:24:34,410 y pillo siempre delante, estoy implementando una linked list en el que cuando añado, añado en la 346 00:24:34,410 --> 00:24:49,930 cabeza, añado al principio. Y cuando saco, saco desde el principio. Esta es una exacto pila. 347 00:24:49,930 --> 00:24:52,029 muy bien 348 00:24:52,029 --> 00:24:55,000 y luego están los set 349 00:24:55,000 --> 00:24:57,799 los set tienen una diferencia fundamental 350 00:24:57,799 --> 00:24:59,440 con los otros que es que no 351 00:24:59,440 --> 00:25:01,220 permiten 352 00:25:01,220 --> 00:25:03,640 la duplicación 353 00:25:03,640 --> 00:25:04,440 de los datos 354 00:25:04,440 --> 00:25:07,640 en las listas, en las colas 355 00:25:07,640 --> 00:25:09,579 tú puedes añadir más veces 356 00:25:09,579 --> 00:25:11,359 el mismo dato y él dice ok 357 00:25:11,359 --> 00:25:12,259 muy bien, lo añado 358 00:25:12,259 --> 00:25:14,960 en el set, en el conjunto 359 00:25:14,960 --> 00:25:17,400 no se puede añadir dos veces el mismo 360 00:25:17,400 --> 00:25:19,579 elemento, entonces en los set 361 00:25:19,579 --> 00:25:21,880 es muy importante la definición 362 00:25:21,880 --> 00:25:23,660 del igual. Cuando tú 363 00:25:23,660 --> 00:25:25,559 haces un set, tienes que definir 364 00:25:25,559 --> 00:25:27,660 el igual. ¿Vale? Para definir 365 00:25:27,660 --> 00:25:29,700 cuando dos objetos son el mismo objeto 366 00:25:29,700 --> 00:25:31,599 entonces no tiene sentido ponerlo en el mismo 367 00:25:31,599 --> 00:25:33,720 conjunto. ¿Vale? Si vosotros pensáis 368 00:25:33,720 --> 00:25:35,079 al concepto de conjunto 369 00:25:35,079 --> 00:25:37,920 en general, el concepto matemático 370 00:25:37,920 --> 00:25:39,640 vosotros decís el conjunto de los 371 00:25:39,640 --> 00:25:41,400 números naturales. ¿Vale? 372 00:25:41,839 --> 00:25:43,119 El conjunto de los números naturales. Dos 373 00:25:43,119 --> 00:25:45,599 está en el conjunto de números naturales. Tú no 374 00:25:45,599 --> 00:25:47,680 añades tres veces el dos. ¿Cuáles son 375 00:25:47,680 --> 00:25:49,799 los números naturales? Pues 2, 2, 2 y 2. 376 00:25:50,259 --> 00:25:51,440 Pues no, una vez que has dicho 2, 377 00:25:51,599 --> 00:25:53,220 sabes que 2 es parte del conjunto. 378 00:25:53,839 --> 00:25:55,859 ¿Sí? No se repiten los elementos. 379 00:25:56,960 --> 00:25:57,079 ¿Sí? 380 00:25:58,460 --> 00:25:59,779 Y a partir de aquí 381 00:25:59,779 --> 00:26:01,920 tenemos dos 382 00:26:01,920 --> 00:26:04,240 dos implementaciones 383 00:26:04,240 --> 00:26:05,859 de set, que son la set 384 00:26:05,859 --> 00:26:07,339 y la link de set, ¿vale? 385 00:26:07,720 --> 00:26:09,079 Hablaremos de funcionage, 386 00:26:09,500 --> 00:26:11,859 y qué es una funcionage, y... 387 00:26:12,859 --> 00:26:13,720 Os doblegará la cabeza. 388 00:26:15,859 --> 00:26:17,660 Y también tenemos una 389 00:26:17,660 --> 00:26:20,720 interfaz que es sorted set 390 00:26:20,720 --> 00:26:21,759 o sea set 391 00:26:21,759 --> 00:26:23,599 ordenado 392 00:26:23,599 --> 00:26:26,259 del que deriva el triset 393 00:26:26,259 --> 00:26:28,400 el triset es un set 394 00:26:28,400 --> 00:26:30,099 entonces no puedo meter 395 00:26:30,099 --> 00:26:32,680 dos elementos iguales 396 00:26:32,680 --> 00:26:33,740 dentro de este set 397 00:26:33,740 --> 00:26:35,660 pero cuando añado los elementos 398 00:26:35,660 --> 00:26:38,640 él en automático me los ordena 399 00:26:38,640 --> 00:26:40,039 de la forma que he dicho antes 400 00:26:40,039 --> 00:26:42,960 por lo tanto mis datos están ordenados 401 00:26:42,960 --> 00:26:44,319 dentro de esta estructura 402 00:26:44,319 --> 00:26:46,160 sin que yo haga nada, ya están ordenados 403 00:26:46,160 --> 00:26:47,460 desde el principio 404 00:26:47,460 --> 00:27:09,650 A ver, en el contexto de la seguridad de cifrado y cosas por el estilo, se usan los hash, 405 00:27:09,650 --> 00:27:17,569 no tanto para garantizar seguridad, cuanto para garantizar que lo que tienes es lo que 406 00:27:17,569 --> 00:27:21,410 había. En el sentido que tú puedes 407 00:27:21,410 --> 00:27:25,470 pillar una tira de ceros y unos, ¿vale? Aplicarle 408 00:27:25,470 --> 00:27:29,690 una función hash que sustancialmente te da un resumen, ¿vale? 409 00:27:29,690 --> 00:27:33,690 Es como que cada número es mapeado en otro 410 00:27:33,690 --> 00:27:37,769 número, ¿vale? Más pequeño. Y en 411 00:27:37,769 --> 00:27:41,470 teoría, números parecidos de origen 412 00:27:41,470 --> 00:27:45,890 se mapean en números de destino distintos. 413 00:27:45,890 --> 00:27:52,450 Entonces, tú mandas una cadena de unos y ceros, que al fin y al cabo es un número, 414 00:27:52,450 --> 00:27:59,769 y al final le pegas el hash, o sea, pillo este número y miro a qué número se corresponde, 415 00:27:59,769 --> 00:28:03,829 se le corresponde al número 20 después que he hecho esta función hash, esta función 416 00:28:03,829 --> 00:28:04,829 más. 417 00:28:04,829 --> 00:28:05,829 ¿Vale? 418 00:28:05,829 --> 00:28:09,849 Si ahora cuando yo te mando estos datos hay una corrupción, alguien cambia algo y cosas 419 00:28:09,849 --> 00:28:14,630 por el estilo, cuando voy a pillar el mismo número a aplicarle la función hash, en vez 420 00:28:14,630 --> 00:28:21,230 de darme 20, me da 27. Entonces, como el número hash no es el mismo, pues entonces puedo saber que 421 00:28:21,230 --> 00:28:27,869 ha habido un error, que ha habido un cambio. Entonces eso es lo que se suele utilizar la 422 00:28:27,869 --> 00:28:38,269 función hash. Luego, a nivel de cifrado, pues hay otros algoritmos y otros sistemas, que a lo mejor 423 00:28:38,269 --> 00:28:43,869 alguno de esos se basa sobre alguna función hash, pero me parecería raro porque el problema de la 424 00:28:43,869 --> 00:28:50,589 funcional es que hace categorización o sea que números diversos distintos pueden caer en el mismo 425 00:28:50,589 --> 00:29:00,609 el mismo número representante y es como hacer imagínate tú pillas 20 categorías más sencillo 426 00:29:00,609 --> 00:29:05,549 pillas dos categorías y de los números para en la categoría 1 los números imparen en la categoría 2 427 00:29:05,549 --> 00:29:12,670 este es un funcional pero es un funcional entonces el problema que tienes es que 4 y 6 caen en la 428 00:29:12,670 --> 00:29:18,430 misma categoría. Entonces no te permiten ser seguro porque no. Una vez que te digo la misma categoría, 429 00:29:18,430 --> 00:29:25,190 que es pares, que no pones el 1 o es el 0, no lo sé, pues tú no sabes volver a si era 4 o si era 6. 430 00:29:29,190 --> 00:29:34,910 Pero todavía esto es un tema reciente y complejo que veréis en segundo de DAM, 431 00:29:34,910 --> 00:29:44,630 Programación de Servicios y Procesos, en 3DAM. Hacéis DAW segundo y luego después hacéis segundo 432 00:29:44,630 --> 00:29:51,970 de DAM y allí lo veis. En unos seis, ocho años estáis en Roma. 433 00:29:51,970 --> 00:30:11,990 esta es uno de los métodos en que se utilizan otro método es aquí para que sea esta es una 434 00:30:11,990 --> 00:30:19,630 de las set es una de los de las colecciones de las estructuras dinámicas más rápida porque si 435 00:30:19,630 --> 00:30:28,390 haces bien la funcional buscar allí dentro es súper rápido esa si la haces bien bien es a nivel 436 00:30:28,390 --> 00:30:39,490 de una constante de tiempo que está lo que es lo mejor que puedo y dudas todo es un esquema 437 00:30:39,490 --> 00:30:45,009 ahora lo que vamos a hacer es ver cada una de estas a ver qué pasa vale más o menos y no todas 438 00:30:45,009 --> 00:30:53,259 hoy porque entonces que me permite hacer colección fijaros que aquí no hay 439 00:30:53,259 --> 00:30:57,759 implementaciones es una interfaz vale aquí no se dice que se tiene que 440 00:30:57,759 --> 00:31:02,559 implementar aquí se dice bozo este es el contrato tú quieres ser una colección 441 00:31:02,559 --> 00:31:07,920 pues tiene que implementar esto fijaos os recuerda algo 442 00:31:07,920 --> 00:31:09,920 a lo que hemos hecho. 443 00:31:09,920 --> 00:31:11,920 ¿Nuestra interfaz? 444 00:31:11,920 --> 00:31:13,920 ¡Qué casualidad! 445 00:31:13,920 --> 00:31:15,920 ¿No? 446 00:31:15,920 --> 00:31:17,920 Grosso modo, nuestra interfaz 447 00:31:17,920 --> 00:31:19,920 la que hemos hecho nosotros 448 00:31:19,920 --> 00:31:21,920 para hacer nuestra lista 449 00:31:21,920 --> 00:31:23,920 y nuestra lista enlazada, pues tenía 450 00:31:23,920 --> 00:31:25,920 un añademe un elemento, 451 00:31:25,920 --> 00:31:27,920 un dime el tamaño de la colección, 452 00:31:27,920 --> 00:31:29,920 un quita el elemento, 453 00:31:29,920 --> 00:31:31,920 el contains 454 00:31:31,920 --> 00:31:33,920 nosotros lo hemos llamado busca 455 00:31:33,920 --> 00:31:35,920 en un cierto sentido, hemos hecho algo un poquito más, 456 00:31:35,920 --> 00:31:41,619 me diría si está o no. Nosotros hemos ido más allá. Te digo si está o no y te digo dónde está. 457 00:31:41,619 --> 00:31:49,359 Y luego está esto de iterator, que nosotros no hemos visto, pero ¿de dónde saldrá este iterator? 458 00:31:49,359 --> 00:31:51,759 De iterador. 459 00:31:51,759 --> 00:32:02,299 Iterator es un mecanismo para darle un iterador. Un iterador es un bicho que yo le puedo preguntar 460 00:32:02,299 --> 00:32:13,339 hay otro elemento y me dice así si todavía no he recurrido toda la la toda la estructura de datos 461 00:32:13,339 --> 00:32:20,039 vale y me dirá falses y ya he mirado todos los elementos que están allí y además a este le 462 00:32:20,039 --> 00:32:26,720 puede decir dame el siguiente pues yo no sé el cómo se ha organizado pero él ha pillado todos 463 00:32:26,720 --> 00:32:28,960 los elementos, los han metido en un orden 464 00:32:28,960 --> 00:32:30,559 y cada vez que yo le digo, hay otro, 465 00:32:30,700 --> 00:32:32,119 sí, hay otro, dámelo, toma. 466 00:32:32,559 --> 00:32:34,259 Hay otro, sí, hay otro, oh, dámelo. 467 00:32:35,359 --> 00:32:36,819 ¿Sí? Con dos métodos que son 468 00:32:36,819 --> 00:32:38,839 next, para darme 469 00:32:38,839 --> 00:32:40,720 el siguiente, y has 470 00:32:40,720 --> 00:32:42,680 next, para preguntarme 471 00:32:42,680 --> 00:32:43,960 si lo tienes o no. ¿Vale? 472 00:32:44,319 --> 00:32:45,839 Entonces, con esto de aquí es un while. 473 00:32:47,039 --> 00:32:48,779 While has next. 474 00:32:49,680 --> 00:32:50,119 Next. 475 00:32:51,700 --> 00:32:52,779 ¿Sí? Porque no sé 476 00:32:52,779 --> 00:32:54,019 cuántos son. Bueno. 477 00:32:54,900 --> 00:32:55,779 Podría saberlo, 478 00:32:55,779 --> 00:33:00,640 pero el iterador tiene esta ventaja de, si lo quiero recorrer todo, pues me da igual 479 00:33:00,640 --> 00:33:05,539 cuántos son. Empieza de primero y sigue dándole. 480 00:33:05,539 --> 00:33:14,069 Very well. Interfaces que extienden a collections, ¿vale? Set, que son conjuntos. Los 481 00:33:14,069 --> 00:33:19,609 conjuntos son grupos de elementos en los que no se admiten elementos repetidos, ¿vale? 482 00:33:19,609 --> 00:33:31,369 cómo se comparan los elementos con iguales y con asco vale asco de iguales son amiguitos van juntos 483 00:33:31,369 --> 00:33:36,210 y hay que estar cuidado que tener cuidado porque cuando toco uno tengo que tocar el otro y tienen 484 00:33:36,210 --> 00:33:43,730 que ser y funcionar bien no pueden funcionar como le da la gana vale lo veremos cuando veremos los 485 00:33:43,730 --> 00:33:48,990 set un poquito más en detalle podemos nuestro set o lo que sea pues hablaremos un poquito de 486 00:33:48,990 --> 00:33:58,529 nosotros simplificaremos un poquito estas cosas porque si vosotros miráis en Eclipse donde está 487 00:33:58,529 --> 00:34:05,009 el source que nosotros ya hacemos los constructores allí o hacemos el toString también cuando me dice 488 00:34:05,009 --> 00:34:11,550 hazme el equals en realidad si lo miráis dice hazme el equals el hashCode a la vez porque tiene que ir de la manera 489 00:34:11,550 --> 00:34:15,369 tienen algunas restricciones entre ellos 490 00:34:15,369 --> 00:34:17,449 que no pueden ser como le da la gana 491 00:34:17,449 --> 00:34:19,010 dos 492 00:34:19,010 --> 00:34:20,949 que dan true a equals 493 00:34:20,949 --> 00:34:23,190 tienen necesariamente que dar el mismo 494 00:34:23,190 --> 00:34:26,670 pero dos que dan el mismo 495 00:34:26,670 --> 00:34:28,809 no necesariamente tiene que ser igual 496 00:34:28,809 --> 00:34:33,480 dos y dos 497 00:34:33,480 --> 00:34:35,139 en nuestro ejemplo 498 00:34:35,139 --> 00:34:35,980 son pares 499 00:34:35,980 --> 00:34:39,380 y entonces dos y dos que son iguales 500 00:34:39,380 --> 00:34:40,760 tienen que dar pares igualmente 501 00:34:40,760 --> 00:34:42,519 no pueden ser dos y dos iguales 502 00:34:42,519 --> 00:34:48,019 y luego decir, pero tiene un hashcode distinto, pero si yo tengo el hashcode que representa el número par, 503 00:34:48,960 --> 00:34:52,480 pues 2 y 4, que no son iguales, son pares en uso. 504 00:34:57,699 --> 00:34:58,179 ¿Tengo una pregunta? 505 00:34:58,719 --> 00:34:59,500 No, no, no. 506 00:34:59,679 --> 00:35:00,920 List, listas. 507 00:35:01,860 --> 00:35:07,699 Este tipo de colecciones se refiere a listas en las que los elementos de la colección tienen un orden. 508 00:35:08,679 --> 00:35:11,159 Existe una secuencia de elementos, ¿vale? 509 00:35:11,159 --> 00:35:16,800 En ellas, cada elemento está en una determinada posición índice de la lista. 510 00:35:17,039 --> 00:35:21,039 El orden normalmente es un orden de inserción. 511 00:35:21,039 --> 00:35:24,639 O sea, cuando yo uso una lista es que vosotros hacéis la lista de la compra. 512 00:35:24,639 --> 00:35:27,039 La lista de la compra es esto, esto, esto, esto. 513 00:35:27,039 --> 00:35:30,239 Y tenéis un orden de los elementos que habéis puesto. 514 00:35:30,239 --> 00:35:41,539 Cuando vais a repercorrer la lista, soleís querer que si la habéis escrito en este orden, lo leáis en este orden. 515 00:35:41,539 --> 00:35:42,840 Esa es una lista. 516 00:35:42,840 --> 00:35:46,039 Cosa que no pasa en el set. 517 00:35:46,039 --> 00:35:50,539 en el set si yo añado tres elementos y ahora voy con literatura decir devuelve 518 00:35:50,539 --> 00:35:57,820 nuestros tres elementos me lo da en el orden que le da la gama 519 00:35:58,539 --> 00:36:04,159 y este tipo de colecciones a referencia a una lista de elementos que siguen el 520 00:36:04,159 --> 00:36:10,780 patrón piso recién prestado entonces lo mismo en una cola yo me espero que el 521 00:36:10,780 --> 00:36:16,159 orden que se ha mantenido desde la inserción y que se te pido no habrá un 522 00:36:16,159 --> 00:36:23,239 un dame el elemento en posición 3, cosa que puede hacer una lista, sino que yo salga simplemente 523 00:36:23,239 --> 00:36:30,179 un añade o dame, porque el orden con el que se añade, el orden con que se saca, pues 524 00:36:30,179 --> 00:36:36,380 ya está definido. Yo no puedo pillar el elemento que me da la gana. Siempre que inserto lo 525 00:36:36,380 --> 00:36:43,320 tengo que insertar al final, siempre que lo pillo tengo que pillar primero. Y esto está 526 00:36:43,320 --> 00:36:52,000 definido en la propia interfaz. Si vosotros vais al API de Java y buscáis 527 00:36:52,000 --> 00:36:59,099 el senso de las interfaces, cuando vais a la queue y vais a leer el contrato que estáis firmando para 528 00:36:59,099 --> 00:37:03,900 hacer los métodos de la queue, te dirá, oye mira, cuando tú implementas la ADD, lo tienes que 529 00:37:03,900 --> 00:37:14,320 implementar para que funcione así. Si no lo haces, te estás cargando el senso de la queue. Entonces listo, 530 00:37:14,320 --> 00:37:16,119 en la interfaz list 531 00:37:16,119 --> 00:37:17,880 defino su sección de elementos 532 00:37:17,880 --> 00:37:19,880 a diferencia del set 533 00:37:19,880 --> 00:37:21,980 si que se permiten 534 00:37:21,980 --> 00:37:24,300 duplicados, añado dos veces el mismo elemento 535 00:37:24,300 --> 00:37:25,940 que daría true cuando hago 536 00:37:25,940 --> 00:37:28,280 equals, pues añado dos veces el mismo elemento 537 00:37:28,280 --> 00:37:30,380 me da igual, que no quiero la duplicación 538 00:37:30,380 --> 00:37:32,519 pues no uses una list, usa otra cosa 539 00:37:32,519 --> 00:37:35,940 aparte de los métodos 540 00:37:35,940 --> 00:37:38,360 de collection, añade métodos 541 00:37:38,360 --> 00:37:40,219 que permitan mejorar los siguientes puntos 542 00:37:40,219 --> 00:37:41,940 acceso a posicionar los elementos 543 00:37:41,940 --> 00:37:49,460 la colección no permite añadir a entrar en posición 7 de colección están si a los las 544 00:37:49,460 --> 00:37:55,619 que que los set que no tienen posicionalidad no puedes decirme dame el elemento posición 3 545 00:37:55,619 --> 00:38:02,519 la lista así ya que esto de acceder a una cierta posición es de la interfaz list no 546 00:38:02,519 --> 00:38:10,670 de la interfaz colección búsqueda de elementos puedo buscar un elemento que me diga dónde está 547 00:38:10,670 --> 00:38:13,269 Esto lo puede hacer porque es una lista 548 00:38:13,269 --> 00:38:15,409 En otros no tendría sentido 549 00:38:15,409 --> 00:38:17,090 Porque no hay esta posicionalidad 550 00:38:17,090 --> 00:38:19,789 Iteración sobre elementos 551 00:38:19,789 --> 00:38:22,050 Mejora el iterador por defecto 552 00:38:22,050 --> 00:38:23,550 Hay un iterador que viene de iterar 553 00:38:23,550 --> 00:38:25,610 Que está implementado para colecciones 554 00:38:25,610 --> 00:38:26,969 Para buscar cualquier colecciones 555 00:38:26,969 --> 00:38:28,130 En la lista dice 556 00:38:28,130 --> 00:38:29,510 Espera, te doy una implementación 557 00:38:29,510 --> 00:38:33,489 Más orientada a como estoy hecho yo 558 00:38:33,489 --> 00:38:34,730 Para que sea más eficiente 559 00:38:34,730 --> 00:38:37,269 Y rango de operaciones 560 00:38:37,269 --> 00:38:39,329 Permite realizar ciertas operaciones 561 00:38:39,329 --> 00:38:40,650 Pero sobre rangos 562 00:38:40,650 --> 00:38:48,070 En vez de decir, añádeme este elemento, añádeme este elemento, añádeme este elemento, te puede decir, añádeme esta colección de elementos. 563 00:38:48,469 --> 00:38:56,369 Te da una colección de elementos, un array, otra lista, y tú me añades todos estos recorriendo esta lista y añadiendo de uno en uno. 564 00:38:56,869 --> 00:39:01,449 Esta operación es sobre rangos, la añaden a nivel de lista. 565 00:39:05,079 --> 00:39:05,960 Esta es la interfaz list. 566 00:39:06,780 --> 00:39:10,619 Hijos de la interfaz list está array list, linked list y vector. 567 00:39:10,619 --> 00:39:13,659 vale, esto son tres 568 00:39:13,659 --> 00:39:15,940 implementaciones distintas 569 00:39:15,940 --> 00:39:17,619 de list 570 00:39:17,619 --> 00:39:19,559 vale, array list 571 00:39:19,559 --> 00:39:21,519 lo hemos hecho, sabemos que es 572 00:39:21,519 --> 00:39:23,400 es una lista que por debajo 573 00:39:23,400 --> 00:39:25,500 tiene un array 574 00:39:25,500 --> 00:39:27,559 muy útil para acceso 575 00:39:27,559 --> 00:39:29,500 aleatorio, acceder 576 00:39:29,500 --> 00:39:31,519 a posiciones cualquiera de mi 577 00:39:31,519 --> 00:39:33,400 lista con el array list es súper rápido 578 00:39:33,400 --> 00:39:35,480 con la linked list 579 00:39:35,480 --> 00:39:37,679 no, pero cuando tú añades 580 00:39:37,679 --> 00:39:39,739 o quitas en un array list 581 00:39:39,739 --> 00:39:44,760 tienes que hacer todo ese trabajo de pillar el array, extenderlo, copiarlo, doblegarlo, etc. 582 00:39:45,340 --> 00:39:48,760 Por lo tanto, la inserción, el quitar, en la ArrayList. 583 00:39:50,079 --> 00:39:51,480 ¿Cuándo se usa la ArrayList? 584 00:39:51,920 --> 00:39:57,440 Cuando tengo muchos datos que cambian poco, pero que se usan mucho. 585 00:39:59,519 --> 00:40:05,380 En una escuela, en septiembre, añado todos los alumnos, pero luego se quedan esos alumnos allí. 586 00:40:05,380 --> 00:40:12,519 Remuevo pocos, pero los uso mucho para ir a mirar sus notas, su horario, su cosa por el estilo. 587 00:40:12,760 --> 00:40:14,480 Pues ArrayList, por ejemplo. 588 00:40:16,179 --> 00:40:18,519 BlinkedList, la hemos hecho, la hemos trabajado. 589 00:40:19,260 --> 00:40:24,679 Tiene esta ventaja, es muy fácil insertar cosas, sobre todo al principio y al final. 590 00:40:25,199 --> 00:40:28,619 Si tengo un puntero al principio y al final, insertar es súper sencillo. 591 00:40:28,619 --> 00:40:30,059 Lo hemos visto, son tres líneas de código. 592 00:40:30,059 --> 00:40:32,719 ahora 593 00:40:32,719 --> 00:40:34,880 buscar algo aquí dentro 594 00:40:34,880 --> 00:40:37,039 o mejor, pillar el elemento 5 595 00:40:37,039 --> 00:40:38,440 es un poco infernal 596 00:40:38,440 --> 00:40:40,239 porque no tengo una forma de llegar 597 00:40:40,239 --> 00:40:42,719 a la posición 5, tengo que entrar 598 00:40:42,719 --> 00:40:45,119 por la cabeza y siguiente, siguiente 599 00:40:45,119 --> 00:40:46,619 siguiente, siguiente, siguiente 600 00:40:46,619 --> 00:40:49,059 por lo tanto puede ser complejo en sitios 601 00:40:49,059 --> 00:40:51,079 en el que cambian 602 00:40:51,079 --> 00:40:53,199 poco los datos y se accede 603 00:40:53,199 --> 00:40:54,780 mucho, o sea que digamos que 604 00:40:54,780 --> 00:40:56,659 de aquí son complementarios 605 00:40:56,659 --> 00:40:58,519 vector 606 00:40:58,519 --> 00:41:03,320 Vector es igual a un ArrayList, muy parecido a un ArrayList. 607 00:41:03,820 --> 00:41:06,019 Lo que cambia es que es ThreadSafe. 608 00:41:06,579 --> 00:41:07,320 ¿Y qué quiere decir? 609 00:41:07,639 --> 00:41:13,880 Pues en segundo de DAM, en programación de procesos y servicios, aprenderéis qué quiere decir. 610 00:41:14,659 --> 00:41:16,380 Nosotros trabajamos con un ThreadSol. 611 00:41:16,960 --> 00:41:17,159 ¿Vale? 612 00:41:17,559 --> 00:41:21,199 Nosotros lanzamos el... hay un solo hijo del hilo de ejecución. 613 00:41:21,639 --> 00:41:26,420 Lanzamos el main y es instrucción por instrucción por instrucción por instrucción. 614 00:41:26,420 --> 00:41:27,059 ¿Vale? 615 00:41:27,059 --> 00:41:37,280 Los programas serios, al lanzarse, crean varios hilos de ejecución que van en paralelo. 616 00:41:37,500 --> 00:41:40,179 Uno en cada nodo, en cada núcleo. 617 00:41:41,860 --> 00:41:44,139 A veces dos en cada núcleo, seis en cada núcleo. 618 00:41:45,480 --> 00:41:53,400 Entonces, cuando no hay un solo hilo de ejecución, pueden pasar problemas serios en la escritura de variables. 619 00:41:53,400 --> 00:41:55,619 porque si yo empiezo a escribir 620 00:41:55,619 --> 00:41:57,320 algo en una variable, en una zona de memoria 621 00:41:57,320 --> 00:41:58,679 empiezo 0, 1, 0 622 00:41:58,679 --> 00:42:01,159 y a mitad de mientras estoy escribiendo 623 00:42:01,159 --> 00:42:03,539 otro hilo de ejecución va en la misma variable 624 00:42:03,539 --> 00:42:04,760 y empieza a escribir 625 00:42:04,760 --> 00:42:07,099 el número que tengo allí 626 00:42:07,099 --> 00:42:09,739 no es ni el que quiere escribir el primer hilo 627 00:42:09,739 --> 00:42:11,980 ni el que el otro, es una mezcla de los dos 628 00:42:11,980 --> 00:42:14,960 esa se llama race condition 629 00:42:14,960 --> 00:42:16,559 y es 630 00:42:16,559 --> 00:42:18,159 mala 631 00:42:18,159 --> 00:42:21,000 por lo tanto 632 00:42:21,000 --> 00:42:29,820 vector me garantiza que si uso multinúcleo o multi hilo pues las operaciones que hago sobre vector 633 00:42:29,820 --> 00:42:37,199 son sincronizadas si yo empiezo a escribir sobre vector bloqueo cualquier otro hilo que intenta 634 00:42:37,199 --> 00:42:42,780 escribir sobre vector y hasta que yo no te diga he acabado pues los otros están ahí esperando como 635 00:42:42,780 --> 00:42:50,000 escribe siempre solo una persona no hay problema el problema es que para garantizar este sistema 636 00:42:50,000 --> 00:42:55,639 es mucho más lejos nosotros que tenemos un hilo sólo usamos arreglist vector no nos interesa 637 00:42:55,639 --> 00:43:04,820 cosa interesante porque está aquí es que desde vector hereda stack a la implementación de la 638 00:43:04,820 --> 00:43:10,760 stack la implementación de la pila en java es una implementación que deriva desde vector 639 00:43:10,760 --> 00:43:16,639 llamó a clase vector cambiamos eso escribimos algunos métodos para que funcione que se ha 640 00:43:16,639 --> 00:43:22,679 empeñado al principio y siempre quito desde el principio y obtengo la stack 641 00:43:23,679 --> 00:43:30,340 tengo la clase vector y stack public stack extends vector 642 00:43:30,340 --> 00:43:36,260 si? dudas? preguntas? 643 00:43:36,260 --> 00:43:42,460 a release! es una presentación típica de las que hemos hecho nosotros se basa en un array dinámico 644 00:43:42,460 --> 00:43:48,880 que aumenta el tamaño según crece la colección de elementos, puede contener elementos duplicados, 645 00:43:48,880 --> 00:43:55,539 permite insertar al final o insertar en una posición concreta, el orden es importante 646 00:43:55,539 --> 00:44:01,300 porque cuando lo recorro voy desde el principio hasta el final, permite el acceso aleatorio, 647 00:44:01,300 --> 00:44:07,179 se puede acceder a la posición 7, la manipulación es lenta porque es necesario realizar muchos 648 00:44:07,179 --> 00:44:14,320 cambios si se elimina algún elemento o sea manipular añadir y quitar es lento acceder 649 00:44:14,320 --> 00:44:21,059 rápido si no está sincronizada o sea no es thread safe los threads aquí hacen caos 650 00:44:23,940 --> 00:44:29,179 picket list es una implementación que se basa sobre lista doblemente enlazada o sea lo que 651 00:44:29,179 --> 00:44:36,280 tenéis que hacer para hoy esa es la implementación que tenéis ya hecha en Java puede contener 652 00:44:36,280 --> 00:44:38,179 de elementos duplicados, permite 653 00:44:38,179 --> 00:44:40,219 insertar al final o en una 654 00:44:40,219 --> 00:44:42,119 posición concreta si yo quiero, ¿vale? 655 00:44:42,159 --> 00:44:44,199 El orden es importante porque cuando la recorro 656 00:44:44,199 --> 00:44:46,300 voy desde el principio hasta el final, o desde 657 00:44:46,300 --> 00:44:47,099 el final hasta el principio. 658 00:44:48,360 --> 00:44:50,159 Esta implementación con respecto a 659 00:44:50,159 --> 00:44:52,039 RELIST mejora la velocidad de monofonación 660 00:44:52,039 --> 00:44:54,179 de los objetos, insertar y remover, ¿vale? 661 00:44:54,199 --> 00:44:55,880 Pero empeora el acceso aleatorio. 662 00:44:56,239 --> 00:44:57,920 Hacer la pasada debe tener que recorrer, 663 00:44:58,079 --> 00:44:59,920 lo hemos dicho ya. No está 664 00:44:59,920 --> 00:45:02,440 sincronizada. Esta de aquí es 665 00:45:02,440 --> 00:45:04,179 guay porque 666 00:45:04,179 --> 00:45:06,079 tiene dentro un montón 667 00:45:06,079 --> 00:45:11,659 de métodos y si yo uso los métodos justos la misma implementación el mismo 668 00:45:11,659 --> 00:45:15,380 objeto linked list puede funcionar como lista puede funcionar como pila puede 669 00:45:15,380 --> 00:45:22,219 funcionar como por qué depende de cómo uso yo los métodos me 670 00:45:22,219 --> 00:45:26,699 funciona de una cosa que es igual por lo que dice 671 00:45:26,699 --> 00:45:32,719 arre list versus linked list cuando uso el otro cuando uso este de aquí vale 672 00:45:32,719 --> 00:45:35,719 este es un array dinámico, de allá el array dinámico que es, 673 00:45:35,719 --> 00:45:38,320 es un array que hace las cosas raras que decimos nosotros, 674 00:45:38,320 --> 00:45:40,719 mientras este es lista doblemente enlazada. 675 00:45:40,719 --> 00:45:42,219 Esto se basa sobre un array, 676 00:45:42,219 --> 00:45:46,420 este de aquí se basa sobre objetos enlazados entre ellos. 677 00:45:46,420 --> 00:45:48,519 ¿Hay que subir al baño? 678 00:45:48,519 --> 00:45:49,519 No. 679 00:45:49,519 --> 00:45:51,420 La manipulación con Adrela es lenta, 680 00:45:51,420 --> 00:45:55,019 la manipulación es rápida con LinkedList, 681 00:45:55,019 --> 00:45:58,619 puede actuar como una lista solo, 682 00:45:58,619 --> 00:45:59,920 porque implementa solo listas, 683 00:45:59,920 --> 00:46:02,119 mientras aquí puede actuar como lista, cola, 684 00:46:02,119 --> 00:46:08,480 porque implementa también otras cosas y mejora para almacenar y acceder a datos 685 00:46:08,480 --> 00:46:15,280 y mejora para vincular los datos. ¿Vale? Mismas cosas. El FAQ, la vemos la próxima. 686 00:46:15,280 --> 00:46:22,880 Dame tres minutos más y os doy un poquito de pausa porque quiero ver y que quede 687 00:46:22,880 --> 00:46:43,199 grabado esto a vi con la acción de este colección desde collection all known 688 00:46:43,199 --> 00:46:48,980 implement y clases podemos encontrar 689 00:46:48,980 --> 00:46:58,300 Estas son clases, esta de aquí, listo, listo, luego está Q y cosas por el estilo, ¿vale? 690 00:46:58,300 --> 00:47:00,579 Y Sep, ¿veis? 691 00:47:00,579 --> 00:47:07,599 Entonces, esta collection en general, si os fijáis collection tiene añadir, añadir 692 00:47:07,599 --> 00:47:16,719 toda una colección, limpiar la colección, ver, oye por favor, ver si este objeto es 693 00:47:16,719 --> 00:47:24,940 contenido de la conexión iterar sobre la conexión borrar un elemento tamaño de la 694 00:47:24,940 --> 00:47:35,380 colección vale son cosas muy genéricas si me voy a una list la lista hereda vale implementa perdón 695 00:47:35,380 --> 00:47:44,420 la collection es iterable, es un interfaz también, estas son superinterfaces 696 00:47:44,420 --> 00:47:54,440 y aquí añade algunas cosillas como esto lo veis que esto está aquí pero no está aquí 697 00:47:54,440 --> 00:48:02,860 veis que la add aquí es sólo añádenme el elemento donde, ni idea, pero la lista añade 698 00:48:02,860 --> 00:48:09,039 un añade un elemento en el índice index para insertarla en una posición de la 699 00:48:09,039 --> 00:48:12,619 lista pero mantiene también mañana donde 700 00:48:12,619 --> 00:48:18,460 quieres tú tiene al césped que hará de 6 701 00:48:19,000 --> 00:48:28,780 insertarlo al principio atlas a la final vale que te las de un índice cualquiera 702 00:48:28,780 --> 00:48:35,099 Vale, cosa por el estilo. Veis que añade algunas cosillas más. Bórrame un índice concreto, 703 00:48:35,099 --> 00:48:45,460 bórreme un objeto, quita el primero, quita el último. Replace, vale, cámbiame. No sé cómo se 704 00:48:45,460 --> 00:48:54,380 utilizará. Size, etcétera. Fijaos que están también cosas guay como devuélveme esta lista 705 00:48:54,380 --> 00:49:08,380 como un array. Y ahora, esperad un segundo, aquí en la ImplementingClass debería estar 706 00:49:08,380 --> 00:49:18,780 ArrayList y LinkedList. ArrayList es la que hemos hecho nosotros e implementa las de list. 707 00:49:18,780 --> 00:49:31,320 Ok, fenomenal. Si vais a LinkedList en vez, LinkedList implementa además de lista, también det y también queue. 708 00:49:32,519 --> 00:49:36,380 Entonces tiene también los métodos para hacer una cola o una lista. 709 00:49:36,380 --> 00:49:44,139 Y si os fijáis aquí, aquí por ejemplo está la pick, la pull, la pop, la push. 710 00:49:44,139 --> 00:49:52,460 Estas son las clásicas funciones que se usan en una cola, en una pila, ¿vale? 711 00:49:52,460 --> 00:50:03,539 Por ejemplo, la pop y la push. La pop es un insertar en la pila, perdón, la push es un insertar en la pila y la pop es un remover en la pila, ¿vale? 712 00:50:03,659 --> 00:50:08,619 Que pero te hacen el efecto de, te lo añaden y last in, first out, ¿sí? 713 00:50:08,619 --> 00:50:14,800 pero si tú te pillas una una link una linked list y luego en vez de hacer la 714 00:50:14,800 --> 00:50:22,219 add y usar la add y remove usa solo pop e push pues la estás utilizando como si fuera una 715 00:50:22,219 --> 00:50:28,000 stack y porque te da la posibilidad de hacerlo una relist la pop e la push no la tiene 716 00:50:28,960 --> 00:50:34,539 entonces no la puedes usar la podrías usarse pero tienes que hacer más atención que como 717 00:50:34,539 --> 00:50:41,179 O sea, aquí ya te dan los métodos para poderlo utilizar, ya pensado por ellos, aquí tú lo tienes que currar tú. 718 00:50:42,280 --> 00:50:46,900 Entonces, dependiendo de qué estructura queréis hacer, pues con una u otra.