20250128 Colecciones_2 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Yo, siéntate
00:00:00
Y tú también
00:00:06
Venga, sí, como todo el mundo
00:00:07
A ver
00:00:09
Cristian
00:00:12
Calla
00:00:13
Porque eres el que estás hablando
00:00:14
Y tú estás paseando
00:00:17
A los de los izquierdos
00:00:19
Ana
00:00:21
Bueno, pues entonces
00:00:22
Lo
00:00:26
Lo que hemos hecho
00:00:27
Está claro, ¿no?
00:00:30
hemos hecho una clase
00:00:31
claro
00:00:33
pero ya, pero la idea
00:00:35
es hacer una clase que lo enmascare
00:00:37
ya no me refiero tanto al código de los métodos
00:00:40
sino la filosofía es
00:00:44
hacer una clase que enmascara
00:00:45
eso en unos métodos
00:00:48
y entonces, para nosotros ahora
00:00:49
esas cajitas en las que meter datos
00:00:51
ya no van a ser arrays
00:00:53
esas cajitas van a ser objetos
00:00:55
de esas clases
00:00:57
Y cada objeto será una caja para meter datos y a través de los métodos que ese objeto me ofrece, yo ya meto, saco, lo que sea.
00:00:58
E internamente, esa referencia, ese objeto internamente ya tendrá unas propiedades para tener ahí todos los objetos dentro que hagan falta.
00:01:07
Pero están todos bajo una única referencia, la del objeto.
00:01:15
Y a través de los métodos, pues yo ya decido si añado, borro, lo que sea.
00:01:19
Esa es la idea de las colecciones.
00:01:23
enmascarar
00:01:25
todo un volumen de datos
00:01:26
enmascararlo en una única referencia
00:01:29
yo instancio ese objeto y a través de los métodos
00:01:31
accedo a esos datos
00:01:34
para insertar, borrar, etc.
00:01:35
¿Vale?
00:01:37
Pablo, para una vez que vienes, cállate
00:01:39
No, digo yo
00:01:41
Hablar, pues sí
00:01:42
Bueno
00:01:45
Vale
00:01:47
Entonces
00:01:49
Esta lista que hemos hecho
00:01:50
cumple todo lo
00:01:52
todos los requisitos de una lista
00:01:54
que es, yo puedo meter
00:01:56
aparentemente es dinámico
00:01:58
yo hago add y remove
00:02:01
y me da la sensación de que se estira
00:02:03
y se encoge y es dinámico aparentemente
00:02:04
¿vale? y además
00:02:07
existe una posición, la del array
00:02:08
está claro, y de hecho mi get puede ser
00:02:11
por posición, porque cada elemento
00:02:13
tiene una posición
00:02:14
bueno, entonces vale, con esta nos valdría y uno podría tirar
00:02:15
y ya está, y ya no habría por qué inventarse
00:02:19
más colecciones en la vida, y esta colección
00:02:20
existe y en lugar de llamarse miArrayList
00:02:23
se llama ArrayList.
00:02:24
Salvo el salto de que es genérica
00:02:27
que eso lo incorporaremos. Es decir,
00:02:28
que la que hemos hecho nosotros solo vale para stream.
00:02:30
Entonces tendríamos que ser capaces
00:02:33
de hacer una que va a ir a para cualquier cosa.
00:02:34
Eso no es tan sencillo
00:02:37
pero ya veremos cómo hacerlo. Pero bueno,
00:02:39
con ese ArrayList que
00:02:41
equivale a nuestro
00:02:42
miArrayList uno ya podría, venga, tiramos para adelante.
00:02:44
Pero es que
00:02:47
fijaos en los métodos.
00:02:48
Cada vez que hemos hecho un app
00:02:51
madre de Dios, crear un array nuevo
00:02:53
copiar uno en otro
00:02:55
una jodienda, cada vez que hemos
00:02:56
borrado un elemento, hacemos un
00:02:59
array nuevo, copiamos uno en otro
00:03:01
es decir, cada app
00:03:03
es un montón de código muy costoso
00:03:05
para la máquina virtual
00:03:07
cada remove es un montón de código muy
00:03:09
costoso, cada get no
00:03:11
el get es sencillísimo, recuperas por posición
00:03:13
que es lo bueno que tienen los arrays, el get
00:03:15
facilísimo, pero cada app y cada
00:03:17
remove es algo que
00:03:19
computacionalmente cuesta mucho
00:03:21
luego con esto, bien, podríamos ya
00:03:23
tirar millas
00:03:25
pero si se nos ocurriera
00:03:27
otra manera
00:03:29
de guardar un montón de objetos a mogollón
00:03:30
de tal manera
00:03:34
bajo una única referencia
00:03:36
como esto, que estaba bajo la referencia
00:03:37
del objeto, mi Arraylis
00:03:39
a partir de él, bajo una única referencia
00:03:40
de manera que
00:03:44
insertar nuevos
00:03:45
y sacar no fuera tan costoso
00:03:47
Pues eso sería maravilloso
00:03:50
¿Vale?
00:03:51
Y ese sería el linked list
00:03:53
Eso es lo que os voy a preguntar
00:03:56
El linked list no usa RISE
00:04:01
No usa RISE
00:04:03
Sino que usa la
00:04:05
Imaginación
00:04:07
Pues que le he hecho
00:04:09
La imaginación que le he hecho a un tío
00:04:10
Hace 50 años
00:04:13
Porque el linked list es una
00:04:15
Es una implementación de un concepto informativo que ya existe
00:04:16
que viene lista enlazada
00:04:19
lo único que hay que hacer es traducirlo
00:04:21
entonces
00:04:23
¿qué idea se nos podría ocurrir?
00:04:24
¿qué idea se os ocurriría?
00:04:27
para tener un montón de datos
00:04:29
recogidos bajo una única referencia
00:04:30
y que además
00:04:34
fuera facilísimo
00:04:35
incorporar uno nuevo y eliminar
00:04:36
que era la PRA list
00:04:39
en realidad no tienes la lista
00:04:41
no tienes un array con los datos
00:04:42
tienes un array con las misiones de memoria de los datos
00:04:44
entonces cambias
00:04:46
A ver, lo que tú dices es...
00:04:48
Pero eso es un array.
00:04:53
Un array lo que tú tienes son las direcciones del dato.
00:04:56
Eso es un array, en realidad.
00:04:59
Sí, pero bueno,
00:05:03
lo que hemos hecho antes, que era en string,
00:05:04
también teníamos eso, porque era en string,
00:05:07
entonces ya teníamos eso. En cualquier caso, si es un array,
00:05:08
en cuanto haces uno nuevo,
00:05:12
es que ya necesitas
00:05:13
otro array para esa dirección extra.
00:05:14
Entonces, ni crear ni borrar uno nuevo.
00:05:17
Entonces, esto no utiliza
00:05:19
Arrays ni nada que se le parezca.
00:05:21
Di.
00:05:23
Dime, dime.
00:05:26
Bueno, con variables tienes que hacerlo así.
00:05:31
Pero esas variables, ¿dónde están? ¿En Arrays o cómo?
00:05:32
Un momento, que no oigo.
00:05:37
Pero sueltas, ¿dónde? Porque si están sueltas,
00:05:40
cada una tiene su propia
00:05:43
referencia. Luego, la ventaja
00:05:45
de las colecciones es que yo tengo una única referencia
00:05:47
que es el nombre de la caja, un nombre
00:05:49
único, nombre de la caja, y con ese
00:05:51
nombre digo, mete esto, mete lo otro.
00:05:53
Con lo que tú me dices, yo te he
00:05:56
entendido, y eres un montón de
00:05:57
nombres, uno por variable.
00:05:59
¡Qué chica!
00:06:07
O sea que los nombres de las
00:06:15
variables, compartían una raíz común
00:06:17
y a partir de...
00:06:18
Pero, en cualquier caso
00:06:21
es que tendrías ahí
00:06:23
varias variables, tú dices que la raíz común
00:06:23
fuera como si fuera el nombre de la caja
00:06:26
y tú decís, vale, pero
00:06:28
¿y cuándo?
00:06:30
Pero es que eso es implanteable de programar.
00:06:32
Entonces, cuando tú haces una variable nueva,
00:06:34
construyes su nombre,
00:06:36
es que el nombre lo tienes que poner por código,
00:06:38
no puedes construir el nombre y darse un...
00:06:40
Tú intenta programar eso y te das cuenta
00:06:42
que no puedes programar eso.
00:06:44
Que el nombre de una variable
00:06:47
Tenga la I
00:06:59
¿Qué tienes que hacer?
00:07:01
Que tenga el nombre de otra variable
00:07:13
Pero ese nombre luego no lo puedes usar
00:07:16
Para ver si es real
00:07:18
Esa idea no la puedes
00:07:20
Suplementar en Java
00:07:22
Vale
00:07:24
El tío desde hace 80 años
00:07:26
¿Creó esto con lo que ya sabemos?
00:07:28
¿O nos falta algo por saber?
00:07:30
Por supuestísimo con lo que ya sabéis
00:07:32
Estos son
00:07:34
Por supuestísimo con lo que ya sabéis
00:07:35
Vale, a ver, os doy la primera pista
00:07:38
Es como una serpiente
00:07:40
Va siguiendo
00:07:42
Sí, es como una serpiente
00:07:43
Tiene razón
00:07:46
A ver, es una forma de verlo
00:07:47
Vale, a ver
00:07:51
Primera pista
00:07:53
Primera pista
00:07:55
A ver, yo lo que creo es que
00:07:57
Él ha puesto en internet linked list
00:08:00
Y ha visto eso
00:08:02
Vale
00:08:03
A ver, primera pista
00:08:05
La traducción
00:08:09
Lista, enlazada
00:08:10
enlazada
00:08:13
suena que cada elemento está enlazado
00:08:16
con el otro
00:08:19
bueno, pues a ver
00:08:19
la idea es, que es una idea muy sencilla
00:08:24
de programación
00:08:26
la lista enlazada, que es
00:08:26
yo tengo, mis datos son estos
00:08:29
mi dato 1
00:08:32
mi dato 2
00:08:34
mis cadenas
00:08:36
los que sean
00:08:38
mis datos son estos
00:08:39
tengo que decidir dónde los guardo
00:08:41
ya hemos descartado el array
00:08:44
una opción sería la que hemos dicho
00:08:46
todos al array
00:08:48
esa es la versión
00:08:49
de ArrayList que hemos dicho
00:08:52
no, al array no va
00:08:53
¿cómo los guardo bajo una referencia común?
00:08:55
y que esa referencia le permita hacer el A
00:08:59
¿cómo los guardo?
00:09:00
vale, pues a ver
00:09:02
la referencia común
00:09:03
selecciono que sea
00:09:05
la del primero de todos
00:09:07
la dirección del primero
00:09:10
si estos son objetos, recordad que un objeto
00:09:11
en realidad, en Java
00:09:14
cuando accedemos
00:09:15
a su referencia
00:09:18
a su nombre, sabemos que es la dirección
00:09:20
bueno, pues la referencia común
00:09:21
que sea la dirección del primero
00:09:22
esa es la referencia común
00:09:25
ya la pregunta es
00:09:27
bueno, el nombre que tenga este objeto
00:09:28
si este objeto es alumno 1
00:09:33
pues alumno 1
00:09:35
esa es la referencia común, en principio, es la idea
00:09:36
Vale, y la pregunta sería ya, pero ahora con esta referencia yo puedo acceder a este sin problema, lógicamente, porque es su propia referencia, pero si quiero acceder al tercero, o quiero insertar uno nuevo, o quiero, ¿cómo hago? Vale, pues lo que se incorpora es esta idea muy sencilla, y es, cada objeto se le mete en un objeto un poquito más grande, que se le llama nodo,
00:09:38
que además del dato en sí
00:10:01
tenga la dirección
00:10:04
del siguiente
00:10:06
tenga la referencia
00:10:08
la referencia del siguiente
00:10:10
este se le mete
00:10:13
en una cajita un pelín más grande
00:10:15
que tiene dos partes
00:10:17
el dato en sí, el objeto
00:10:18
y la dirección del siguiente
00:10:21
este se le mete
00:10:24
en otra cajita
00:10:28
llamémosla nodo
00:10:29
que aparte del propio objeto,
00:10:30
tiene la dirección del siguiente.
00:10:35
¿Que este es el último en este caso?
00:10:40
Pues estará en su cajita,
00:10:42
pero esta dirección siguiente,
00:10:44
ahora en particular lo que tendrá es null.
00:10:46
Vale, pues esta es la estructura de lista enlazada.
00:10:50
Una lista enlazada es
00:10:52
un montón de objetos nodos,
00:10:53
que se llaman nodos, ¿vale?
00:10:56
Entonces, cada nodo tiene
00:10:59
el dato en sí, el dato que yo quiero
00:11:00
el alumno
00:11:03
la cadena, lo que sea el dato
00:11:05
pero además de tener este nodo, el dato en sí
00:11:07
tiene otra parte
00:11:09
y esa otra parte es la dirección
00:11:10
la referencia al siguiente
00:11:13
nodo, al siguiente nodo
00:11:15
al completo
00:11:17
no solamente a este objeto, la referencia al siguiente
00:11:18
nodo al completo
00:11:21
vale, este nodo tiene el objeto en sí
00:11:22
que me interesa, alumno, cadena, lo que sea
00:11:25
y además tiene
00:11:27
esta otra propiedad que es la referencia
00:11:29
del siguiente nodo
00:11:31
cuando borras uno se sustituye la del anterior
00:11:33
justo, exacto
00:11:35
claro, entonces
00:11:37
la estructura es esta, con lo cual la primera parte
00:11:38
que es tener un montón
00:11:41
de datos recogidos
00:11:43
bajo una referencia común
00:11:45
ya está
00:11:46
¿por qué? porque si yo quiero recuperar
00:11:48
este, por ejemplo, quiero consultar
00:11:51
el de posición 3, como antes
00:11:53
pues yo me cojo
00:11:55
mi referencia común y voy avanzando
00:11:57
me quedo con la segunda parte
00:11:59
de esta
00:12:02
y ahora de esta me quedo a su vez
00:12:04
con su segunda parte
00:12:06
y ahora de esta me quedo a su vez con su segunda parte
00:12:07
y ya estoy
00:12:10
pero no puedes añadir en una posición
00:12:11
tendrías que hacer
00:12:13
eso es lo más sencillo
00:12:15
de hacer con la lista precisamente por eso inventaron
00:12:18
para añadir
00:12:20
añadir al fondo me parece bien
00:12:21
claro pero
00:12:24
añadir en una posición intermedia
00:12:26
entonces tú ahora quieres insertar
00:12:28
aquí un dato, en la posición 3
00:12:33
vale, pues
00:12:35
hay que construir la cajita nodo
00:12:36
y le metes el dato
00:12:39
y lo único que hay que hacer es
00:12:40
dos asignaciones
00:12:42
esta asignación es una asignación
00:12:44
sencilla, que se va aquí
00:12:47
y esta asignación
00:12:49
que se va aquí
00:12:51
vale
00:12:52
entonces, insertar en una posición
00:12:55
no es como un array que tienes que hacer uno nuevo
00:12:57
copiar el viejo en el nuevo
00:13:00
sino es, nodo nuevo
00:13:01
este, muy bien, y dos asignaciones
00:13:03
esta dirección
00:13:06
pasa de apuntar aquí a apuntar aquí arriba
00:13:07
y esta de aquí
00:13:10
pasa a apuntar a este, a la que apuntaba el otro
00:13:11
luego con dos asignaciones
00:13:14
tienes el nuevo
00:13:16
nodo metido, entonces por eso si es como
00:13:17
una serpiente, porque estos nodos
00:13:20
están en memoria donde sea, y bueno, cada uno
00:13:22
va enlazando al siguiente, va enlazando y ya está
00:13:24
¿vale?
00:13:26
eliminar en un array
00:13:27
eliminar era muy costoso
00:13:29
porque eliminar era hacer otro array
00:13:30
con una posición menos, copiar todo el viejo en el nuevo
00:13:33
sobre escribir
00:13:35
aquí eliminar es sencillísimo
00:13:37
eliminar es hacer una asignación
00:13:39
que es, por ejemplo
00:13:41
queremos eliminar este
00:13:43
queremos eliminar
00:13:44
este primero, para no emborronar esta zona
00:13:47
este primero, pues se trata de
00:13:49
a esta dirección de aquí
00:13:51
la sobre escribo
00:13:53
con la del siguiente
00:13:55
con lo cual una única asignación
00:13:56
y se acabó, eliminado
00:13:59
eso que va a implicar que este pobre nodo
00:14:00
se ha quedado sin que nadie lo apunte
00:14:03
porque el único que le apuntaba
00:14:05
que era este
00:14:08
ahora está apuntando al siguiente
00:14:09
luego un objeto
00:14:11
que se ha quedado sin que nadie lo apunte
00:14:13
ha perdido toda su referencia
00:14:15
y el recolector de basura lo elimina
00:14:17
casi instantáneamente
00:14:19
en cuanto un objeto se queda sin nadie
00:14:21
que lo apunte
00:14:23
el objeto no es que desaparezca
00:14:24
el proceso recolector de basura
00:14:26
pum
00:14:29
lo libera de memoria
00:14:30
lo hace desaparecer
00:14:33
luego
00:14:34
insertar es muy fácil
00:14:36
hacer dos asignaciones
00:14:39
eliminar es muy fácil
00:14:40
hacer una asignación
00:14:43
sin embargo aquí lo que se hace muy pesado
00:14:44
es consultar
00:14:47
porque en una raíz de inmediato
00:14:49
consultar posición y
00:14:51
te vas a esa posición del Array
00:14:52
inmediato, pero aquí tienes que ir
00:14:54
haciendo pa pa pa pa
00:14:56
entonces
00:14:58
una lista enlazada está
00:14:59
fenomenal en una aplicación en la cual
00:15:02
lo que sobre todo se hace con los datos
00:15:04
es incorporar y borrar
00:15:05
incorporar y borrar, cuando se hacen muchas
00:15:08
incorporaciones y borrados de los datos
00:15:09
esta va a ser muchísimo mejor que un ArrayList
00:15:11
pero cuando se
00:15:14
hacen muchas consultas
00:15:16
un ArrayList va a ser mucho más rápido
00:15:17
aquí consultar
00:15:20
una dirección que está toda por tu lado
00:15:21
claro, claro, entonces
00:15:23
cuando tú tienes a lo mejor una aplicación
00:15:25
en la que vas a tener siempre
00:15:27
27 datos y luego ya
00:15:29
con esos 27 ya no los mueves más
00:15:31
como mucho mueves a uno más
00:15:34
dos más y luego estar consultando, pues harías
00:15:35
una ArrayList, pero
00:15:37
si vas a tener que estar
00:15:39
haciendo todo el rato inserciones y eliminaciones
00:15:41
pues cogerías esta
00:15:44
esencial, sí, esencialmente
00:15:45
esa es la diferencia
00:15:48
desde fuera, uno cuando las usa
00:15:50
las va a usar igual, llamando a
00:15:52
llamando a no se que, pero como sabemos
00:15:53
como se comportan por dentro, pues podemos hacer
00:15:56
seleccionar de forma
00:15:58
seleccionarlas, particularizarlas en la que estén
00:15:59
vale
00:16:02
pues vamos a programar la lista enlazada
00:16:03
que es un pelín más
00:16:06
difícil de entender que la array list
00:16:07
pero tampoco tiene, pues aquí habrá que
00:16:09
programar una clase para
00:16:11
empezar, la clase
00:16:14
nodo, la clase nodo
00:16:15
que tendrá dos partes, el tipo de
00:16:18
dato que sea
00:16:19
y la dirección del siguiente nodo
00:16:20
la clase nodo
00:16:23
y luego ya la clase colección concreta
00:16:24
la clase en mi linked list
00:16:27
que es la que tendrá la dirección del primer nodo
00:16:29
pero la clase nodo
00:16:32
habrá que programarla
00:16:33
y luego habrá que programar
00:16:34
mi clase colección
00:16:37
la que ya ofrece los métodos y lo hace todo
00:16:38
pues venga
00:16:41
vamos a programarla
00:16:42
si pero para usar ese ejemplo
00:16:43
la vamos a programar por primero.
00:16:49
Si no la programamos, ¿cuándo la vamos a usar?
00:16:50
A programar, ¿qué por eso estás aquí?
00:16:53
Vaya, por Dios.
00:17:03
Nodo tiene dos propiedades.
00:17:06
Vale, a ver.
00:17:22
Venga, pues
00:17:25
a ver, la colección
00:17:26
ahora se va a llamar
00:17:30
Mi Linked List.
00:17:32
paciencia
00:17:35
aunque ahora sí
00:17:39
y no os bajéis la sábana
00:17:40
¿algo más?
00:17:42
¿no?
00:17:43
un café
00:17:43
¿no sirve un café?
00:17:43
¿cafés no sirve?
00:17:49
¿quieres un curasal?
00:17:50
un mantequilla
00:17:51
bueno
00:17:51
pues eso luego
00:17:52
venga
00:17:54
mi linked list
00:17:55
finish
00:17:57
esta va a ser mi lista
00:17:58
la que tiene dentro los datos
00:18:01
la equivalente a mi array list que lo que tenía el array
00:18:03
pero mi linked list con que tenga la dirección
00:18:07
del primer nodo es suficiente
00:18:11
la dirección del primer nodo es una referencia
00:18:12
a la clase nodo que tendremos que hacer
00:18:16
vamos a llamarla inicio por ejemplo
00:18:19
inicio lista para que quede más claro
00:18:22
entonces mi linked list lo único que tiene que tener dentro
00:18:24
es la dirección del primer nodo
00:18:28
la que se llama inicio lista
00:18:30
vale
00:18:32
nos falta la clase nodo, claro
00:18:33
pues vamos a hacer la clase
00:18:35
nodo, la clase
00:18:39
nodo es la que tiene dos partes
00:18:47
una la que tiene el dato
00:18:49
vale
00:18:51
vamos a
00:18:52
como las dos van a ir en pack, aquí no tiene
00:18:57
sentido que pongamos private porque esto no es una
00:19:01
entidad de
00:19:03
string
00:19:04
dato
00:19:07
esta propiedad es para el dato en sí
00:19:08
para la cadena y nos falta
00:19:11
otra propiedad que es la
00:19:13
segunda parte de la cajita
00:19:15
que es la dirección del siguiente nodo
00:19:17
vale
00:19:20
luego la clase nodo está
00:19:28
clara ¿no? la clase nodo tiene
00:19:30
una propiedad que es el dato
00:19:31
y otra que es la dirección del siguiente
00:19:33
y la clase
00:19:35
mi linked list tiene
00:19:46
la dirección del primero
00:19:48
en cuanto a representación de la situación
00:19:50
ya está
00:19:53
a lo que hay es que hacer los métodos para que esto se
00:19:53
comporte como hemos dicho
00:19:56
vale, pues
00:19:57
vamos a hacer
00:20:02
el método insertar
00:20:05
añadir, vamos
00:20:06
añadir un dato
00:20:08
un string, porque estamos trabajando con
00:20:10
string, vale, a ver
00:20:12
no vamos a complicarnos
00:20:18
mucho la vida, vale
00:20:19
porque lo único que quiero es que se
00:20:22
refleje la idea de cómo funciona
00:20:24
esto
00:20:26
y luego ya vamos a usar linked list, lógicamente
00:20:26
vale, pues para
00:20:30
añadir el dato
00:20:32
Vamos a pensar un momento
00:20:33
Clase de pain
00:20:35
Clase de pain
00:20:39
Que me vendría muy bien
00:20:41
Una clase de pain
00:20:42
O un ordenador
00:20:43
Eso sí que me vendría
00:20:45
Vale, pero ya tengo wifi
00:20:48
Ya, hombre
00:20:50
Claro
00:20:52
Después de 8 años que llevo aquí
00:20:54
Venga
00:20:57
Pues a ver
00:20:59
Por eso por la wifi del instituto
00:21:00
No sé si había una que nunca llegó
00:21:02
A mí nunca me llegó a funcionar
00:21:07
A ver, formas aquí
00:21:08
No, no, a ver, le funciona igual que los demás
00:21:12
Él no nos ocultaba la password
00:21:18
Lo que pasa es que no
00:21:21
La password la sabíamos, pero
00:21:22
Tirar de ella era tontería
00:21:23
Vale, pues a ver
00:21:26
Esta es
00:21:29
este sería
00:21:31
el primer nodo, el inicio
00:21:34
famoso
00:21:37
que inicialmente
00:21:37
está apuntando a nul, ¿verdad?
00:21:40
¿Vale?
00:21:49
Este sería
00:21:51
inicialmente cuando la lista arranca
00:21:52
y yo la instancie,
00:21:54
cuando la instanciemos, inicio lista será nul
00:21:56
porque está sin inicializar.
00:21:58
Será nul, ¿vale?
00:21:59
Entonces,
00:22:01
cuando vamos a suponer
00:22:02
vamos a hacer un añadir asumiendo
00:22:05
que la lista ya tiene cosas
00:22:07
para que sea más fácil
00:22:09
no contemplamos el caso inicial que luego
00:22:10
vale, entonces
00:22:13
vamos a suponer que la lista ya tiene cosas
00:22:15
vamos a hacer el add asumiendo que tiene cosas
00:22:16
entonces
00:22:18
la lista
00:22:20
tiene aquí
00:22:23
el dato
00:22:23
y la dirección del siguiente
00:22:26
y hacemos
00:22:32
solo uno más
00:22:38
y este nodo que tiene
00:22:39
que tiene el dato
00:22:43
y la dirección del siguiente
00:22:50
y este ya
00:22:54
este ya me lleva a nul
00:22:56
vamos a poner una situación de la lista
00:23:00
en la que estoy así
00:23:03
vale, y este nul
00:23:06
como si no existiera
00:23:12
vale, a ver, relax
00:23:13
chicas, por favor
00:23:28
vale
00:23:29
reírse, ¿te parece poco?
00:23:31
ya, pero es que
00:23:39
lo tuyo es fuera de categoría
00:23:40
por eso te vamos a llevar
00:23:42
a un sitio tan bonito
00:23:44
venga
00:23:45
a ver, ¿no ves que se ha abierto
00:23:48
un perímetro de seguridad alrededor tuyo?
00:23:50
¿se ha abierto un perímetro?
00:23:53
no, ya vi, ya vi
00:23:54
bueno, silencio
00:23:55
vale, vamos a suponer que la situación
00:23:59
de la lista es esta, vale, el método
00:24:00
añadir un dato
00:24:02
que implicará, implicará
00:24:04
varias cosas, mi dato llega por aquí, yo al
00:24:06
método de añadir, me limito a darle
00:24:08
un dato, este dato, un
00:24:10
string, una cadena. Y ahora el
00:24:12
método de añadir tiene que hacer todo lo necesario
00:24:14
para coger este dato,
00:24:17
meterlo en un nodo, insertarlo en la lista,
00:24:18
etcétera. Vale, pues
00:24:21
entonces, lo primero que tendría que hacer el método,
00:24:22
crear un
00:24:25
objeto nodo y
00:24:26
meter el dato en el objeto nodo.
00:24:28
Eso es lo primero que tiene que hacer el método add.
00:24:31
Vale, pues vamos a hacerlo.
00:24:32
Lo primero que tiene que hacer el método add
00:24:34
es
00:24:36
No, pero si tú no viajas
00:24:36
Si tú has hecho un new dato
00:24:48
Ahí está, para el infinito
00:24:49
Vale, tenemos un nuevo nodo
00:24:51
Vale
00:24:53
Este nodo, su dato
00:24:55
Que sea
00:24:58
El dato que me han dado
00:25:01
O sea, el dato que me han dado
00:25:03
se va a la propiedad
00:25:06
dato de este nodo
00:25:08
que he creado.
00:25:10
Eso es lo primero que tendremos que hace el método A
00:25:12
de este de aquí. Lo primero.
00:25:14
¿Verdad?
00:25:15
Claro.
00:25:18
Pues lo primero que es esta parte.
00:25:20
Crear el objeto nodo,
00:25:23
la cajita grande y meter el
00:25:24
dato ahí dentro. ¿Qué es lo siguiente
00:25:26
que tiene que hacer? Pues la otra
00:25:28
parte del nodo, que ahora mismo está.
00:25:30
Esta parte del nodo
00:25:33
tiene que apañárselas
00:25:35
para que apunte
00:25:36
a donde yo quiera que apunte
00:25:38
vamos a hacer la versión fácil de add
00:25:40
que es añadir al final
00:25:42
la versión fácil de add
00:25:44
que es añadir al final
00:25:48
perdón, no, no, no
00:25:49
la versión fácil de add que es añadir al principio
00:25:51
al final no es nada fácil, es complicada
00:25:53
es añadir al principio, que es insertar aquí
00:25:55
la versión fácil sería
00:25:57
hombre, pues lo tengo muy fácil
00:25:59
a este de aquí
00:26:01
primero
00:26:03
le pongo
00:26:04
lo que tiene la lista en ese
00:26:07
momento. O sea, le asigno
00:26:09
a este, le asigno a esto.
00:26:11
Con lo cual, lo primero que consigo es
00:26:13
esto de aquí.
00:26:15
Lo primero que hacemos es este enlace.
00:26:17
Es decir,
00:26:20
a la dirección de inicio de mi lista,
00:26:20
perdón, a la dirección siguiente del
00:26:23
nodo nuevo, le asigno el inicio
00:26:25
de mi lista. Vamos a hacer este enlace el primero de todos.
00:26:27
Este enlace el primero.
00:26:29
Vale, pues este enlace se
00:26:31
corresponderá hacer esta sentencia, nodo punto siguiente, dirección siguiente, igual a inicio
00:26:33
lista, ¿vale? Ya hemos hecho ese enlace, hemos hecho este, al siguiente del nodo que he hecho
00:26:43
le asigno lo que tenía inicio lista, luego he construido este enlace y ahora ¿qué es lo
00:26:57
Siguiente y último que hacemos, al inicio lista le quito lo que había, se lo quito y le hago que apunte al nuevo, le hago ahora que apunte a este, pataplón, y este se ha quedado insertado en la lista al principio, a inicio, luego lo único que me falta es a inicio lista darle la dirección de este nodo que he creado, es lo único que me falta,
00:27:04
a inicio
00:27:30
lista
00:27:32
asignarle nodo.
00:27:33
¿Vale? Porque nodo es la dirección
00:27:41
del nodo que he creado.
00:27:43
Pues ya está. El método add ya está.
00:27:45
Es el add
00:27:48
al principio. ¿Vale? Lo podríamos
00:27:49
llamar, si queremos ser más...
00:27:51
Añade al principio de la lista.
00:27:53
Añade al primero.
00:27:59
Ya está.
00:28:02
Pues lo hemos metido ahí.
00:28:03
Entonces, luego
00:28:09
uno tendría que comprobar si en los casos
00:28:10
extremos, cuando la lista está vacía, cuando
00:28:11
no funciona. Pero claro que funciona, porque cuando
00:28:13
esta apunta null, ¿qué estaremos haciendo?
00:28:15
A este le damos null, perfecto.
00:28:18
Y a este le damos el nuevo. Luego
00:28:19
para el caso particular, lista vacía,
00:28:21
este addFirst también funciona.
00:28:24
Entonces este addFirst es el más.
00:28:26
¿Vale?
00:28:28
Entonces ya tenemos
00:28:29
y claro, luego a esta colección se le pueden
00:28:31
añadir más métodos. Vamos a
00:28:33
añadirle solo dos más
00:28:37
para poder recorrerla y ver que lo que metamos
00:28:39
esta, vale
00:28:41
vamos a darle
00:28:44
recuperar el elemento de una
00:28:47
posición
00:28:49
tenemos que ir avanzando
00:28:49
en las direcciones
00:28:59
claro
00:29:00
entonces
00:29:02
a mi
00:29:04
linked list le vamos a dar el método get
00:29:07
hasta que ese número sea pos
00:29:09
entonces aquí lo importante
00:29:10
es entender que la sentencia clave
00:29:13
es
00:29:15
coger
00:29:16
una referencia auxiliar
00:29:18
un nodo auxiliar
00:29:20
un nodito auxiliar que lo podemos poner por aquí
00:29:21
por cualquier lado, o sea una referencia
00:29:24
a nodo auxiliar
00:29:26
¿vale? que inicialmente
00:29:28
que apunte al principio
00:29:34
y la vamos avanzando
00:29:36
con la siguiente
00:29:38
sentencia, vamos a suponer que hacemos
00:29:40
un nodo auxiliar, este de aquí
00:29:42
un nodo auxiliar que apunta al primero
00:29:44
vamos a hacernos un auxiliar
00:29:45
que apunte al principio de la lista
00:29:47
un nodo auxiliar, vale
00:29:52
y ahora, fijaos
00:29:56
que cada vez que hacemos esta sentencia
00:29:58
aux igual a
00:30:00
aux.dir siguiente, que esta es la
00:30:02
clave, la importante
00:30:04
cada vez que hagamos
00:30:05
esta sentencia, ¿qué hacemos con
00:30:08
este nodo auxiliar? de aquí
00:30:10
lo estamos haciendo que
00:30:12
apunte al siguiente nodo
00:30:14
luego este nodo auxiliar inicialmente
00:30:15
apunta al primero
00:30:18
pero cada vez que hagamos
00:30:19
aux igual a aux.dir siguiente
00:30:21
cada vez que hagamos esto
00:30:24
este nodo
00:30:26
se quedará apuntando a uno
00:30:28
posterior y a uno posterior
00:30:30
lo único que tenemos que hacer es un for
00:30:31
que ejecute esa sentencia de avance
00:30:34
tantas veces como posiciones
00:30:36
y ya está
00:30:37
entonces si pos me dan 0
00:30:39
no se ejecutará nunca
00:30:52
luego aux será la del primero, justo
00:30:54
que me dan 1, se ejecutará
00:30:56
una vez, luego aux se quedará
00:30:58
apuntando al primero
00:31:00
al siguiente
00:31:02
¿vale? entonces esta
00:31:04
sentencia avanza el nodo
00:31:06
auxiliar una vez, cada vez que la ejecuto
00:31:08
luego si lo meto en un for
00:31:10
la sentencia de avanzar se va a
00:31:12
hacer pos veces, que es justo lo que quiero
00:31:14
luego cuando este for ha terminado
00:31:16
cuando este for acabó, yo ya
00:31:18
sé que mi auxiliar estará
00:31:20
apuntando al nodo pos que me
00:31:22
interesa, lo único que tengo que hacer
00:31:24
es sacar el dato, porque
00:31:26
el nodo es la caja completa, lo único que me
00:31:28
falta sacar el dato. Una vez que el
00:31:30
nodo auxiliar ya ha ido avanzando, ha ido avanzando
00:31:32
por la lista, ya se ha
00:31:34
quedado ahí, pues ahora ya
00:31:36
return aux.dato
00:31:38
y punto
00:31:40
pelota. Se acabó el get por posición.
00:31:43
Vale.
00:31:54
El size
00:31:56
pues sería hacer un
00:31:57
for que hace esto hasta que
00:31:59
mientras aux sea diferente de null
00:32:01
y contar. Vale.
00:32:02
Vamos a hacer ese y ya hacemos más métodos de la linked list.
00:32:05
el size
00:32:07
public int size
00:32:12
este que tenemos que hacer
00:32:14
pues hacemos de nuevo
00:32:17
un nuevo auxiliar
00:32:19
que apunte al primero
00:32:19
y ahora un contador
00:32:24
porque vamos a contar
00:32:28
cuantos avances hemos hecho
00:32:29
hasta que ha llegado a valer
00:32:32
null ese aux
00:32:34
y ahora ya hacemos un contador
00:32:35
para contar
00:32:37
y ahora podemos hacer
00:32:38
mientras aux
00:32:42
sea diferente
00:32:43
de null
00:32:45
avánzalo
00:32:47
que no atino
00:32:52
vaya diferente que he puesto más original
00:33:04
así mejor
00:33:08
vale
00:33:10
de hecho
00:33:11
si la lista estuviera vacía
00:33:13
inicio lista sería null
00:33:16
no entraría nunca aquí con lo cual me devolvería 0
00:33:17
que es lo que me tiene que devolver
00:33:20
si tuviera solo una posición avanzaría una vez me devolvería 1
00:33:21
y ahora ya
00:33:24
Y bueno, me falta incrementar el contador, lógicamente
00:33:25
Entonces
00:33:28
Aquí voy a tener que poner unas llavecitas
00:33:29
Y ahora
00:33:32
Una vez que mi bucle ha terminado
00:33:38
Pues ya me devuelvo
00:33:40
Vale
00:33:41
Y sería un ejercicio maravilloso, lo vamos a dejar planteado
00:33:46
Que hicierais el remove, no sé qué, no lo vamos a hacer aquí
00:33:49
Vamos a usarlo
00:33:52
En un ejemplo para ver si esta lista enlazada
00:33:54
Efectivamente me permite meter cosas
00:33:55
Y si realmente están dentro
00:33:57
Entonces, como veis
00:34:00
El código es muy sencillo
00:34:08
Esto es mucho más fácil computacionalmente
00:34:09
Que recorrer un array entero
00:34:11
Copiar uno en otro, muchísimo más
00:34:13
Es hacer cuatro asignaciones
00:34:15
Dos, una
00:34:17
El add de aquí
00:34:18
Se ha quedado en nada
00:34:21
Sin embargo, el add del array list
00:34:22
Era un rollo
00:34:24
De arrays para un lado y para otro
00:34:25
El del end lo vas a hacer tú
00:34:27
el remove no lo vamos a hacer
00:34:32
pero
00:34:35
hombre claro que está
00:34:35
pero estaría muy bien
00:34:39
que lo programaréis vosotros
00:34:42
habría que avanzar aux igual a aux siguiente
00:34:44
una vez que habéis llegado pues cambiar las direcciones
00:34:46
para que puenten
00:34:48
este pues
00:34:49
lo hacéis vosotros
00:34:56
que tiene su cosita, sí pero no ahora
00:34:59
porque vamos a probar ahora mismo
00:35:01
que esto que me he hecho está bien
00:35:02
vosotros que sois listos
00:35:04
y espabilados
00:35:07
Vosotros, especie inferior
00:35:09
Vais a hacer esto
00:35:12
Venga, vámonos al main
00:35:13
Venga, el main
00:35:15
Nuestro ArrayList ha funcionado estupendamente
00:35:18
Lo voy a hacer en mi main
00:35:20
Como voy a subir esto, voy a hacerlo aquí en un
00:35:24
Método aparte, prueba
00:35:26
ArrayList, prueba LinkedList
00:35:27
Vale, prueba mi ArrayList
00:35:29
Metemos el código que hemos hecho
00:35:41
Antes
00:35:43
Ahí, vale
00:35:43
y aquí lo dejamos
00:36:03
comentado
00:36:04
para ver que lo habíamos probado y que funcionaba
00:36:06
vale, y ahora vamos a hacernos
00:36:09
la prueba de esta estructura
00:36:14
a ver si la hemos hecho bien
00:36:16
vale
00:36:17
pues vamos a hacer
00:36:33
lo mismo saltándonos el borrar
00:36:35
lo mismo pero con un linked list
00:36:37
entonces el mismo código
00:36:40
código
00:36:42
copia y pega, el mismito
00:36:43
el mismito código
00:36:46
pero ahora en este mismito código
00:36:52
el mismito para que veamos la plasticidad
00:36:55
de las colecciones
00:36:57
el mismo código, lo que pasa es que ahora
00:36:58
en lugar de una estructura, mi ArrayList
00:37:00
he decidido que cambio y que voy a usar
00:37:02
una LinkedList, pero lo demás es igual
00:37:05
bueno, los nombres de los métodos han cambiado
00:37:07
pero tendrás que crearlo
00:37:09
claro, sí, sí
00:37:10
claro
00:37:13
pero es una caja de nombres igual
00:37:14
pero ahora funciona por dentro de otra manera
00:37:17
vale
00:37:19
mi linked list que la
00:37:21
importamos
00:37:23
y ahora
00:37:25
yo en lugar de add
00:37:27
como lo he llamado add first pues bueno lo cambio
00:37:30
add first
00:37:32
mostramos el primero
00:37:32
mostramos el último remove no lo tenemos
00:37:35
implementado así que no lo
00:37:38
va a eliminar voy a quitarlo de hecho
00:37:40
esta parte de código porque no haría
00:37:42
nada y en lugar
00:37:44
de los que quedan voy a poner los que hay
00:37:47
vale pues he cambiado
00:37:49
la cajita, el que usa esto
00:37:53
le da igual como está hecho por dentro
00:37:55
pero simplemente ha usado
00:37:57
una cajita
00:37:59
¿dónde estamos? aquí, mi linked list
00:38:00
porque a él le interesa una cajita, mi linked list
00:38:03
pues usa esta cajita, va metiendo
00:38:05
va recuperando
00:38:07
y ya está
00:38:09
y ha cambiado una caja
00:38:11
por otra
00:38:13
los detalles internos de la implementación
00:38:13
no importan
00:38:17
pues vamos a ver
00:38:19
si esto lo hemos hecho bien o mal
00:38:21
venga, vamos a probar
00:38:22
A, A, B, B, C, C, D, E
00:38:33
vale, pues he metido los 10 nombres
00:38:41
el primero
00:38:51
JJ
00:38:53
el último AA
00:38:55
a ver, está bien, porque es que
00:38:57
recordad que es un at first
00:38:59
entonces
00:39:00
los va introduciendo
00:39:01
al principio de la lista
00:39:04
Entonces, el BB se cuela por delante de la A, el CC se cuela por delante, el DD se cuela por delante, se están colando por delante, luego cuando el primero me muestra el último que he metido, porque nuestro adverses se están colando, cada uno que metemos se cuela el primero, luego efectivamente está bien, el último que he metido es este, que se ha quedado el primero de la lista, el último de la lista se ha quedado el primero que metí, que es este,
00:39:06
Y cuantos tengo
00:39:33
Pues tengo estos en el orden
00:39:35
Que tienen que aparecer
00:39:37
Cada uno que he metido se ha colado
00:39:38
A ver, esta nuestra no
00:39:40
Porque no hemos
00:39:45
Habilitado eso
00:39:47
En una colección normal sí
00:39:48
No lo sé
00:39:49
Para que con el for each
00:39:55
Conecte con esto, no lo sé
00:39:57
Tendríamos que mirar a ver como está hecho en el link
00:39:58
No lo sé
00:40:01
vale, pues esta es la idea
00:40:02
de las colecciones, hemos hecho unas versiones
00:40:06
muy muy muy reducidas
00:40:08
de la ArrayList y del LinkedList
00:40:09
que la idea de fondo es esta, lo que pasa es que luego
00:40:12
la versión real incluye
00:40:14
muchos más métodos
00:40:16
y no solo incluye muchos más métodos
00:40:17
sino que incluye algo que no todos hemos pasado
00:40:20
por alto, que esto que hemos hecho
00:40:22
solo nos vale para stream
00:40:23
entonces nos tiene que servir para todo, entonces para que se haga por todos los datos
00:40:25
hay que dar el salto a genéricos
00:40:28
que es poner
00:40:30
el, no exactamente
00:40:32
no, eso exactamente
00:40:34
no, pero cuando ves una T por ahí
00:40:36
o una V mayúscula suelta, tiene más
00:40:38
que ver con eso, eso que dices
00:40:40
del obvio es más de los opcional
00:40:42
dime
00:40:44
claro, pero si estamos
00:40:44
metiendo al principio, con lo cual se cuela al principio
00:40:50
claro
00:40:52
vale
00:40:54
vale
00:40:56
vale, pues el próximo día
00:40:57
Vemos las listas reales
00:41:00
Para ver
00:41:03
No, hemos dicho que al final del día de hoy
00:41:04
Que estaríais cansados
00:41:06
Y retomamos lo del ejercicio de ayer
00:41:07
A ver qué es lo que habíais hecho
00:41:09
Antes de qué
00:41:11
De que el mundo acabe y explote
00:41:14
Pues espero que sí
00:41:16
A ver
00:41:18
yo estoy más harta que tú
00:41:28
de estar aquí, seguro
00:41:30
pero claro, a mí me pagan
00:41:31
y tengo una responsabilidad
00:41:34
y la responsabilidad es que vosotros os quedéis aquí
00:41:35
o sea que aprovechéis las 10 horas que tenéis
00:41:37
venga
00:41:39
bueno, pues el próximo día
00:41:41
entonces ya conectamos con
00:41:44
lo ampliamos a datos
00:41:45
genéricos y luego ya vemos
00:41:48
las versiones reales y como
00:41:50
se usan, porque ahí ya tenemos que empezar a
00:41:52
meter cuestiones que no podemos olvidar
00:41:54
Pues, como el equals, etcétera, ¿vale?
00:41:56
Venga, pues, ¿cuál era nuestro ejercicio?
00:42:02
A ver, a ver.
00:42:06
Sí, pero lo retomamos el próximo día.
00:42:08
Ejercicio, ¿dónde estaba eso?
00:42:15
Alumnos, títulos.
00:42:17
Menudo cuñazo.
00:42:18
Vamos a ver.
00:42:19
Lo compó.
00:42:20
Con todas las letras.
00:42:21
Vale.
00:42:27
¿Necesitáis parar dos, tres minutos?
00:42:29
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 13
- Fecha:
- 29 de enero de 2025 - 13:11
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 42′ 33″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 597.82 MBytes