1 00:00:00,000 --> 00:00:08,480 Voy a grabar esta clase, por lo tanto si habláis me estáis autorizando a poder grabar vuestra voz 2 00:00:08,480 --> 00:00:14,939 Entonces hoy la primera cosa que vamos a ver es un poco el concepto de estructuras dinámicas en general 3 00:00:14,939 --> 00:00:23,140 Una estructura dinámica es una colección de datos que puede variar su tamaño en tiempo de ejecución 4 00:00:23,140 --> 00:00:29,379 Ya lo hemos hablado varias veces de esto, hay dos tiempos, uno en tiempo de compilación y uno en tiempo de ejecución, más o menos 5 00:00:29,379 --> 00:00:45,439 El tiempo de compilación es cuando tú estás programando, entonces vas a compilar tu código y te sale un fichero .class con dentro bytecode que luego la Java Virtual Machine interpretará porque se interpreta. 6 00:00:45,439 --> 00:00:53,600 ¿Vale? Os acordaos que Java es mitad compilado, mitad interpretado, principalmente interpretado por la Java Hector Machine. 7 00:00:55,140 --> 00:01:03,380 Entonces, estos dos tiempos son distintos en el sentido que hay cosas que se pueden hacer cuando todavía el programa no se ha ejecutado, 8 00:01:03,719 --> 00:01:08,700 pero hay otras cosas que no, que hasta que el programa no se ejecute no sé qué va a pasar. 9 00:01:08,700 --> 00:01:30,480 ¿Vale? Cuando yo leo un número por teclado, ¿vale? Y digo, vale, dame tu edad. Yo sé que va a leer un número, pero hasta que no lo ejecute, no sé si el usuario se va a equivocar y en vez de ponerme un número me pone gato. ¿Vale? En ese caso explotaría y no sé qué va a pasar porque todavía no hemos visto la gestión de excepciones. 10 00:01:30,480 --> 00:01:38,760 aquí es un poquito lo mismo vale y nosotros conocemos los arrays vale los arrays son una 11 00:01:38,760 --> 00:01:47,819 estructura que son una colección de datos sí o no ahora el tamaño de los arrays cuando se decide 12 00:01:47,819 --> 00:02:00,379 normalmente el tiempo de compilación sí ahora podría hacer cosas un poquito distintas vale en 13 00:02:00,379 --> 00:02:05,439 Yo podría pedirte un número, tú pones 7, y yo te hago un array de 7 posiciones. 14 00:02:05,719 --> 00:02:07,659 Pues eso sería a tiempo de ejecución. 15 00:02:08,539 --> 00:02:13,199 Pero todo lo que hago con el array, crearlo, cuando yo lo creo, le tendré que decir, 16 00:02:13,680 --> 00:02:17,280 new array, no sé qué, y entre paréntesis le pongo un tamaño. 17 00:02:17,360 --> 00:02:18,780 Ese es su tamaño, fijo. 18 00:02:20,039 --> 00:02:25,000 Cuando yo le doy ese numerito de allí, la memoria, o sea, la digital machine, 19 00:02:25,000 --> 00:02:28,120 irá a la memoria, pillará un trozo 20 00:02:28,120 --> 00:02:31,199 de memoria y dirá, esto es mi array 21 00:02:31,199 --> 00:02:34,020 y ese trozo, el tamaño de ese trozo 22 00:02:34,020 --> 00:02:37,080 no lo va a cambiar en la vida, la única cosa que yo puedo hacer 23 00:02:37,080 --> 00:02:39,680 para cambiar eso, es crear un nuevo array 24 00:02:39,680 --> 00:02:43,219 ¿si? por eso se dice 25 00:02:43,219 --> 00:02:46,139 que es estático, una vez definido el array, una vez creado 26 00:02:46,139 --> 00:02:49,139 pues así está, sin embargo 27 00:02:49,139 --> 00:02:51,699 yo quiero crear estructuras que puedan 28 00:02:51,699 --> 00:02:53,740 modificar su tamaño 29 00:02:53,740 --> 00:02:56,139 mientras la estoy utilizando 30 00:02:56,139 --> 00:02:57,780 o sea que si yo soy una escuela 31 00:02:57,780 --> 00:02:59,460 y estoy dando de alta de alumnos 32 00:02:59,460 --> 00:03:01,560 y ahora tengo 30 alumnos, pues ahora 33 00:03:01,560 --> 00:03:03,860 puedo añadir otros 100 alumnos 34 00:03:03,860 --> 00:03:04,919 y no pasa nada 35 00:03:04,919 --> 00:03:07,680 es siempre la misma estructura que se va 36 00:03:07,680 --> 00:03:09,159 haciendo más grande 37 00:03:09,159 --> 00:03:11,520 está claro que luego por debajo, dependiendo de cómo 38 00:03:11,520 --> 00:03:13,419 está hecha y de cómo está implementada 39 00:03:13,419 --> 00:03:15,919 podría hacer cosas distintas 40 00:03:15,919 --> 00:03:17,960 si nosotros la hemos implementado con un array 41 00:03:17,960 --> 00:03:19,580 pues llegará un momento que el array 42 00:03:19,580 --> 00:03:21,500 estará lleno y entonces 43 00:03:21,500 --> 00:03:23,439 tendré que crear una red más grande 44 00:03:23,439 --> 00:03:25,180 y volcar todo, etc 45 00:03:25,180 --> 00:03:27,539 pero si por ejemplo pensáis a como 46 00:03:27,539 --> 00:03:29,740 hemos implementado la linked list 47 00:03:29,740 --> 00:03:31,680 pues la linked list no necesita 48 00:03:31,680 --> 00:03:33,759 eso, añado más 100 usuarios 49 00:03:33,759 --> 00:03:35,840 pues son 100 objetos nuevos que creo 50 00:03:35,840 --> 00:03:37,659 enlazados entre ellos, ya está 51 00:03:37,659 --> 00:03:43,740 entonces la diferencia 52 00:03:43,740 --> 00:03:45,539 fundamental sería que una vez 53 00:03:45,539 --> 00:03:47,479 definido el tamaño del array 54 00:03:47,479 --> 00:03:48,979 esto no se puede modificar 55 00:03:48,979 --> 00:03:51,400 en tiempo de jugación, se puede crear un nuevo array 56 00:03:51,400 --> 00:03:53,539 pero no modificar el array que tenemos, mientras una estructura 57 00:03:53,539 --> 00:03:55,360 dinámica permite modificar dinámicamente 58 00:03:55,360 --> 00:03:57,560 el número de objetos que puede almacenar 59 00:03:57,560 --> 00:03:59,180 hasta una 60 00:03:59,180 --> 00:04:01,460 virtualmente 61 00:04:01,460 --> 00:04:02,900 infinito, pero claramente 62 00:04:02,900 --> 00:04:05,439 en informática no existe nada que sea 63 00:04:05,439 --> 00:04:07,340 infinito, ¿vale? porque siempre tenemos 64 00:04:07,340 --> 00:04:09,259 límites grandes de memoria 65 00:04:09,259 --> 00:04:11,280 y cosas por el estilo, mientras que 66 00:04:11,280 --> 00:04:13,360 tenga memoria puedo crear nuevos objetos 67 00:04:13,360 --> 00:04:15,379 si creo demasiados objetos 68 00:04:15,379 --> 00:04:17,500 pues llegará un momento en que mi ordenador no puede 69 00:04:17,500 --> 00:04:43,720 Entonces, colapsará. Dentro de las estructuras dinámicas que podemos tener, hay varios tipos, ¿vale? Aquí estamos todavía, no hemos llegado a Java propiamente, ¿vale? Estos son más bien teoría genérica de las estructuras dinámicas. Luego pasaremos a Java y veremos Java, cosa que nos ofrece, ¿vale? 70 00:04:43,720 --> 00:04:53,480 Dentro de las estructuras dinámicas en general, que luego tú puedes implementar en el lenguaje que tú quieras, están las listas, las colas, las pilas y los árboles. 71 00:04:53,839 --> 00:04:57,379 ¿Hay otros? Sí. Estas son las más básicas. 72 00:04:59,100 --> 00:05:08,759 Listas. 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. 73 00:05:08,759 --> 00:05:24,279 ¿Cómo es este modo? No me interesa. Depende de cómo implemento la lista. En el linked list acceder al siguiente es con su campo siguiente. En el array list acceder al siguiente es cambiar el numerito del array. 74 00:05:24,279 --> 00:05:27,699 pero dependiendo de cómo tú lo implementes 75 00:05:27,699 --> 00:05:29,379 tendrás un modo para 76 00:05:29,379 --> 00:05:31,540 sustancialmente recorrer esta lista 77 00:05:31,540 --> 00:05:33,959 tendrás un inicio 78 00:05:33,959 --> 00:05:35,639 tendrá una serie de objetos 79 00:05:35,639 --> 00:05:37,560 que están enlazados de alguna 80 00:05:37,560 --> 00:05:39,459 forma entre ellos, repito, como objetos 81 00:05:39,459 --> 00:05:41,379 o porque están en un array o 82 00:05:41,379 --> 00:05:43,040 por otro método que tú te inventes 83 00:05:43,040 --> 00:05:45,740 en la lista el orden de los objetos 84 00:05:45,740 --> 00:05:47,379 la escritura es importante 85 00:05:47,379 --> 00:05:49,680 es una lista, cuando yo voy a meterlos 86 00:05:49,680 --> 00:05:51,800 aquí hay un cierto 87 00:05:51,800 --> 00:05:53,220 orden 88 00:05:53,220 --> 00:06:04,500 que no necesariamente es el orden de inserción, pero sustancialmente, ¿por qué pensáis que es importante el orden en una lista? 89 00:06:05,439 --> 00:06:10,240 ¿Por qué el orden tiene algo que ver con la lista? 90 00:06:13,060 --> 00:06:17,660 Porque la lista siempre inicia desde el inicio, inicia desde el objeto primero. 91 00:06:17,660 --> 00:06:27,319 Entonces, si yo pongo un objeto al final de la lista, encontrarlo me costará siempre más que el primero de la lista, por ejemplo. 92 00:06:27,920 --> 00:06:40,279 Entonces, dependiendo de lo que quiero hacer con estos objetos, pues puede ser que la lista no sea la mejor opción, o puede ser simplemente que en vez de ordinarlos con el orden de inserción, 93 00:06:40,279 --> 00:06:50,819 o sea, el primero que inserto lo pongo primero, el segundo, segundo, tercero, tercero, pues a lo mejor me compensa crear otro tipo de orden, ¿vale? 94 00:06:50,819 --> 00:07:03,459 Como por ejemplo, yo doy una prioridad a mis objetos y los objetos con prioridad más alta se pondrán antes de los objetos con prioridad más baja, ¿vale? 95 00:07:04,680 --> 00:07:09,899 Una característica de la lista es que se pueden insertar nuevos objetos donde quiera, ¿vale? 96 00:07:10,279 --> 00:07:16,279 normalmente nosotros por ejemplo hemos hecho que se añade al final una opción que se añaden o al 97 00:07:16,279 --> 00:07:22,160 final o al principio vale pero en teoría la lista debería darme la posibilidad de decir 98 00:07:22,160 --> 00:07:30,439 encércame esto en posición 3 esto me permite hacer listas ordenadas yo podría insertar un 99 00:07:30,439 --> 00:07:35,899 nuevo objeto y esto por ejemplo como hemos dicho con un campo prioridad y él me lo va a poner 100 00:07:35,899 --> 00:07:43,160 primero o último depende como quiero yo pero dejé entre que aquellos objetos que tengan la misma 101 00:07:43,160 --> 00:07:49,139 prioridad entonces si yo inserto un prioridad 2 por ejemplo y esto tiene prioridad 1 será 102 00:07:49,139 --> 00:07:54,079 seguramente después de esto esto tiene primero uno después después de esto esto ya tiene problema 103 00:07:54,079 --> 00:08:00,160 prioridad 2 pues sólo inserto aquí o lo inserto después dependiendo de cómo quiero hacerlo pero 104 00:08:00,160 --> 00:08:03,100 seguramente antes de todos aquellos que tienen prioridad 3. 105 00:08:04,639 --> 00:08:10,500 ¿Cómo implementaríais vosotros un concepto de prioridad? 106 00:08:11,660 --> 00:08:17,160 ¿Cómo podríamos hacer nosotros que insertamos un objeto y él elige dónde ponerlo? 107 00:08:23,139 --> 00:08:24,819 ¿Ese no es un string? 108 00:08:32,830 --> 00:08:36,210 Pero si no sabemos qué objeto es, ¿por qué tiene un número? 109 00:08:36,210 --> 00:08:47,730 ¿Qué haríais vosotros para que yo pueda saber si este objeto va antes o después? 110 00:08:55,799 --> 00:08:57,360 ¿Eso no lo hemos visto? 111 00:09:02,100 --> 00:09:06,399 Exacto, un método por ejemplo interesante podría ser la interfaz comparable 112 00:09:06,399 --> 00:09:13,039 Como la interfaz comparable me permite comparar dos objetos y saber si es mayor o menor 113 00:09:13,039 --> 00:09:18,940 Yo podría decir, defino dentro de mi lista los objetos, los defino con comparable 114 00:09:18,940 --> 00:09:21,179 Entonces implemento el método compareTo 115 00:09:21,179 --> 00:09:24,840 Y cuando voy a insertar un elemento 116 00:09:24,840 --> 00:09:28,840 Para poderlo insertar lo voy a comparar con todos los elementos 117 00:09:28,840 --> 00:09:31,399 Y digo, ¿es más grande o más pequeño que este de aquí? 118 00:09:32,120 --> 00:09:33,820 Si este es más pequeño lo dejo primero 119 00:09:33,820 --> 00:09:35,360 ¿Este es más grande o más pequeño? 120 00:09:35,419 --> 00:09:36,799 Este es más grande, pues entonces va aquí 121 00:09:36,799 --> 00:09:40,279 Para que siempre me quede ordenada la lista 122 00:09:40,279 --> 00:09:41,919 De menor a mayor o de mayor a menor 123 00:09:41,919 --> 00:09:43,539 Dependiendo de cómo lo podáis hacer, ¿vale? 124 00:09:44,980 --> 00:09:48,600 Al recorrer la lista lo haré desde el inicio hasta el final, ¿vale? 125 00:09:48,600 --> 00:10:01,639 Esta es una cosa importante de las listas, que normalmente hay el punto de acceso inicial y desde aquí tendré un mecanismo, como hemos dicho, para mirar el siguiente, para mirar el siguiente, para mirar el siguiente. 126 00:10:01,860 --> 00:10:06,899 Entonces, hay listas, hay implementaciones de listas que me permiten un poquito evitar esto. 127 00:10:07,220 --> 00:10:12,980 Como por ejemplo, la lista implementada como array permite acceder donde te da la gana. 128 00:10:12,980 --> 00:10:19,940 Yo puedo decir, acceder a la posición 7, y él accederá directamente a la posición 7 de la array, y entonces me evito de saltar uno por uno. 129 00:10:20,019 --> 00:10:24,000 Pero, por ejemplo, la lista implementada como un linked list no me permite hacer esto. 130 00:10:24,120 --> 00:10:30,879 Tengo que insertar en el primero, entrar en el primero, y luego ir al segundo, y del segundo al tercero, del tercero al cuarto, hasta llegar al 7. 131 00:10:32,000 --> 00:10:32,440 Dudas. 132 00:10:36,440 --> 00:10:42,580 Las colas son parecidas a las listas, pero tienen una política fifo. 133 00:10:43,159 --> 00:10:44,899 First in, first out. 134 00:10:44,899 --> 00:10:53,620 O sea, el primero que tú has insertado tiene que ser el primer objeto que tú quites, ¿vale? 135 00:10:54,240 --> 00:11:01,759 Esta es una fila, es una cola del supermercado, es una cola de una ventanilla, una cosa de ese estilo, ¿vale? 136 00:11:01,779 --> 00:11:04,700 El primero que llega será el primero que será atendido. 137 00:11:05,100 --> 00:11:12,320 Si yo implemento una cola, sustancialmente podría implementarla con un array, podría implementarla con una linked list que hemos visto, 138 00:11:12,320 --> 00:11:31,320 Pero cuando voy a hacer la GET y la ADD, la que añade un elemento y la que pilla un elemento, cuando hago ADD siempre lo añadiré al final de la cola y cuando hago el GET siempre pillaré el objeto más viejo según orden de inserción. 139 00:11:31,320 --> 00:11:37,899 inserción. ¿Podría cambiar yo a hacer una cola especial, que es una cola de prioridad, por ejemplo, 140 00:11:38,340 --> 00:11:46,700 en el que se ordenan, pero no se ordenan según el orden de inserción, sino se ordenan según un orden 141 00:11:46,700 --> 00:11:52,919 distinto, un orden de prioridad, un orden alfabético, un orden de numerito de 1 a 10, qué sé yo, pues sí lo 142 00:11:52,919 --> 00:12:00,740 puedo hacer. Serían colas especiales. Normalmente la cola, así cuando lo pienso en general, debería 143 00:12:00,740 --> 00:12:06,860 ser que los primeros insertados son los primeros que se salen que salen de la cola si esto por 144 00:12:06,860 --> 00:12:16,220 ejemplo se puede utilizar para si yo tengo un programa que tiene que procesar alumnos y hacer 145 00:12:16,220 --> 00:12:21,740 algo con ellos ellos lo que tengo otro programita o algo por estilo que va añadiendo a la cola los 146 00:12:21,740 --> 00:12:26,659 alumnos que tiene que hacer y de vez en cuando el programa va a mirar vale voy a procesar uno 147 00:12:26,659 --> 00:12:31,460 de estos alumnos a ver cuál le toca le toca este de aquí que es el primero vale lo procesa y hace 148 00:12:31,460 --> 00:12:41,600 lo que tenga en una cola siempre tengo una cabeza este de aquí normalmente es el primer elemento que 149 00:12:41,600 --> 00:12:47,539 voy a sacar o sea el más viejo el primero que ha insertado entonces cuando yo inserto simplemente 150 00:12:47,539 --> 00:12:53,059 la cabeza la mueva aquí cuando yo remuevo perdón cuando yo pillo este objeto y digo dame el objeto 151 00:12:53,059 --> 00:12:55,179 esto se remueve, la cabeza se mueve al siguiente 152 00:12:55,179 --> 00:12:57,419 objeto que se vuelve la cabeza de la cola 153 00:12:57,419 --> 00:12:58,620 ¿sí? 154 00:12:59,500 --> 00:12:59,879 ¿judas? 155 00:13:01,399 --> 00:13:02,159 ¿se entiende más o menos? 156 00:13:03,960 --> 00:13:05,000 la pila 157 00:13:05,000 --> 00:13:07,539 es al revés, por distinta 158 00:13:07,539 --> 00:13:08,840 es LIFO 159 00:13:08,840 --> 00:13:11,919 last in, first out 160 00:13:11,919 --> 00:13:12,620 ¿vale? 161 00:13:12,620 --> 00:13:14,860 el último que he insertado 162 00:13:14,860 --> 00:13:16,779 es el primero que quito 163 00:13:16,779 --> 00:13:17,960 ¿sí? 164 00:13:19,120 --> 00:13:20,299 por ejemplo 165 00:13:20,299 --> 00:13:22,559 las llamadas a métodos 166 00:13:22,559 --> 00:13:25,580 dentro de la Java Virtual Machine 167 00:13:25,580 --> 00:13:28,279 se implementan como una pila 168 00:13:28,279 --> 00:13:29,919 porque tú tienes el método main 169 00:13:29,919 --> 00:13:32,039 dentro del método main llamas el 170 00:13:32,039 --> 00:13:33,620 añade alumno 171 00:13:33,620 --> 00:13:35,720 dentro del añade alumno llamas el 172 00:13:35,720 --> 00:13:36,539 cambianombre 173 00:13:36,539 --> 00:13:39,580 el primero que acaba será 174 00:13:39,580 --> 00:13:41,860 cambianombre, entonces cuando acabo 175 00:13:41,860 --> 00:13:43,639 cambianombre vuelvo 176 00:13:43,639 --> 00:13:45,080 no al primero 177 00:13:45,080 --> 00:13:47,620 a main 178 00:13:47,620 --> 00:13:50,240 pero vuelvo a 179 00:13:50,240 --> 00:13:51,679 añade alumno 180 00:13:51,679 --> 00:14:04,820 Entonces estoy haciendo como una cola, ¿vale? Una pila, perdón. La primera, la base de la pila sería el main, por encima de la pila pongo el agrega alumnos, por encima el llama nombre. 181 00:14:04,960 --> 00:14:12,659 Cuando acaba llama nombre y quito llama nombre de esta pila de ejecución, pues lo que tengo por debajo sería agregar alumno. 182 00:14:12,659 --> 00:14:21,559 Cuando acabo de agregar alumno vuelvo al main, ¿vale? Esto es como se hacen normalmente las llamadas de métodos en Java o en cualquier lenguaje de programación más o menos. 183 00:14:21,679 --> 00:14:27,259 ¿Habéis visto alguna vez el juego de la Torre de Hanoi? 184 00:14:29,019 --> 00:14:35,149 Hanoi, no sois informáticos. 185 00:14:36,269 --> 00:14:38,149 Torre de Hanoi. 186 00:14:39,970 --> 00:14:42,610 ¿Eh? ¿Este aquí? ¿Eh? ¿Sí? ¿Os suena? 187 00:14:43,470 --> 00:14:44,029 ¿Tocos aquí? 188 00:14:48,230 --> 00:14:52,529 Vale, es que, sustancialmente, tenéis todos los anillos en un palo 189 00:14:52,529 --> 00:14:55,929 y tenéis que volver a... tenéis que conseguir ponerlos aquí, 190 00:14:55,929 --> 00:14:58,309 pero solo podéis mover el palo de arriba 191 00:14:58,309 --> 00:14:59,950 o sea, el anillo de arriba 192 00:14:59,950 --> 00:15:01,809 pues esto es una pseudopila 193 00:15:01,809 --> 00:15:03,230 ¿sí? 194 00:15:03,649 --> 00:15:05,590 porque yo no puedo mover el de abajo 195 00:15:05,590 --> 00:15:07,990 tengo que mover esto, que es el último 196 00:15:07,990 --> 00:15:08,830 que he metido dentro 197 00:15:08,830 --> 00:15:13,629 ¿sí? bueno, esto es un programa 198 00:15:13,629 --> 00:15:14,429 típico 199 00:15:14,429 --> 00:15:17,289 de, o sea, programar 200 00:15:17,289 --> 00:15:19,169 un programa que te hace todas las 201 00:15:19,169 --> 00:15:20,830 monsas para mover esto aquí 202 00:15:20,830 --> 00:15:22,309 es un programa típico 203 00:15:22,309 --> 00:15:24,009 de la informática 204 00:15:24,009 --> 00:15:27,950 sigo, entonces 205 00:15:27,950 --> 00:15:41,549 Entonces, estos al fin y al cabo son todos parecidos a listas, son cosas que tú añades los objetos y los objetos se van, hay un punto de acceso y se van añadiendo uno tras otro y hay una forma para ir de uno a otro, ¿vale? 206 00:15:41,889 --> 00:15:51,210 Pero, mientras una lista es simplemente una lista como la lista de la compra, la cola tiene esta particularidad de que no puedes pillar el que te da la gana, 207 00:15:51,210 --> 00:15:58,210 Tienes que pillar solo el más viejo que has insertado o según tu política de ancianidad. 208 00:15:59,710 --> 00:16:03,169 Y la pila, en vez, es que el último que has insertado es el primero que quitarás. 209 00:16:07,299 --> 00:16:09,580 Finalmente está el concepto de árbol. 210 00:16:09,940 --> 00:16:19,980 En informática hablamos de árbol cuando vemos un grafo acíclico parecido a este de aquí. 211 00:16:19,980 --> 00:16:27,240 Un grafo son nodos conectados con conexiones aristas, creo que lo llamáis, entre ellos. 212 00:16:28,500 --> 00:16:36,679 Cuando un árbol no tiene nunca ciclos, o sea, si yo conecto estos dos puntitos de aquí entre ellos, 213 00:16:37,120 --> 00:16:39,000 pues entonces no sería un árbol. 214 00:16:39,879 --> 00:16:46,879 Y tiene la característica de que normalmente un nodo tiene un solo progenitor y tiene cuantos hijos tiene. 215 00:16:46,879 --> 00:16:49,259 entonces, si os fijáis 216 00:16:49,259 --> 00:16:51,080 esto tiene un solo padre, madre 217 00:16:51,080 --> 00:16:52,320 o lo que más os dé la gana 218 00:16:52,320 --> 00:16:55,559 pero puede tener varios hijos 219 00:16:55,559 --> 00:16:57,460 entonces 220 00:16:57,460 --> 00:16:59,419 se crea un árbol porque esto es el 221 00:16:59,419 --> 00:17:01,440 nodo raíz y estas son las 222 00:17:01,440 --> 00:17:03,399 hojas, lo veis el árbol 223 00:17:03,399 --> 00:17:04,160 al revés 224 00:17:04,160 --> 00:17:21,200 nosotros lo hemos llamado nodo 225 00:17:21,200 --> 00:17:23,420 si tú haces un árbol 226 00:17:23,420 --> 00:17:25,299 con un solo hijo 227 00:17:25,299 --> 00:17:27,079 o un solo padre, pues te viene una lista 228 00:17:27,079 --> 00:17:29,319 al fin y al cabo, la ventaja de este 229 00:17:29,319 --> 00:17:31,619 aquí es que un nodo puede tener varios 230 00:17:31,619 --> 00:17:35,339 ¿para qué sirven estos? pues hay algunos tipos 231 00:17:35,339 --> 00:17:38,440 de problemas que si lo miramos como 232 00:17:38,440 --> 00:17:41,039 árboles, esto mejora muchísimo 233 00:17:41,039 --> 00:17:44,240 con respecto a si lo miramos como lista 234 00:17:44,240 --> 00:17:47,339 la lista es lineal, el árbol es 235 00:17:47,339 --> 00:17:50,140 una estructura que no es lineal, tiene varias 236 00:17:50,140 --> 00:17:53,079 diramaciones, tiene más complejidad 237 00:17:53,079 --> 00:17:55,819 en términos de figura, por ejemplo 238 00:17:55,819 --> 00:17:58,819 un uso típico es para ordenar 239 00:17:58,819 --> 00:18:13,359 Yo aquí tengo un objeto que vale no sé cuánto. El siguiente objeto que inserto, lo inserto como su hijo, pero lo inserto a la izquierda si su valor es menor y a la derecha si su valor es mayor. 240 00:18:13,359 --> 00:18:22,079 De esta forma me va distribuyendo y buscar luego los objetos es más rápido, porque por ejemplo, imaginaos que esto sea 5. 241 00:18:22,559 --> 00:18:32,299 Si yo estoy buscando el objeto 7, puedo descartar automáticamente todos estos, porque los que estarán allí serán a la izquierda del 5, entonces valdrán menos de 5. 242 00:18:33,099 --> 00:18:40,599 Voy aquí, me encuentro 9, pues puedo descartarme todo lo que está a la derecha, porque esto será menor que el 5. 243 00:18:40,599 --> 00:18:44,299 Esto se llama árbol binario de búsqueda 244 00:18:44,299 --> 00:18:51,039 Y tiene la particularidad que solo puede tener dos hijos 245 00:18:51,039 --> 00:18:51,920 O mayor o menor 246 00:18:51,920 --> 00:18:54,720 O sea que esto no podría ser porque aquí tiene tres 247 00:18:54,720 --> 00:18:57,380 Es para hacer un ejemplo de 248 00:18:57,380 --> 00:19:00,819 Hay algunos problemas que si utilizado como árbol 249 00:19:00,819 --> 00:19:04,380 Pues funciona mucho mejor que si hago una cosa lineal 250 00:19:04,380 --> 00:19:15,799 si no 251 00:19:15,799 --> 00:19:19,240 porque aquí estamos hablando de una estructura de datos 252 00:19:19,240 --> 00:19:22,359 y estamos hablando de algoritmo de ordenación 253 00:19:22,359 --> 00:19:23,920 y depende de cuál 254 00:19:23,920 --> 00:19:27,180 la ventaja es que 255 00:19:27,180 --> 00:19:31,059 si tú cuando vas a ordenar los datos 256 00:19:31,059 --> 00:19:33,319 en vez de guardarlos en un array 257 00:19:33,319 --> 00:19:35,019 y luego buscar en un array con el método que sea 258 00:19:35,019 --> 00:19:38,200 lo guardas en un árbol de búsqueda binario 259 00:19:38,200 --> 00:19:40,200 y esta tiene algunas características 260 00:19:40,200 --> 00:19:50,440 pues llega a ver, luego la búsqueda es mucho mejor que buscar en un array, pero sí, o ordenarlo. 261 00:19:50,440 --> 00:19:58,349 Claramente, si yo aquí me invento un método que digo cuando inserto uno tengo que mirar si es mayor 262 00:19:58,349 --> 00:20:03,410 o menor que esto y ponerlo a la izquierda o a la derecha, insertar un nuevo nodo va a ser más complejo 263 00:20:03,410 --> 00:20:09,269 que antes, antes era, oye, añádelo, ya está, ahora en vez de, no, pillo, voy a mirar el primo nodo, si 264 00:20:09,269 --> 00:20:11,549 Si el primer nodo es mayor, entonces voy a mirar esto. 265 00:20:11,809 --> 00:20:13,490 Si el primer nodo es mayor, voy a mirar esto. 266 00:20:13,589 --> 00:20:15,309 Y voy a buscar dónde tiene que estar. 267 00:20:16,069 --> 00:20:22,849 Entonces se complica, por ejemplo, la inserción a ventaja de que luego después la búsqueda es mucho mejor. 268 00:20:23,910 --> 00:20:25,009 Pero es un ejemplo. 269 00:20:25,789 --> 00:20:28,369 El árbol como estructura es esto, ¿vale? 270 00:20:29,029 --> 00:20:32,730 Y luego se pueden hacer muchas cosas con ellos. 271 00:20:32,829 --> 00:20:36,730 Cuando hablamos de árbol, el nodo hoja es un nodo que no tiene descendentes. 272 00:20:36,730 --> 00:20:56,940 Un nodo interior es un nodo que no es hoja. Un nodo raíz es el primero que no tiene progenitores. El nivel de árbol es cuántas generaciones tiene el árbol. Por ejemplo, ¿qué nivel tiene este? Cuatro. Una, dos, tres y cuatro. 273 00:20:56,940 --> 00:21:03,230 el grado de un nodo es 274 00:21:03,230 --> 00:21:04,769 ¿cuántos hijos tiene ese nodo? 275 00:21:05,549 --> 00:21:06,670 ¿qué grado tiene este nodo? 276 00:21:07,769 --> 00:21:08,329 3 277 00:21:08,329 --> 00:21:12,740 el grado de un árbol es el máximo 278 00:21:12,740 --> 00:21:14,980 de los nodos de un árbol 279 00:21:14,980 --> 00:21:16,880 entonces en este caso 280 00:21:16,880 --> 00:21:17,980 ¿qué grado tiene este árbol? 281 00:21:22,529 --> 00:21:22,869 3 282 00:21:22,869 --> 00:21:25,049 el máximo 283 00:21:25,049 --> 00:21:28,849 el máximo de los nodos de un árbol 284 00:21:28,849 --> 00:21:29,549 ¿vale? 285 00:21:30,190 --> 00:21:31,490 es el grado máximo 286 00:21:31,490 --> 00:21:42,789 Este de aquí, como tiene un nodo con tres hijos, pues el grado es 3, porque entre todos sus nodos, él tiene 3, ¿vale? 287 00:21:42,789 --> 00:21:49,289 Un árbol binario de búsqueda debería tener grado 2, ¿sí? 288 00:21:49,369 --> 00:21:55,130 Porque no puede tener un nodo con más de dos hijos, ¿sí? 289 00:21:57,029 --> 00:21:58,049 ¿Dudas hasta aquí? 290 00:21:58,049 --> 00:22:00,589 vale, entonces 291 00:22:00,589 --> 00:22:03,190 ahora que tenemos un poquito la idea 292 00:22:03,190 --> 00:22:05,369 de la tipo de colecciones 293 00:22:05,369 --> 00:22:06,930 dinámicas, que se puede hacer 294 00:22:06,930 --> 00:22:09,250 que cosas hay por allí, vamos a ver 295 00:22:09,250 --> 00:22:10,990 Java que nos ofrece, vale 296 00:22:10,990 --> 00:22:13,230 Java implementa una serie 297 00:22:13,230 --> 00:22:15,269 de estructuras dinámicas que extienden 298 00:22:15,269 --> 00:22:16,930 la interface collection 299 00:22:16,930 --> 00:22:19,069 vale, o sea que el punto 300 00:22:19,069 --> 00:22:20,930 más alto en realidad es uno por arriba, pero bueno 301 00:22:20,930 --> 00:22:23,109 la idea de cuando me pongo con 302 00:22:23,109 --> 00:22:24,930 estructuras dinámicas, tengo un 303 00:22:24,930 --> 00:22:26,529 interfaz que se llama collection 304 00:22:26,529 --> 00:22:44,480 que me define algunas herramientas, algunos métodos que tienen que implementar todas las colecciones que hay. 305 00:22:44,700 --> 00:22:53,640 Si voy a mirar Collection, esta es una interfaz y lo que me dice es que cualquier interfaz que quiera hacer Collection 306 00:22:53,640 --> 00:22:58,720 tiene que poder añadir un elemento, remover todos los elementos 307 00:22:58,720 --> 00:23:02,900 de la conexión, buscar un objeto, o sea, decirme si este objeto 308 00:23:02,900 --> 00:23:08,319 está o no en la colección, decirme, no lo sé, si está vacía 309 00:23:08,319 --> 00:23:14,319 la colección, decirme si... quitar un elemento concreto, 310 00:23:14,960 --> 00:23:17,859 decirme el tamaño de cuántos elementos hay, bla, bla, bla, 311 00:23:17,859 --> 00:23:21,759 más otras cosillas. Entonces, cualquier collection 312 00:23:21,759 --> 00:23:24,519 que yo creé en Java 313 00:23:24,519 --> 00:23:27,500 tiene que haber implementado todos estos métodos de aquí 314 00:23:27,500 --> 00:23:29,319 esto quiere decir que una cualquier collection 315 00:23:29,319 --> 00:23:33,099 permite utilizar estos métodos 316 00:23:33,099 --> 00:23:37,640 las colecciones representan un grupo de objetos 317 00:23:37,640 --> 00:23:39,140 denominados elementos 318 00:23:39,140 --> 00:23:42,480 podemos encontrar diversos tipos de colecciones 319 00:23:42,480 --> 00:23:45,160 según si esos elementos están ordenados 320 00:23:45,160 --> 00:23:47,900 si se permiten las repeticiones de los elementos, etc. 321 00:23:48,619 --> 00:23:50,980 cada una de las collections que veremos ahora 322 00:23:50,980 --> 00:23:52,980 son implementaciones que difieren 323 00:23:52,980 --> 00:23:55,119 un poquito una de la otra, con características 324 00:23:55,119 --> 00:23:57,059 un poquito distintas. Luego habrá más 325 00:23:57,059 --> 00:23:59,000 de las que vemos nosotros, pero nosotros 326 00:23:59,000 --> 00:24:00,119 veremos las principales. 327 00:24:01,259 --> 00:24:03,000 Es el tipo más genérico en 328 00:24:03,000 --> 00:24:04,460 cuanto a que se refiere 329 00:24:04,460 --> 00:24:06,880 a cualquier tipo que contenga 330 00:24:06,880 --> 00:24:09,059 un grupo de elementos. O sea, que esto es 331 00:24:09,059 --> 00:24:10,740 no te dice 332 00:24:10,740 --> 00:24:13,259 qué es, no te dice cómo funciona, 333 00:24:13,400 --> 00:24:14,900 no te dice si es una lista, una 334 00:24:14,900 --> 00:24:17,240 cola, un árbol, te dice si es una colección 335 00:24:17,240 --> 00:24:18,940 de datos. Es 336 00:24:18,940 --> 00:24:20,859 muy muy genérico. Luego, dependiendo de cómo lo 337 00:24:20,859 --> 00:24:28,660 implementas tú tendrá una función u otra porque él te dice tú tienes que añadir y tienes que poder 338 00:24:28,660 --> 00:24:35,680 quitar pero no te está diciendo cómo hacerlo si tú decides por ejemplo que añade siempre delante 339 00:24:35,680 --> 00:24:49,769 y quita siempre del fondo estás haciendo una cola pero si en vez de estar hablando y haciendo lo 340 00:24:49,769 --> 00:24:58,740 que no sé que escucharéis entonces si yo lo que hago es que la collection me dice tiene la de 341 00:24:58,740 --> 00:25:02,880 tiene la remove, y yo digo que cuando hace la add la añade siempre al principio de 342 00:25:02,880 --> 00:25:06,880 mi estructura y que cuando hago la remove quita siempre la última de la 343 00:25:06,880 --> 00:25:11,460 estructura, lo que estoy haciendo es una cola, porque el primero que inserto al 344 00:25:11,460 --> 00:25:15,839 principio y removo al final, entonces el del final será siempre el más viejo, si? 345 00:25:15,839 --> 00:25:22,980 es una cola al revés, en cierto sentido, si? que se puede hacer si se inserta delante y 346 00:25:22,980 --> 00:25:27,339 se quita al final en vez de insertar al final y sacar delante, siempre una cola 347 00:25:27,339 --> 00:25:38,210 en esta interfaz encontramos una serie de métodos 348 00:25:38,210 --> 00:25:39,609 que nos servirán para hacerlo 349 00:25:39,609 --> 00:25:45,029 esta es la estructura general de todo lo que vamos a ver 350 00:25:45,029 --> 00:25:46,609 a partir de ahora 351 00:25:46,609 --> 00:25:49,410 aquí está collection 352 00:25:49,410 --> 00:25:51,950 en realidad collection 353 00:25:51,950 --> 00:25:54,849 extiende o hereda 354 00:25:54,849 --> 00:25:57,250 da iterable 355 00:25:57,250 --> 00:26:02,109 ¿Sí? Entonces, lo que empieza toda esta estructura es iterable 356 00:26:02,109 --> 00:26:12,650 Iterable es un concepto de algo, un conjunto de cosas sobre el que yo puedo ir a iterar 357 00:26:12,650 --> 00:26:15,369 O sea, que yo puedo ir a mirar de uno en uno 358 00:26:15,369 --> 00:26:22,390 ¿Sí? Y a partir de este concepto de no sé qué es, pero sé que puedo ir a mirarlo de uno en uno 359 00:26:22,390 --> 00:26:26,470 Me hago una colección. ¿Qué es una colección? Pues un conjunto de datos 360 00:26:26,470 --> 00:26:28,569 No un conjunto, un grupo de datos 361 00:26:28,569 --> 00:26:30,369 ¿Vale? Un grupo de objetos 362 00:26:30,369 --> 00:26:32,410 Sobre el que yo podré hacer 363 00:26:32,410 --> 00:26:34,509 Una iteración 364 00:26:34,509 --> 00:26:36,089 O sea, que tengo 10 objetos 365 00:26:36,089 --> 00:26:38,289 Puedo pillar el primero, luego el segundo, luego el tercero 366 00:26:38,289 --> 00:26:40,269 Luego el cuarto, hasta que los he mirado todos 367 00:26:40,269 --> 00:26:42,730 ¿Por qué? Porque cualquier collection 368 00:26:42,730 --> 00:26:43,809 Es iterable 369 00:26:43,809 --> 00:26:46,170 ¿Se entiende? 370 00:26:47,049 --> 00:26:49,829 Esto es una ventaja porque me da la posibilidad 371 00:26:49,829 --> 00:26:51,630 De sustancialmente cualquier 372 00:26:51,630 --> 00:26:53,650 Colección, tener un 373 00:26:53,650 --> 00:26:55,250 Mecanismo para poder decir 374 00:26:55,250 --> 00:26:57,109 Dame todos sus objetos 375 00:26:57,109 --> 00:26:59,130 uno por uno, ahora 376 00:26:59,130 --> 00:27:01,309 si será una cola me los dará ordenado 377 00:27:01,309 --> 00:27:03,130 del primero al último, si es una pila me dará 378 00:27:03,130 --> 00:27:04,809 last in, last out 379 00:27:04,809 --> 00:27:07,329 last in, first out, si es 380 00:27:07,329 --> 00:27:09,349 un árbol me lo dará de otra forma 381 00:27:09,349 --> 00:27:11,390 como 382 00:27:11,390 --> 00:27:13,269 se hace no me interesa 383 00:27:13,269 --> 00:27:14,950 depende de la implementación 384 00:27:14,950 --> 00:27:16,609 yo sé que se puede hacer 385 00:27:16,609 --> 00:27:19,250 yo sé que hay un mecanismo para poder ir a 386 00:27:19,250 --> 00:27:21,309 mirar uno por uno todos los 387 00:27:21,309 --> 00:27:21,809 elementos 388 00:27:21,809 --> 00:27:23,630 ¿se entiende? 389 00:27:25,109 --> 00:27:26,650 a partir de collection 390 00:27:26,650 --> 00:27:34,250 se crean tres interfaces, que son list, queue y set. 391 00:27:35,869 --> 00:27:40,670 Lista es una lista, queue es una cola, set es un conjunto. 392 00:27:42,130 --> 00:27:49,690 La diferencia fundamental entre list, queue y set es que aquí se pueden repetir los datos, 393 00:27:49,690 --> 00:27:56,589 o sea, yo puedo poner el mismo alumno diez veces, mientras aquí los datos son únicos. 394 00:27:56,650 --> 00:28:05,269 Si yo he añadido un alumno concreto, no puedo añadir otra vez el mismo alumno o un alumno equivalente. 395 00:28:06,809 --> 00:28:08,710 ¿Cuándo dos alumnos son equivalentes? 396 00:28:15,230 --> 00:28:17,269 ¿Cuándo dos objetos son equivalentes? 397 00:28:24,859 --> 00:28:27,339 Cuando el equals entre estos dos objetos es de true. 398 00:28:28,420 --> 00:28:35,420 Luego tú, si no has definido el equals, será el igual igual, entonces serán iguales sólo cuando son el mismo objeto. 399 00:28:35,420 --> 00:28:37,819 si en vez tú has sobre escrito el equal 400 00:28:37,819 --> 00:28:39,720 si has dicho que tengan el mismo DNI 401 00:28:39,720 --> 00:28:42,400 cuando dos objetos hasta distintos 402 00:28:42,400 --> 00:28:45,200 dos instancias distintas tengan el mismo DNI 403 00:28:45,200 --> 00:28:46,319 para ti serán lo mismo 404 00:28:46,319 --> 00:28:49,559 entonces en una lista se pondrían una y otra vez 405 00:28:49,559 --> 00:28:51,559 en un set se pondría una sola vez 406 00:28:51,559 --> 00:28:54,759 cuando tú intentaras poner otra vez 407 00:28:54,759 --> 00:28:57,319 el mismo alumno con el mismo DNI 408 00:28:57,319 --> 00:28:59,140 te diría, no está 409 00:28:59,140 --> 00:29:02,940 entonces en el set es muy importante 410 00:29:02,940 --> 00:29:04,720 la definición del equal 411 00:29:04,720 --> 00:29:07,400 lo volveremos a ver 412 00:29:07,400 --> 00:29:09,000 entonces 413 00:29:09,000 --> 00:29:11,000 la lista son las listas 414 00:29:11,000 --> 00:29:13,420 la que hemos hablado ahora, la queue son las colas 415 00:29:13,420 --> 00:29:15,619 los sets son los conjuntos, esta particularidad 416 00:29:15,619 --> 00:29:17,720 de que es un conjunto que no se puede repetir 417 00:29:17,720 --> 00:29:18,660 los elementos 418 00:29:18,660 --> 00:29:21,960 también en lista queue 419 00:29:21,960 --> 00:29:23,740 el orden tiene sentido 420 00:29:23,740 --> 00:29:24,799 en un set no 421 00:29:24,799 --> 00:29:27,480 el conjunto es 422 00:29:27,480 --> 00:29:28,720 yo pongo ahí elementos 423 00:29:28,720 --> 00:29:31,900 pero el orden con que los he metido 424 00:29:31,900 --> 00:29:34,420 no me interesa 425 00:29:34,720 --> 00:29:49,259 Él hará lo que quiere, lo reorganizará, no necesariamente se ha insertado antes esto y luego esto, cuando los voy a leer lo encuentro en esta orden. Él lo moverá como mejor le da para que sea lo más eficiente posible. 426 00:29:50,640 --> 00:29:59,000 Si quiero y me interesa que el orden sea importante y que quiera respetarlo, no uso un set, uso un list. 427 00:29:59,000 --> 00:30:06,140 dentro de list que hay 428 00:30:06,140 --> 00:30:08,019 hay ArrayList 429 00:30:08,019 --> 00:30:09,980 de que os suena ArrayList 430 00:30:09,980 --> 00:30:11,779 de que podría ser un ArrayList 431 00:30:11,779 --> 00:30:17,829 una lista cuya implementación 432 00:30:17,829 --> 00:30:18,650 está hecha con 433 00:30:18,650 --> 00:30:21,769 Arrays, o sea mi lista 434 00:30:21,769 --> 00:30:23,309 lo que hemos hecho el miércoles 435 00:30:23,309 --> 00:30:25,430 pues eso se llama ArrayList en Java 436 00:30:25,430 --> 00:30:28,990 y luego está 437 00:30:28,990 --> 00:30:31,809 LinkedList, que será LinkedList 438 00:30:31,809 --> 00:30:34,569 lo del viernes 439 00:30:34,569 --> 00:30:37,049 ¿vale? o sea que lo que nosotros 440 00:30:37,049 --> 00:30:38,730 hemos hecho, formada 441 00:30:38,730 --> 00:30:40,829 simplificada, sin optimizar nada 442 00:30:40,829 --> 00:30:42,990 y feo como poca cosa en este multiverso 443 00:30:42,990 --> 00:30:45,069 alguien se ha metido a hacerlo 444 00:30:45,069 --> 00:30:47,029 bonito, bien 445 00:30:47,029 --> 00:30:48,849 hecho, seguro 446 00:30:48,849 --> 00:30:50,069 y con 447 00:30:50,069 --> 00:30:52,490 ¿cómo se dice? 448 00:30:53,089 --> 00:30:54,650 con algo de eficiencia 449 00:30:54,650 --> 00:30:56,670 y me ha creado dos listas 450 00:30:56,670 --> 00:30:58,289 que ya existen, o sea dos 451 00:30:58,289 --> 00:31:00,750 clases que ya existen, fijaos que 452 00:31:00,750 --> 00:31:02,930 los verdes son clases, yo puedo crear objetos 453 00:31:02,930 --> 00:31:05,089 RList o crear objetos LinkedList 454 00:31:05,089 --> 00:31:06,950 y heredarán 455 00:31:06,950 --> 00:31:09,009 todo lo que puedan hacer la lista, todo lo que 456 00:31:09,009 --> 00:31:11,109 puedan hacer las colecciones y todo lo que puedan hacer 457 00:31:11,109 --> 00:31:13,170 los iterables y por lo tanto 458 00:31:13,170 --> 00:31:15,289 los podré utilizar para guardar 459 00:31:15,289 --> 00:31:17,069 allí objetos y hacer lo que me dé la gana 460 00:31:17,069 --> 00:31:18,589 ¿se entiende? 461 00:31:20,150 --> 00:31:20,349 vale 462 00:31:20,349 --> 00:31:23,190 ¿qué más cosas hay? hay vector 463 00:31:23,190 --> 00:31:25,029 ¿vale? vector es 464 00:31:25,029 --> 00:31:26,849 parecido a una lista 465 00:31:26,849 --> 00:31:29,269 ¿vale? la ventaja que tiene vector 466 00:31:29,269 --> 00:31:30,509 es que está 467 00:31:30,509 --> 00:31:32,410 sincronizado 468 00:31:32,410 --> 00:31:34,750 ¿Qué quiere decir? 469 00:31:36,569 --> 00:31:37,450 Segundo de DAM 470 00:31:37,450 --> 00:31:38,549 ¿Vale? 471 00:31:39,130 --> 00:31:41,130 Programación de servicios 472 00:31:41,130 --> 00:31:42,630 Y procesos 473 00:31:42,630 --> 00:31:45,150 Vosotros ahora estáis trabajando con un solo hilo 474 00:31:45,150 --> 00:31:46,970 De ejecución, le dais a un play 475 00:31:46,970 --> 00:31:47,930 Y se va 476 00:31:47,930 --> 00:31:49,450 Todas las 477 00:31:49,450 --> 00:31:52,190 ¿Cómo se dice? 478 00:31:52,250 --> 00:31:54,869 Los comandos de Java que habéis puesto, uno detrás de otro 479 00:31:54,869 --> 00:31:56,230 Se acabó 480 00:31:56,230 --> 00:31:58,170 En segundo de DAM 481 00:31:58,170 --> 00:32:00,390 Se aprende a programar con procesos 482 00:32:00,390 --> 00:32:01,650 Eso quiere decir que la misma 483 00:32:01,650 --> 00:32:03,890 o con threads 484 00:32:03,890 --> 00:32:04,809 ¿vale? hilos 485 00:32:04,809 --> 00:32:08,089 un mismo proceso cuando se arranca 486 00:32:08,089 --> 00:32:10,150 en vez de tener un único hilo de ejecución 487 00:32:10,150 --> 00:32:12,130 tiene varios hilos de ejecución 488 00:32:12,130 --> 00:32:13,750 que trabajan a la vez 489 00:32:13,750 --> 00:32:15,410 mientras uno está haciendo una cosa 490 00:32:15,410 --> 00:32:17,970 otro está haciendo otra cosa, para que entendáis 491 00:32:17,970 --> 00:32:19,130 el word 492 00:32:19,130 --> 00:32:22,029 cuando tú tienes el word, ¿qué puedes hacer 493 00:32:22,029 --> 00:32:25,799 con el word? escribir 494 00:32:25,799 --> 00:32:28,059 pero mientras tú escribes, ¿qué te hace el word? 495 00:32:34,630 --> 00:32:35,730 sí, por otra cosa 496 00:32:35,730 --> 00:32:38,069 pero lo que hace en particular es que si tú 497 00:32:38,069 --> 00:32:46,029 escribes sin acentos, ¿qué te hace? Te lo pones rojo. ¿Y quién lo está haciendo eso? Pues otra 498 00:32:46,029 --> 00:32:52,349 tarea, ¿vale? Otro hilo. Tú tienes dos hilos a la vez, uno que está pendiente de ti, de lo que 499 00:32:52,349 --> 00:32:57,750 escribes, y otro hilo que está pendiente de cuando tú has escrito una palabra, ir a buscar en un 500 00:32:57,750 --> 00:33:02,529 diccionario si esta palabra está escrita bien y si está escrita mal, marcarla de rojo. Estas dos 501 00:33:02,529 --> 00:33:08,650 cosas se hacen a la vez. Son dos tareas que se hacen a la vez. ¿Vale? Para hacer un ejemplo 502 00:33:08,650 --> 00:33:17,230 de multitarea. Pues cuando hay multitarea, hay un problema serio en el escribir en la 503 00:33:17,230 --> 00:33:21,769 misma variable. Porque si yo me meto a escribir en esta variable y mientras estoy escribiendo 504 00:33:21,769 --> 00:33:26,130 en esta variable viene otro y empieza a escribir en la misma variable, llega un momento en 505 00:33:26,130 --> 00:33:30,410 que este trozo de memoria tiene una parte escrita por mí y una parte escrita por el 506 00:33:30,410 --> 00:33:35,730 otro. Entonces, lo que está escrito no es ni mi dato ni el dato del otro. Es una mezcla 507 00:33:35,730 --> 00:33:41,430 de los dos. Y si a alguien se le ocurre en ese momento ir a leer, tiene lo que se llama 508 00:33:41,430 --> 00:33:49,470 una race condition, una condición de carrera o una inconsistencia de memoria. Y por lo 509 00:33:49,470 --> 00:33:58,289 tanto, no funciona. Pues vector tiene sistemas internos para poder evitar esto. Si alguien 510 00:33:58,289 --> 00:34:00,349 toca un vector, otro 511 00:34:00,349 --> 00:34:01,769 thread no lo puede tocar. 512 00:34:03,670 --> 00:34:03,809 ¿Sí? 513 00:34:05,170 --> 00:34:06,470 A nosotros no nos 514 00:34:06,470 --> 00:34:08,610 interesa para nada. En un futuro 515 00:34:08,610 --> 00:34:10,469 podría interesarnos. ¿Cuál es 516 00:34:10,469 --> 00:34:12,449 la desventaja del 517 00:34:12,449 --> 00:34:14,130 vector? Es que es más lento. 518 00:34:15,130 --> 00:34:16,550 Para hacer esta comprobación 519 00:34:16,550 --> 00:34:18,230 de, oye, mira, alguien me está 520 00:34:18,230 --> 00:34:20,289 utilizando, porque si alguien me está utilizando, nadie 521 00:34:20,289 --> 00:34:22,329 más me puede utilizar, pues esa 522 00:34:22,329 --> 00:34:24,070 comprobación lo ralentiza. 523 00:34:24,429 --> 00:34:26,369 Entonces una relista es más rápido 524 00:34:26,369 --> 00:34:28,409 con vector, pero en términos 525 00:34:28,409 --> 00:34:30,389 de utilizo, una relista con vector 526 00:34:30,389 --> 00:34:31,730 serían muy muy parecidos 527 00:34:31,730 --> 00:34:33,190 cambian poco o nada 528 00:34:33,190 --> 00:34:35,929 hasta el menos segundo de dam 529 00:34:35,929 --> 00:34:38,730 ahora, de vector 530 00:34:38,730 --> 00:34:40,650 puedo heredar 531 00:34:40,650 --> 00:34:42,670 una clase, que es la clase 532 00:34:42,670 --> 00:34:44,670 stack, que en inglés 533 00:34:44,670 --> 00:34:48,780 quiere decir, no, eso es 534 00:34:48,780 --> 00:34:52,079 heap, stack 535 00:34:52,079 --> 00:34:55,940 es pila, tu stack es 536 00:34:55,940 --> 00:34:56,400 pila 537 00:34:56,400 --> 00:35:00,199 esta es la implementación de la pila 538 00:35:00,199 --> 00:35:01,599 esta pila 539 00:35:01,599 --> 00:35:14,360 esta pila pila duda vale luego está la interfaz que no es una lista es una interfaz aparte se 540 00:35:14,360 --> 00:35:19,000 parece vale pero es un poquito distinta porque la lista yo puedo hacer como lo que me da la gana la 541 00:35:19,000 --> 00:35:29,380 que en vez es una una cola vale de este es una lista este es una cola vale o sea la lista no 542 00:35:29,380 --> 00:35:33,340 necesariamente puede insertar en el medio puede hacer un poquito de más de 543 00:35:33,340 --> 00:35:38,019 caos la cola no la cola inserto por un lado y pillo por el otro vale entonces 544 00:35:38,019 --> 00:35:45,099 cuando hago la que la implementación que tengo de que es priority que priority que 545 00:35:45,099 --> 00:35:49,539 es una cola de prioridad es lo que decíamos antes yo tengo que definir 546 00:35:49,539 --> 00:35:55,659 dentro de los objetos una cierta prioridad la definiré probablemente con 547 00:35:55,659 --> 00:36:00,699 un comparable vale y una vez que yo sé cuál es la prioridad como se calcula la 548 00:36:00,699 --> 00:36:04,340 prioridad de un objeto cuando lo inserto dentro de una prioridad y que se 549 00:36:04,340 --> 00:36:11,559 insertará allá donde tiene que estar como como como prioridad entonces donde 550 00:36:11,559 --> 00:36:17,920 sale la cola que lo que tienen mayor prioridad serán los primeros que salen 551 00:36:17,920 --> 00:36:21,340 vale no es un exactamente un puesto en fest out 552 00:36:21,340 --> 00:36:23,420 Pero es un first-in, first-out con prioridad. 553 00:36:24,719 --> 00:36:28,980 Y luego está una versión de la Q que es la DEC. 554 00:36:29,760 --> 00:36:32,260 Esta está Double Ended Q. 555 00:36:33,239 --> 00:36:38,980 La coda con doble extremidades, finales, qué sé yo. 556 00:36:39,619 --> 00:36:42,559 Que, sustancialmente, en esta de aquí, que está la ArrayDec, 557 00:36:42,559 --> 00:36:45,579 que fijaos que hace una mezcla rara así, 558 00:36:46,119 --> 00:36:48,599 pues esta de aquí, de la ArrayDec, permite, 559 00:36:48,599 --> 00:36:51,460 es una cola en el que se puede insertar 560 00:36:51,460 --> 00:36:53,559 o quitar desde los dos extremos 561 00:36:53,559 --> 00:36:57,539 entonces la puedo ver como por aquí 562 00:36:57,539 --> 00:36:58,820 o por aquí, a la vez 563 00:36:58,820 --> 00:37:01,679 ¿para qué sirve? eso ya no lo sé, pero existe 564 00:37:01,679 --> 00:37:05,320 lado set 565 00:37:05,320 --> 00:37:07,400 hemos dicho que un set tiene la característica 566 00:37:07,400 --> 00:37:08,980 de que no se pueden repetir los elementos 567 00:37:08,980 --> 00:37:11,320 allí dentro y el orden 568 00:37:11,320 --> 00:37:13,280 se pierde aquí, el orden no 569 00:37:13,280 --> 00:37:15,659 tiene mucho sentido, el orden de inserción 570 00:37:15,659 --> 00:37:16,019 esto es 571 00:37:16,019 --> 00:37:24,880 Y aquí hay dos posibles implementaciones que son LashSet y LinkedLashSet. 572 00:37:25,320 --> 00:37:35,420 El LashSet es una de las estructuras dinámicas más rápidas que haya. 573 00:37:35,420 --> 00:37:40,780 es una de las implementaciones más veloz 574 00:37:40,780 --> 00:37:43,179 a la hora de insertar y quitar 575 00:37:43,179 --> 00:37:47,099 y encontrar objetos dentro de la colección 576 00:37:47,099 --> 00:37:51,360 entonces siempre que podamos 577 00:37:51,360 --> 00:37:56,159 y que esto sea, pues H7 sería una buena solución 578 00:37:56,159 --> 00:37:58,820 ahora luego hablaremos de ese 579 00:37:58,820 --> 00:38:00,699 la link de H7 es parecida a esta 580 00:38:00,699 --> 00:38:02,300 solo que por dentro utiliza 581 00:38:02,300 --> 00:38:06,539 un sistema enlazado parecido a la linked list 582 00:38:06,539 --> 00:38:09,760 y finalmente está el sorted set 583 00:38:09,760 --> 00:38:14,400 que es como un set pero en el que cuando insertas las cosas 584 00:38:14,400 --> 00:38:18,039 no van al azar sino que van ordenadas y tienes el 585 00:38:18,039 --> 00:38:22,179 triset que es un poco parecido a lo que decíamos antes 586 00:38:22,179 --> 00:38:25,980 o sea que es un árbol que pero cuando inserto las cosas los ordeno 587 00:38:25,980 --> 00:38:30,119 poniéndolo en el subárbol derecho o izquierdo dependiendo de si es 588 00:38:30,119 --> 00:38:35,039 mayor o menor en base a la comparación del objeto que estoy insertando con el 589 00:38:35,039 --> 00:38:43,429 objeto nodo esto es presentación general vale luego ahora haremos ejemplitos y 590 00:38:43,429 --> 00:38:47,570 problemas y cosas por el estilo para ver cómo se usan aquí vale entonces la 591 00:38:47,570 --> 00:38:51,050 interfaz collection las operaciones más importante puede añadir puede decir el 592 00:38:51,050 --> 00:38:56,630 tamaño puedo iterar sobre esta colección o sea ir a mirar de uno en uno puedo 593 00:38:56,630 --> 00:38:58,730 saber si un objeto 594 00:38:58,730 --> 00:39:00,670 existe y puedo quitar un 595 00:39:00,670 --> 00:39:02,730 objeto. ¿Vale? Esto es lo que me permite 596 00:39:02,730 --> 00:39:04,869 Collection, que grosso modo 597 00:39:04,869 --> 00:39:06,570 si lo pensáis, es la lista que hemos 598 00:39:06,570 --> 00:39:08,750 hecho nosotros. La interfaz que hicimos nosotros 599 00:39:08,750 --> 00:39:09,250 era esta. 600 00:39:10,590 --> 00:39:14,769 ¿Sí? Interfaz que desciende de Collection 601 00:39:14,769 --> 00:39:16,909 está Set, que serían los conjuntos. 602 00:39:16,949 --> 00:39:18,710 Los conjuntos son grupos de elementos en 603 00:39:18,710 --> 00:39:20,469 los que no se admiten elementos 604 00:39:20,469 --> 00:39:22,670 repetidos. ¿Vale? Para saber si 605 00:39:22,670 --> 00:39:24,329 un elemento es repetido, se usa 606 00:39:24,329 --> 00:39:25,969 Equals y HashCode. 607 00:39:26,670 --> 00:39:28,630 ¿Vale? Estos dos señores 608 00:39:28,630 --> 00:39:34,170 me permiten saber si dos son iguales o si dos caen en el mismo hash. 609 00:39:34,329 --> 00:39:35,150 ¿Qué es un hash? 610 00:39:36,210 --> 00:39:36,809 Paint. 611 00:39:38,670 --> 00:39:38,889 ¿Vale? 612 00:39:38,889 --> 00:39:49,099 El hash es una función que me pilla un número infinito de x 613 00:39:49,099 --> 00:39:58,099 y me lo mapea en un número finito de valores y. 614 00:40:00,940 --> 00:40:02,960 Es una categorización. 615 00:40:04,199 --> 00:40:04,280 ¿Vale? 616 00:40:04,280 --> 00:40:16,260 Por ejemplo, yo podría decir, hacer una función que me pilla un número y me dice si es par o impar. 617 00:40:16,820 --> 00:40:23,940 Esta es una función ash, porque pilla un cualquier número, entonces tengo infinitos números, 618 00:40:25,019 --> 00:40:30,699 y me lo maspea en dos categorías, o es par o es impar. 619 00:40:30,699 --> 00:40:36,039 Si esto lo llamo 0 y esto lo llamo 1 620 00:40:36,039 --> 00:40:37,300 Por ejemplo 621 00:40:37,300 --> 00:40:39,960 Pues yo tengo una función que me da 622 00:40:39,960 --> 00:40:42,199 Cualquier número, infinitos números 623 00:40:42,199 --> 00:40:44,119 Me lo mapea o en la categoría 0 624 00:40:44,119 --> 00:40:45,440 O en la categoría 1 625 00:40:45,440 --> 00:40:48,480 ¿Se entiende? 626 00:40:49,880 --> 00:40:51,440 Podría hacer otra función 627 00:40:51,440 --> 00:40:54,840 Que pilla esto 628 00:40:54,840 --> 00:40:58,360 Y me lo pone en 8 posibles categorías 629 00:40:58,360 --> 00:41:03,250 Entonces yo te doy el 37 630 00:41:03,250 --> 00:41:04,889 El hace magia 631 00:41:04,889 --> 00:41:07,130 Y me saca que es la categoría 3 632 00:41:07,130 --> 00:41:09,349 Vale, perfecto, el 37 va aquí 633 00:41:09,349 --> 00:41:10,949 El 37 va en esta categoría 634 00:41:10,949 --> 00:41:12,750 Ahora te doy el 42 635 00:41:12,750 --> 00:41:15,829 Hace magia, el 42 va aquí 636 00:41:15,829 --> 00:41:18,849 Ahora te doy el 96 637 00:41:18,849 --> 00:41:21,349 Y resulta que el 96 después de haber hecho magia 638 00:41:21,349 --> 00:41:22,889 Pues va aquí también 639 00:41:22,889 --> 00:41:24,389 Porque claro 640 00:41:24,389 --> 00:41:27,050 Puede haber distintos números 641 00:41:27,050 --> 00:41:28,989 Que caigan en la misma categoría 642 00:41:28,989 --> 00:41:30,750 Porque el número de categoría es infinito 643 00:41:30,750 --> 00:41:32,289 El número es infinito 644 00:41:32,289 --> 00:41:34,250 Entonces esto pasará seguramente 645 00:41:34,250 --> 00:41:36,349 ¿Se entiende? 646 00:41:37,130 --> 00:41:39,829 se entiende que es una función hash 647 00:41:39,829 --> 00:41:44,019 entonces, ¿para qué me sirve? 648 00:41:46,699 --> 00:41:48,219 así, a grandes rasgos 649 00:41:48,219 --> 00:41:49,460 tampoco me quiero meter 650 00:41:49,460 --> 00:41:52,159 porque aquí tengo un número 651 00:41:52,159 --> 00:41:53,679 infinito de posibles objetos 652 00:41:53,679 --> 00:41:57,880 y yo quiero 653 00:41:57,880 --> 00:41:59,920 crearme una estructura en la que 654 00:41:59,920 --> 00:42:02,000 tenga, por ejemplo, son pocas 655 00:42:02,000 --> 00:42:04,079 pero, cuatro posibles categorías 656 00:42:04,079 --> 00:42:05,840 y luego a partir de aquí 657 00:42:05,840 --> 00:42:07,119 hago una cola 658 00:42:07,119 --> 00:42:09,599 de estas cuatro categorías 659 00:42:09,599 --> 00:42:10,920 ¿sí? 660 00:42:10,920 --> 00:42:16,559 Entonces, cuando tú pillas el primer número, el primer número cae en esta categoría, lo pongo aquí, A. 661 00:42:17,559 --> 00:42:22,780 Tú pillas el segundo número, el segundo número cae en esta categoría aquí, lo pongo aquí, B. 662 00:42:24,980 --> 00:42:29,119 El tercer número cae también aquí, pues lo pongo aquí, C. 663 00:42:30,360 --> 00:42:32,599 El cuarto cae aquí, D. 664 00:42:33,300 --> 00:42:34,880 El quinto aquí, E. 665 00:42:35,179 --> 00:42:36,840 El sexto aquí, F. 666 00:42:37,219 --> 00:42:39,340 El sexto aquí, F, G. 667 00:42:39,340 --> 00:42:42,119 Veis que yo, ¿cuántos números he insertado? 668 00:42:42,199 --> 00:42:42,920 ¿Cuántos he insertado? 669 00:42:42,980 --> 00:42:44,699 Dos, cuatro, seis, siete cosas 670 00:42:44,699 --> 00:42:46,679 Si ahora los voy a buscar 671 00:42:46,679 --> 00:42:51,099 ¿Cuántas operaciones máximo tardo? 672 00:42:56,650 --> 00:42:57,610 Si ahora busco F 673 00:42:57,610 --> 00:42:59,550 ¿Cuántas operaciones tardo? 674 00:43:05,099 --> 00:43:05,460 Dos 675 00:43:05,460 --> 00:43:08,699 Porque yo diría F cae en esta categoría 676 00:43:08,699 --> 00:43:11,559 Y ya puedo excluir todas las otras categorías 677 00:43:11,559 --> 00:43:14,880 Y entonces entraría aquí y lo compro 678 00:43:14,880 --> 00:43:15,780 ¿Es esto o no? 679 00:43:15,880 --> 00:43:16,539 ¿Es esto sí? 680 00:43:19,179 --> 00:43:20,719 He insertado siete objetos 681 00:43:20,719 --> 00:43:33,130 en una lista normal. Tendría a, b, c, d, f, g, y para encontrar f debería comprobar 682 00:43:33,130 --> 00:43:38,809 es esto, no es esto, no es esto, no es esto, no es esto, no es esto, sí. Sin embargo, 683 00:43:38,949 --> 00:43:48,110 ahora en dos pasos lo he hecho. Si la función h está bien hecha, mejora un mogollón este 684 00:43:48,110 --> 00:43:55,889 tipo de problemas? Si la función h está hecha mal, pues entonces no. ¿Cuándo una 685 00:43:55,889 --> 00:44:11,210 función h está mal hecha? No. Cuando todas, todos los números o la mayoría de los números 686 00:44:11,210 --> 00:44:19,369 caen en una misma categoría. Función h, si el número es cero va en la categoría 687 00:44:19,369 --> 00:44:26,429 uno, si hay otro número, va en la categoría dos. Es una función hash. Sí, está categorizando 688 00:44:26,429 --> 00:44:31,769 números infinitos en dos categorías solas. Solo que todos los números van en la categoría 689 00:44:31,769 --> 00:44:39,409 dos, excepto el cero que va en la categoría uno. Es pésima como función hash. ¿Sí? 690 00:44:39,829 --> 00:44:54,000 Otro ejemplo de función hash. Pongamos que yo tengo un strings, ¿vale? Tengo un conjunto 691 00:44:54,000 --> 00:44:55,860 de strings que me dan palabras 692 00:44:55,860 --> 00:44:57,539 y cosas por el estilo, y yo quiero estas palabras 693 00:44:57,539 --> 00:44:59,960 guardarlas y luego en un futuro 694 00:44:59,960 --> 00:45:02,159 ir a buscarlas 695 00:45:02,159 --> 00:45:04,119 y las quiero buscar de una forma eficiente 696 00:45:04,119 --> 00:45:05,699 lo que podría hacer por ejemplo es 697 00:45:05,699 --> 00:45:09,360 crearme, no sé cuántas son 698 00:45:09,360 --> 00:45:11,340 21, 21 categorías 699 00:45:11,880 --> 00:45:15,300 ¿cuántas letras tenéis en vuestro 700 00:45:15,300 --> 00:45:15,880 alfabeto? 701 00:45:17,380 --> 00:45:20,539 ¿eh? 27 702 00:45:20,539 --> 00:45:21,659 23 703 00:45:21,659 --> 00:45:23,940 que italiano es 21 704 00:45:23,940 --> 00:45:25,940 25 705 00:45:25,940 --> 00:45:34,840 Bueno, me creo una categoría por cada letra, más una categoría comodín para todos los demás, por si algo no es una letra. 706 00:45:35,179 --> 00:45:41,900 Y ahora, cuando pillo una string, miro la primera letra de esta string y la pongo en su categoría en base a la primera letra. 707 00:45:42,559 --> 00:45:47,179 Si empieza por A, la pongo en esta. Si empieza por B, la pongo en esta. Si empieza por C, la pongo en esta. 708 00:45:47,400 --> 00:45:50,360 Y si no empieza por ninguna letra del alfabeto, la pongo en la última. 709 00:45:54,559 --> 00:45:59,599 Entonces, si me llegan muchas palabras, las voy separando en estas categorías aquí. 710 00:45:59,599 --> 00:46:05,480 Y luego, cuando voy a buscar, solo tendré que buscar entre las palabras que empiezan con la misma letra. 711 00:46:05,760 --> 00:46:07,960 Todas las otras las puedo descartar. 712 00:46:09,300 --> 00:46:09,780 ¿Se entiende? 713 00:46:11,860 --> 00:46:15,440 ¿Entiende la idea que está la base del hash, del función hash? 714 00:46:15,920 --> 00:46:21,760 Ahora, hacer una función hash hecha bien es complejo. 715 00:46:22,860 --> 00:46:24,360 Es tarea de matemáticos. 716 00:46:25,039 --> 00:46:26,500 ¿Cuántos matemáticos hay aquí? 717 00:46:28,400 --> 00:46:30,000 Bueno, a lo mejor alguien hay. 718 00:46:32,670 --> 00:46:36,889 Pero como nosotros no sabemos hacerla, nosotros la hacemos con botón derecho, créame el hash. 719 00:46:40,389 --> 00:46:46,510 Yo tengo que saber cuándo la tengo que hacer, pero cuando la tengo que hacer, que me la haga él. 720 00:46:47,849 --> 00:46:48,250 ¿Se entiende? 721 00:46:49,570 --> 00:46:56,090 Entonces, en un conjunto, cuando voy a comparar, como no puedo repetir los elementos, 722 00:46:56,090 --> 00:47:18,690 vale, el equals y el hashcode me sirven para comprobar si son iguales, vale, tened en cuenta que dos elementos iguales tienen que tener el mismo hashcode, pero puede ser que elementos distintos tengan el mismo hashcode, si, 723 00:47:18,690 --> 00:47:21,289 los números pares 724 00:47:21,289 --> 00:47:23,030 el 4 y el 8 725 00:47:23,030 --> 00:47:24,849 tienen el mismo hashcode 726 00:47:24,849 --> 00:47:27,269 pero no son iguales 727 00:47:27,269 --> 00:47:28,829 pero normalmente está 728 00:47:28,829 --> 00:47:30,769 esto set o las set 729 00:47:30,769 --> 00:47:32,869 lo que hace es comprobar antes 730 00:47:32,869 --> 00:47:35,210 el hashcode que es más fácil normalmente 731 00:47:35,210 --> 00:47:36,929 si el hashcode es 732 00:47:36,929 --> 00:47:39,269 correcto, es el mismo 733 00:47:39,269 --> 00:47:40,869 va a comprobar que efectivamente 734 00:47:40,869 --> 00:47:43,050 sean iguales, si el hashcode ya es 735 00:47:43,050 --> 00:47:44,710 distinto pues ya fuera 736 00:47:44,710 --> 00:47:46,909 esto implica que cuando yo como 737 00:47:46,909 --> 00:47:48,889 programador implemento equals 738 00:47:48,889 --> 00:47:51,090 y hashcode, tengo que hacer que respeten 739 00:47:51,090 --> 00:47:52,849 estas cosas, o sea que 740 00:47:52,849 --> 00:47:54,650 dos que tengan el mismo equals 741 00:47:54,650 --> 00:47:56,050 tienen que tener el mismo hashcode 742 00:47:56,050 --> 00:48:00,500 por eso se lo hago hacer 743 00:48:00,500 --> 00:48:01,300 al eclipse 744 00:48:01,300 --> 00:48:04,519 las listas, este tipo de 745 00:48:04,519 --> 00:48:06,460 colecciones se refiere a las listas 746 00:48:06,460 --> 00:48:08,519 en las que los elementos de la conexión tienen un 747 00:48:08,519 --> 00:48:10,539 orden, existe una 748 00:48:10,539 --> 00:48:12,320 secuencia de elementos, en ella 749 00:48:12,320 --> 00:48:14,639 cada elemento estará en una determinada posición 750 00:48:14,639 --> 00:48:15,780 índice de la lista 751 00:48:15,780 --> 00:48:19,699 Entonces en las listas tienen un orden 752 00:48:19,699 --> 00:48:21,639 Este es el primero, el segundo, el tercer elemento 753 00:48:21,639 --> 00:48:22,960 Cuarto elemento, y yo le puedo decir 754 00:48:22,960 --> 00:48:24,300 Píllame el séptimo elemento 755 00:48:24,300 --> 00:48:27,539 Sea como array o sea como 756 00:48:27,539 --> 00:48:28,480 Lista enlazada 757 00:48:28,480 --> 00:48:31,280 Y la Q, la cola 758 00:48:31,280 --> 00:48:33,619 Este tipo de colección 759 00:48:33,619 --> 00:48:35,420 Esta diferencia es una lista de elementos 760 00:48:35,420 --> 00:48:37,019 Que sigue el patrón 761 00:48:37,019 --> 00:48:39,260 First in, first out, o sea, parecida a una lista 762 00:48:39,260 --> 00:48:40,480 Pero que yo 763 00:48:40,480 --> 00:48:43,800 No puedo pillar lo que me da la gana e insertar donde me da la gana 764 00:48:43,800 --> 00:48:45,119 ¿Vale? Tengo que seguir 765 00:48:45,119 --> 00:48:46,239 el FIFO 766 00:48:46,239 --> 00:48:49,260 la interfaz list 767 00:48:49,260 --> 00:48:51,420 os recuerdo que hereda 768 00:48:51,420 --> 00:48:53,480 de collection, entonces hace todo lo que tiene 769 00:48:53,480 --> 00:48:55,440 que hacer collection, pero añade algunas 770 00:48:55,440 --> 00:48:57,679 cosillas, permite 771 00:48:57,679 --> 00:48:59,500 elementos duplicados 772 00:48:59,500 --> 00:49:01,559 y aparte de lo que hereda 773 00:49:01,559 --> 00:49:03,400 de collection, puede manipular el elemento 774 00:49:03,400 --> 00:49:05,440 en función de su posición de la lista, le puedo 775 00:49:05,440 --> 00:49:07,480 decir, píllame el tercer elemento 776 00:49:07,480 --> 00:49:09,760 o ponme esto en el cuarto sitio 777 00:49:09,760 --> 00:49:10,440 ¿vale? 778 00:49:11,639 --> 00:49:13,360 búsqueda de elemento, puede buscar 779 00:49:13,360 --> 00:49:15,320 un elemento concreto en la lista y devuelve 780 00:49:15,320 --> 00:49:15,880 su posición 781 00:49:15,880 --> 00:49:19,039 búscame este señor 782 00:49:19,039 --> 00:49:21,039 y si lo encuentras te dice 783 00:49:21,039 --> 00:49:23,300 está en posición 7, y ahora tú puedes ir 784 00:49:23,300 --> 00:49:24,960 a la posición 7 y pillarlo si quieres 785 00:49:24,960 --> 00:49:27,440 o remover la posición 7 786 00:49:27,440 --> 00:49:29,820 o hacer lo que quieras con la posición 7 787 00:49:29,820 --> 00:49:31,300 iterar sobre el elemento 788 00:49:31,300 --> 00:49:33,159 la lista 789 00:49:33,159 --> 00:49:35,119 permite mejorar un poco el iterador 790 00:49:35,119 --> 00:49:37,199 de collection, o sea, collection 791 00:49:37,199 --> 00:49:39,099 tiene un iterador genérico 792 00:49:39,099 --> 00:49:41,320 este de aquí permite hacer el iterador 793 00:49:41,320 --> 00:49:42,420 propio de lista 794 00:49:42,420 --> 00:49:44,800 el rango de operaciones 795 00:49:44,800 --> 00:49:46,519 vale, permite hacer ciertas operaciones 796 00:49:46,519 --> 00:49:48,940 sobre bloques 797 00:49:48,940 --> 00:49:50,900 en plan, en vez de añádeme esto 798 00:49:50,900 --> 00:49:52,539 y ahora añádeme esto, ahora añádeme esto 799 00:49:52,539 --> 00:49:55,079 te puede decir, añádeme toda esta colección 800 00:49:55,079 --> 00:49:56,760 te paso una colección y me la 801 00:49:56,760 --> 00:49:57,579 añades a mi lista 802 00:49:57,579 --> 00:49:59,199 pero bueno 803 00:49:59,199 --> 00:50:05,139 aquí hay ArrayList, LinkedList 804 00:50:05,139 --> 00:50:06,820 y una comparativa entre ArrayList 805 00:50:06,820 --> 00:50:08,579 y LinkedList, lo dejamos 806 00:50:08,579 --> 00:50:10,639 por ahora aquí, al nivel de 807 00:50:10,639 --> 00:50:12,619 teoría, porque si no es 808 00:50:12,619 --> 00:50:14,539 mucho, lo que vamos a hacer 809 00:50:14,539 --> 00:50:16,480 es un ejemplo usando estas 810 00:50:16,480 --> 00:50:18,360 cosas de aquí y mañana 811 00:50:18,360 --> 00:50:20,519 lo retomamos y vemos la 812 00:50:20,519 --> 00:50:22,820 diferencia y cosas por el estilo y seguimos un poquito 813 00:50:22,820 --> 00:50:23,639 ¿vale?