Implementacion Lista con Array - 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:
Entonces, nosotros hemos dicho que anteriormente, en noviembre o algo por el estilo,
00:00:00
hemos aprendido a utilizar los arrays.
00:00:06
Una de las características fundamentales de los arrays es que son estáticos,
00:00:09
que son, una vez creados, esas son las celdas que pueden contener,
00:00:12
y si yo quiero añadir o quitar algo, pues tengo que liarme con cosas complejas.
00:00:17
entonces ha llegado un momento en que nosotros decimos hoy mira para pero porque no simplificó
00:00:23
el utilizo de los arrays como los arrays a mí me molestan porque tengo que hacer siempre código
00:00:34
súper complejo vale para poder trabajar con los arrays porque no me los quito de encima
00:00:42
y tú dices, yo no sé cómo se hace.
00:00:49
Pues sí, sabes cómo se hace.
00:00:53
Vosotros tenéis todas las herramientas para quitaros lo de encima,
00:00:56
solo que no habéis conectado los puntos.
00:00:59
Tenéis el rotulador, tenéis los puntos, pero os falta hacer el dibujo.
00:01:03
Entonces hoy vamos a intentar hacerlo.
00:01:08
Entonces me he creado un nuevo proyecto con un package.
00:01:11
Aquí vamos a crear una interfaz, ¿vale?
00:01:16
Esta interfaz la llamamos, no sé, lista.
00:01:21
Estamos de acuerdo que en el mundo de los arrays,
00:01:26
nosotros principalmente por ahora lo hemos utilizado como una lista, ¿vale?
00:01:32
Yo tenía los alumnos, he puesto los alumnos en una lista que era mi array.
00:01:36
Yo tenía los coches, pues tenía un array de coches donde dentro ponía coches,
00:01:41
una lista de coches, ¿sí?
00:01:44
A veces lo he, como se dice, ordenado, a veces he buscado ahí dentro, he hecho cosas distintas, pero sustancialmente lo que he hecho es utilizarlo como una lista.
00:01:46
Existen otros tipos de estructuras de datos que veremos cuando veremos la teoría de esta parte, ¿vale?
00:01:58
Pero por ahora nosotros pensamos en una lista.
00:02:04
Entonces, cuando yo he usado mis fantásticos arrays en mis proyectos superdifíciles que
00:02:06
pueden ser una escuela, un taller o lo que sea, pues ¿qué operaciones necesitaba hacer
00:02:16
sobre estos arrays antes de recorrer un array?
00:02:24
Va, recorrer un array, ¿qué más?
00:02:34
Sí, es como lo relleno, añadiendo un elemento. Añadamos un elemento. Yo quiero que mi interfaz
00:02:40
lista, cuando yo creo una lista, este objeto mágico que voy a crear, que sustituirá los arrays,
00:03:02
pues tendrá la posibilidad de public void add para añadir a la lista una cosa nueva, ¿vale?
00:03:11
¿Add qué? Oiga, señores, os separo si seguís leyendo. ¿Qué queremos añadir? Element. ¿Y qué
00:03:21
tipo le doy a él? Ni idea. Si fuera un array de string, el elemento sería string. Si fuera
00:03:31
un array de coches, coche. Si fuera un array de gatos, gato. Entonces, ¿cómo hago? ¿Qué
00:03:51
hago aquí? ¡Voilá! Añado un objeto. ¿Gato es un objeto? Hola, buenos días. Clase de programación,
00:04:00
lunes, ya segunda hora. El hecho de no estar dormido porque primera hora ya no vale. ¿Sí?
00:04:18
¿Por qué uso object? Para hacerlo más genérico. ¿Vale? Esto me permite añadir lo que me da la
00:04:25
si no está perfecto vale esto molaría decir que si yo estoy utilizando una red string fuera string
00:04:35
donde de gato gatos mientras esta cosa aquí es un poquito peligrosa porque me permitiría añadir gato
00:04:45
string dentro del mismo a la misma cosa vale pero todavía nos falta saber utilizar bien los tipos
00:04:51
genéricos. Porque aquí lo que me encantaría ponerle tipo T. ¿Qué es tipo T? No lo sé. Ya lo veremos.
00:04:58
Pero podría hacer... Ahí. Ya he utilizado el tipo genérico. No estoy haciendo una lista cualquiera,
00:05:08
estoy haciendo una lista de objetos T que me tendrás que decir cuando lo creas y aquí añades
00:05:16
un elemento T. Pero como todavía no lo entendemos y estamos... ¿Qué es esto? Y añadimos
00:05:22
complejidad, pues por ahora vamos
00:05:27
así. ¿Vale? Pongo objetos.
00:05:29
¿Me podéis hacer un ejemplo
00:05:32
de un object?
00:05:33
¿Coches? ¿Qué más?
00:05:42
¿Gato? ¿Qué más?
00:05:45
¿Malo?
00:05:46
¿Entendéis que todas las clases que
00:05:48
he creado hasta ahora son object?
00:05:49
¿Sí? Porque
00:05:52
heredan de object directamente o
00:05:54
indirectamente. Por lo tanto,
00:05:56
si aquí pongo object, puedo poner cualquier cosa.
00:05:58
¿Sí? Entonces,
00:06:01
si me estoy diciendo, mira,
00:06:02
Quien implemente una lista, tiene que tener la posibilidad de añadir un objeto.
00:06:04
¿Cómo se hace? Me da igual. Lo tienes que saber tú, cómo se hace.
00:06:11
Pero cuando yo usaré tu clase que implementa esta interfaz, sé que puedes añadir un objeto a la lista.
00:06:19
¿Sí? ¿Qué más puede hacer una lista?
00:06:27
public void removeObjectElement, puede ser ¿no? Vamos con calma. ¿Esto qué hace? Pues me tiene que
00:06:30
buscar el objeto elemento y quitar. Podría hacerlo así, pero no. Cuidado, cuando yo uso esto yo tendré
00:06:52
que comprobar que el objeto element es igual al objeto que voy a borrar y borrarlo, cuando uso
00:07:17
esto, borro una posición concreta. Cuando uso esto, me expongo a la posibilidad que haya varias veces
00:07:25
el mismo objeto en la lista y si digo remueve el objeto, ¿qué quiere hacer? ¿Quiere remover el
00:07:35
el primero, quiere removerlos todos, ¿qué quiere hacer? Lo tengo que definir. Entonces,
00:07:41
esto nosotros usamos una versión list sencilla, pero si tuviera que hacerla una compleja,
00:07:52
una seria, debería plantearme estos problemas. Dejamos los dos, ¿por qué no? Sobrecargamos
00:07:59
que el remove se puede eliminar como elemento o como posición.
00:08:06
Más, ¿qué función tiene replace?
00:08:11
Porque replace al fin y al cabo podría ser remueve un objeto y pone otro.
00:08:25
Entonces, más o menos lo tengo, para no complicarme la vida, ¿vale?
00:08:31
Pero sí, cosas que podrían estar interesantes, es, ¿sabes?, dime el tamaño de la lista, public,
00:08:34
ah, bueno, y public object busca, public int, object busca, object,
00:08:47
¿Qué hará esta cosa aquí?
00:09:10
Busca a este señor
00:09:19
Y me devuelve
00:09:21
Su posición
00:09:22
Pero si hay más de un objeto
00:09:27
De este tipo, pues devolvamos esto
00:09:31
Si queremos
00:09:33
Y si no, asumamos que
00:09:39
El busca te dice
00:09:41
La posición del primer objeto
00:09:45
Igual a esto
00:09:47
El primer
00:09:49
Podría haber más, pero él te da el primero que encuentro, ¿si?
00:09:51
Y removeObject para nosotros remueve el primer objeto que se encuentre, ¿vale?
00:09:56
Me lo apunto, remueve el primer objeto igual a element, devuelve la posición del primer
00:10:02
objeto igual a elemento. ¿Sí? ¿Por qué? Porque he decidido yo hacerlo así, ¿vale? Para reducir la
00:10:19
complejidad de esta cosa, ¿sí? Porque si no, debería trabajar con me devuelve un array de
00:10:40
enteros y cosas por el estilo, ¿vale? En un punto más complejo. Entonces, por ahora, lo dejamos así, ¿vale?
00:10:46
también apunto aquí negativo si no lo encuentra. Entonces, si lo encuentra me devuelve la posición
00:10:53
del array allí dentro. La posición del elemento dentro de esta lista. Si en vez de no lo encuentra
00:11:07
me devolverá menos uno, por ejemplo. Entonces, menos uno quiere decir, mira, lo he buscado y no
00:11:15
la he encontrado.
00:11:19
Esto está claro.
00:11:22
Este de aquí creo que está claro también.
00:11:23
¿Dónde lo añade? ¿Al principio, al final, en el
00:11:25
medio? Ordenado.
00:11:27
Al final, claramente.
00:11:30
Lo decidimos nosotros.
00:11:36
¿Vale? No es necesario
00:11:38
saber...
00:11:39
Por ahora estamos creando nuestra
00:11:41
interfaz. Si tuviese una interfaz
00:11:43
ya creada, debería ir a mirar
00:11:45
oye, ¿qué hace?
00:11:47
A lo mejor yo quiero que la lista
00:11:49
mía sea ordenada. Entonces,
00:11:51
cuando lo añado, no lo puedo añadir al azar.
00:11:53
Tengo que añadirlo donde está de acá.
00:11:55
Entonces, no puedo
00:11:57
utilizar Object. Debería utilizar
00:11:59
Comparable.
00:12:01
Para poder estar seguro que
00:12:03
yo puedo añadir los objetos que te da la gana
00:12:05
siempre y cuando implemente Comparable.
00:12:07
Porque si tiene que estar ordenada,
00:12:09
pues tengo que poder compararlos entre ellos.
00:12:11
¿Verdad?
00:12:15
Pero eso no sería Sol en vez de A.
00:12:16
No lo sé.
00:12:18
Si tú quieres añadirlo desordenado
00:12:22
y luego ordenarlo,
00:12:24
sí, podría poner aquí otra cosa. Pero si tú asumes que tu lista siempre esté ordenada,
00:12:25
quiere decir que cuando añades un nuevo elemento no lo puedes ordenar desordenado
00:12:31
esperando a que alguien haga sort. Pues tú lo añades y automáticamente lo sorteas.
00:12:35
¿Queréis el sort? Esto es ya un poquito más complejo. Hablit int sort object. Pero esto
00:12:41
es un poquito más complicado porque nosotros estamos utilizando object entonces podría no
00:12:54
ser comparable, por lo tanto esto es un poco más complejo. Lo tenemos sencillo. Esta es una lista
00:12:58
muy sencilla. Añade, quita, dice el tamaño y busca si hay un objeto o no hay dentro. Si lo encuentra,
00:13:09
de paso me da también... Esto habría podido ponerlo como booleano. Dime si está o no. Contains. Pero
00:13:16
como ya que para saber si lo contiene
00:13:25
lo tengo que buscar, una vez que lo he encontrado, en vez de decir si lo contiene, pues te
00:13:29
devuelvo ya el número y tú sabes que menos uno es, no lo
00:13:33
contiene, cualquier otro número positivo, pues es el índice donde está.
00:13:37
¿Sí? Podríamos ahora añadir
00:13:42
una última cosa que es el public
00:13:45
object get int.
00:13:48
sigue. Esto me sirve para pillar los objetos de la lista. Los puedo pillar de uno en uno,
00:13:54
pero uno, dos, tres, entonces me pillaría el primero, el segundo, el tercero, o podría
00:14:03
buscar un objeto, me da el asistio tres, entonces si yo aquí le pongo tres y él me da el objeto
00:14:09
asociado. Sí? Buscar es como show? Buscar es como show. O sea, sería la misma definición? No lo sé. Show qué? Como mostrar. Pero mostrar, yo si leo un show, me mostraría el entero array. En mi opinión. Busca no lo enseña. Busca tiene igual de tres, que es la posición del objeto que estabas buscando.
00:14:15
¿Queréis un show?
00:14:42
Public
00:14:45
void
00:14:46
toString. ¿Cómo no?
00:14:48
Pero ya lo tiene, public string.
00:14:50
Ya lo tiene
00:14:53
porque cualquier
00:14:54
objeto que implemente esta lista
00:14:56
ya tiene el toString
00:14:58
de object. Por lo tanto, esto es un poco
00:15:00
inútil.
00:15:02
Pero
00:15:04
si quiero que
00:15:07
funcione, pues
00:15:10
imprime lista.
00:15:11
Lo que hace es imprimir la lista. Entonces, ¿qué estoy haciendo aquí? Yo estoy definiendo.
00:15:12
Yo hasta ahora estoy trabajando con los arrays. Odio los arrays porque son mis amigos. Si
00:15:27
seguís hablando y riendo os separo. Segundo aviso. Los arrays no me gustan porque son
00:15:33
complicados y cosas por el estilo pues quiero hacer una nueva entidad una nueva
00:15:44
clase que sea una lista y que cuando yo voy a trabajar con ella en vez de decir
00:15:50
oye mira pilla la red y hablo más grande de una posición de recorre lo llega al
00:15:56
final pone la cosa si es cuestión no yo le digo añade este elemento y él se
00:16:01
encarga yo digo tengo que quitar un elemento
00:16:06
vale, entonces recorre la array, busca dónde está
00:16:12
el elemento, quítalo, reduce la array
00:16:14
y cosas por el estilo, pues no lo quiero hacer más
00:16:16
vale, quiero que yo le diga, remuévelo
00:16:18
y él lo hace
00:16:20
¿ok?
00:16:21
pero para llegar a esto
00:16:24
tengo que hacer
00:16:26
lo de los arrays una última vez
00:16:28
¿vale?
00:16:30
entonces, vamos a verlo
00:16:33
esto se entiende, esto es
00:16:34
un contrato que me dice, para hacer
00:16:36
este nuevo elemento que nosotros hemos llamado
00:16:38
una lista, pues para hacer un objeto que sea una lista tiene que implementar
00:16:40
estos métodos de aquí. Podría añadir más. Podría decir
00:16:44
contains, podría decir remove, pero una
00:16:48
lista de objetos y que él remove a todos esos objetos que están
00:16:52
o añadir una lista y añadir
00:16:56
un array y él me añade todos los elementos de ese array. Puede hacer lo que me da
00:16:59
la gana. Pero esta es mi lista mágica.
00:17:04
¿Sí? Entonces, una vez que yo tengo la lista, tengo la idea de la lista, ahora tengo que hacer la implementación de la lista.
00:17:07
Y nosotros vamos a hacer dos implementaciones.
00:17:17
La primera implementación es la más fácil para vosotros porque estos métodos los habéis implementado ya 5.000 veces.
00:17:21
Me creo una nueva clase que llamaré miListaArray.
00:17:30
¿Vale? Esta clase
00:17:39
listarray
00:17:43
implements
00:17:44
listarray.
00:17:46
Se enfada porque dice no es posible
00:17:49
porque no tiene todos los métodos.
00:17:51
Venga, ponme los métodos.
00:17:54
Y no me da hoy
00:18:01
opciones.
00:18:02
Ahí. Esto me gusta.
00:18:10
¿Ok? Entonces
00:18:13
estos son todos los métodos
00:18:14
que tengo que
00:18:16
¿cómo se dice?
00:18:17
implementar aquí dentro
00:18:19
para que esto funcione.
00:18:23
¿Veis? Entonces empezamos.
00:18:25
Yo tengo ahora que imaginarme
00:18:27
cómo voy a implementar
00:18:29
esta lista.
00:18:31
Tengo que tener
00:18:33
algo por detrás, algo que luego
00:18:35
será escondido.
00:18:37
Pero
00:18:39
me sirve para implementar la funcionalidad
00:18:40
de esta lista por dentro.
00:18:43
¿Vale? Y nosotros
00:18:46
esta primera versión de lista
00:18:47
la vamos a implementar
00:18:50
con un array por dentro.
00:18:52
¿Vale? La última vez que usamos
00:18:54
los arrays, porque a partir de allí
00:18:56
usaré siempre mi lista array
00:18:57
en vez de un array.
00:18:59
Entonces, por
00:19:02
debajo, este señor tiene un array
00:19:04
object
00:19:06
y de aquí
00:19:07
lista
00:19:09
es igual
00:19:11
a new object
00:19:13
o podría hacerlo así
00:19:18
public
00:19:24
miListArray
00:19:26
voy a poner esto aquí
00:19:29
vale, entonces ya tengo un constructor
00:19:40
cuando yo creo miListArray
00:19:42
por dentro creo un array vacío
00:19:44
existe, no es null
00:19:46
pero no tiene ninguna
00:19:48
posición dentro
00:19:50
vamos a poderlo con esto
00:19:51
vale, entonces yo ahora tengo
00:19:53
que esconder este señor que no me gusta
00:19:56
porque es un array, utilizando
00:19:58
estos métodos. Empezamos de los más fáciles. Tengo un método size. ¿Quién me tendrá que devolver
00:20:00
size? ¿Tamaño de quién? ¿De qué array? No sabes escribir el código que me dice lo que estás
00:20:10
pensando. Tengo una lista, tengo que saber cuántos elementos hay en la lista. ¿Dónde estarán los
00:20:29
elementos. ¿Están en? Listo. ¿Lista? ¿Qué más? Yo miraré el tamaño del array y eso será cuántos
00:20:39
elementos están. Nada más crearlo tiene cero elementos porque no han añadido nada. Cuando
00:21:03
añadiré tres elementos pues habrá añadido al array tantas posiciones cuantas necesarias para
00:21:09
que contenga los tres elementos, entonces cuando pediré el tamaño de la red me dirá que son tres,
00:21:15
que son los tres elementos que tengo dentro. ¿Entiendes? En este caso, súper fácil.
00:21:19
Vamos a añadir un elemento. Entonces yo tengo este señor, que no sé cuánto grande es,
00:21:28
porque no sé si es la primera vez que hago el add o es la centésima vez que hago el add,
00:21:36
Pero me han dicho, oye, mira, a lista quiero que tú añadas este elemento.
00:21:41
¿Qué hago?
00:21:48
Aux.
00:21:53
New object.
00:22:02
New.
00:22:05
No, aux igual a new object con la longitud de lista más uno.
00:22:06
Así.
00:22:23
¿Qué es lo que más has dicho tú?
00:22:24
¿Dónde?
00:22:27
En lugar de los cuarenta y uno.
00:22:28
¿En lugar de lo falso?
00:22:30
¿Cómo?
00:22:40
¿Así?
00:22:44
Pregunto.
00:22:48
¿En serio, a febrero
00:22:50
vosotros no sabéis
00:22:52
todavía crear un array?
00:22:54
¿Cómo lo hago?
00:22:56
lo que hemos hecho 7000 veces me creo un array más grande
00:23:00
que el array anterior, ¿sí?
00:23:38
Es que es más curva que lista copia, ¿vale?
00:23:45
Además, no es una lista copia.
00:23:50
Es una copia, pero no es esto, entonces...
00:23:52
Vale, ¿y qué hago ahora?
00:23:55
Forinti es igual a cero y menor que lista.length y más más.
00:24:08
Esto lo hemos hecho 7000 veces.
00:24:15
Me encanta que me contesten dos personas.
00:24:18
Nuevo de i es igual a lista de i.
00:24:22
Cuando estoy aquí, ¿qué he hecho?
00:24:29
¿Qué tengo cuando estoy aquí?
00:24:33
Ahora estoy en este punto.
00:24:34
¿Qué tengo?
00:24:35
¿Cuántos objetos tengo?
00:24:39
Que están igual, ¿no?
00:24:45
¿Qué tengo?
00:24:46
¿Qué elementos?
00:24:51
¿Qué tengo cuando llego aquí?
00:24:53
Tienes dos elementos de lista dentro de...
00:24:57
Sí.
00:25:00
En este caso nada.
00:25:00
en este caso no lo sabemos
00:25:01
si fuera vacío
00:25:05
sí, pero si lo estoy llamando
00:25:07
la quinta vez, pues ya hay 5
00:25:08
no lo sé, es genérico
00:25:10
yo aquí tengo dos objetos
00:25:12
tengo lista
00:25:15
que es un array de n posiciones con n
00:25:16
objetos dentro
00:25:18
y luego tengo nuevo
00:25:19
que es un array de n más 1
00:25:22
posiciones con
00:25:25
n objetos dentro
00:25:26
que son los mismos de
00:25:28
lista. ¿Era claro?
00:25:30
Esto lo hemos visto
00:25:34
al menos cuatro o cinco veces.
00:25:34
Hemos hecho gestión
00:25:37
array que hace literalmente esta
00:25:38
cosa aquí.
00:25:40
La clase gestión array que hemos visto
00:25:43
tres o cuatro veces, pues hemos siempre
00:25:44
hecho esto.
00:25:46
¿Qué hago ahora?
00:25:48
Nueve.
00:25:50
Nueve.
00:25:52
Ocho.
00:25:54
Vista.
00:25:56
Igual.
00:25:58
He añadido el elemento que me han dicho para añadir al final de nuevo.
00:26:03
Contaos que en lista, lista.length, me daría array index out of bounds,
00:26:14
porque en un array de 5 posiciones, la posición 5 no está, es de 0 a 4,
00:26:22
pero en nuevo, que es un poquito más grande, sí está, y es la última posición.
00:26:29
Esto habría podido ponerlo como nuevo. .length-1. Mismo número.
00:26:35
¿Eh?
00:26:44
No, que me está poniendo el nuevo mal.
00:26:46
Sí. A lo mejor lo has declarado dentro de tu bloque.
00:26:48
¿Y ahora qué hago?
00:26:55
Ya está. Ya he implementado mi add.
00:26:59
Esto lo he escrito ahora
00:27:06
Y no lo volveré a escribir en mi vida
00:27:09
Porque a partir de ahora
00:27:12
Cuando uso mi array lista
00:27:14
Mi lista array o como se llame
00:27:16
Lo que hago es
00:27:18
Usar add
00:27:19
Para añadir algo
00:27:21
No tengo que pillar el array, extenderlo, ponerlo
00:27:22
Porque lo hace el debajo escondido
00:27:25
Sin que yo lo vea
00:27:28
Claro, esto es lo mismo
00:27:33
Porque os he dicho
00:27:37
Lo podíais haber hecho
00:27:38
Claro, esta cosa de aquí la podríais haber hecho tranquilamente.
00:27:40
De hecho, la hemos hecho.
00:27:44
La hemos hecho como estática, pero nosotros la podríamos hacer como un objeto.
00:27:48
Aquí dentro tengo mi array y este objeto me esconde el array.
00:27:53
De hecho, este array podría ser private.
00:27:57
Porque yo desde fuera ni me puedo enterar que existe.
00:28:01
Y yo trabajo con los métodos estos de aquí.
00:28:05
añade, remueve, y lo hace él por debajo. Él hace el trabajo. ¿Vale? Muy bien. Sizer sigue funcionando.
00:28:08
Podemos hacer esto, que es fácil. Object.getInt.y. ¿Qué hace esto? ¿Cómo lo implemento? Tiene que
00:28:19
devolver el elemento en posición y de mi lista.
00:28:31
Esto, si tú intentas acceder a algo que no existe, pues explotará una excepción. Si tú aquí le pones
00:28:34
100.000 y tienes solo tres objetos, pues él te dirá una null pointer exception, una array index
00:28:52
out of bound exception, que se causará a la hora de intentar acceder a la posición 100 de la array
00:28:58
Y este de aquí, cuando tienes dentro solo tres posiciones.
00:29:06
Pero si la usas bien, funciona.
00:29:11
¿Vale?
00:29:14
Si quieres evitar que explote, lo que podemos hacer es lo siguiente.
00:29:14
Object.
00:29:25
Object.
00:29:29
Es igual a null.
00:29:31
¿Vale?
00:29:34
Try object es igual a esto.
00:29:35
cart.exception o esto sería un array index out of bound exception. Creo que no me parece absolutamente nada.
00:29:44
Entonces, esta cosa de aquí me dice que, oye, mira, el objeto es nul. Intenta ponerle el elemento i de la lista.
00:30:09
Si lo consigues
00:30:43
Perfecto, ahora object es ese elemento
00:30:45
Y lo devuelves
00:30:47
Si no lo consigues
00:30:48
Esto daría un error
00:30:51
Y bloquearía el programa
00:30:52
Yo no quiero que tú bloquees el programa
00:30:54
Pero que tú te recuperes
00:30:56
No hagas nada
00:30:58
Y ahí llegues aquí
00:30:59
Y lo que hace es devolverme object con dentro
00:31:00
Y un null
00:31:03
Porque si aquí explota
00:31:08
Y no ejecuta esta cosa de aquí
00:31:13
pues aquí no hace nada
00:31:14
llega al object y el object dentro
00:31:17
tenía null, entonces
00:31:19
este método de aquí me devuelve
00:31:21
el objeto si el objeto
00:31:23
está en posición y si en vez
00:31:25
he pedido una posición que no es
00:31:27
me devolverá null
00:31:29
y luego cuando uso get puedo
00:31:30
decir, pilla get
00:31:35
este elemento aquí, si este elemento que has
00:31:37
pillado es null, pues entonces
00:31:39
el usuario no existe esta posición
00:31:41
y si no, haz lo que tienes que hacer
00:31:43
dudas hasta aquí
00:31:45
y así estamos repasando
00:31:49
también el 3G
00:31:52
y podría meter
00:31:53
un mensaje error
00:31:56
system.er
00:31:57
.println
00:31:59
acceso
00:32:02
a
00:32:06
índice no
00:32:09
válido
00:32:11
claro es que lo escribo en er
00:32:13
no en out
00:32:16
para que el usuario no se da cuenta, pero yo escribo en un log que alguien ha intentado acceder a una, ¿vale?
00:32:18
Y a lo mejor le puedo poner mase.getMessage, que es la descripción de esta explosión de acto.
00:32:25
Luego este de aquí lo puedo redireccionar en un fichero de log, entonces todos estos intentos de hacer una get que no funciona
00:32:43
me lo escribirá en un fichero y yo como administrador puedo ir al fichero y ver qué ha pasado, cuántos
00:32:50
usuarios han intentado acceder a elementos que no existen. Si me interesa, si no, no.
00:32:55
Dudas hasta aquí. ¿Vale? Entonces sabemos GETTARE y sabemos ABDARE. Pues ya está, estamos
00:33:04
listos para probar. new class main. Tengo la clase main, pongo el chrome main y lo que hace este señor es decir
00:33:11
antes tenía que hacer todo con arrays, pues ahora no. Ahora lo que digo es miListArray.
00:33:28
mlat es igual al new miListaArr. Y ahora para añadir algo en esta lista mlat.add. Por ejemplo,
00:33:35
gato. Esto estoy añadiendo un string. Un string es un object. Lo puedo añadir. Y luego puedo
00:33:55
hacer mla.get , y esto por ejemplo guardarlo en un string, voilà, sí, eso. ¿Por qué esto?
00:34:05
¿Por qué esto se enfada? Entonces, ¿por qué se enfada?
00:34:30
porque mla.get
00:34:48
devuelve un object
00:34:55
devuelve un object
00:34:57
yo puedo poner un string
00:35:03
dentro de un object
00:35:07
pero no un object dentro de un string
00:35:08
porque string es un object
00:35:09
pero object no es un string
00:35:12
entonces
00:35:13
necesito hacer un
00:35:15
casting explícito
00:35:18
lo que yo lo estoy haciendo porque lo sé vale porque me tiene una una string aquí en realidad
00:35:19
esta cosa aquí es muy peligrosa porque aquí dentro puedo poner de todo mezclando de todo
00:35:28
todo el cuidado como lo usáis para forzarlo aquí aquí dentro hay sólo string que tengo
00:35:32
que hacer esa cosa de los tipos genéricos que por ahora no estoy aquí
00:35:37
Si esto funciona, ahora funciona. Puedes escribir también, si hizo, la.cd. La creo. Escribo
00:35:40
su tamaño, luego añado gato, escribo su tamaño otra vez, y luego busco un objeto y lo imprimo.
00:36:05
¿Qué me tiene que imprimir? ¿Aquí qué me imprime? ¡Hola! ¡Cero! ¿Aquí qué me imprime? ¡Uno!
00:36:13
¿Y aquí qué me imprime? Gato. Si todo funciona, aquí me imprime cero, aquí me imprime uno,
00:36:28
aquí me imprime gato. Señores, ¿lo veis? ¿Lo entendéis? Aquí no es cuestión de desarrollar
00:36:45
código, es de entender el código que he escrito yo. Si no me estáis siguiendo en lo que escribo
00:36:52
pues tenemos un problema más serio de que no sabáis escribir código. Me pareceis dormidos hoy.
00:36:58
Cero. ¿Por qué? Porque cuando exprime esto de aquí, va a MLA6, que es esta cosa de aquí,
00:37:09
devuelve la longitud de la array, por ahora la array está vacío, cero. ¿Vale? Aquí, cero. Ahora
00:37:19
llamo añade gato por lo tanto se va aquí y lo que hace es añadir gato se crea un array nuevo grande
00:37:28
1 porque 0 más 1 es 1 recorre el antiguo que era vacío por lo tanto no lo recorre vale y en la
00:37:36
posición primera la posición 0 pues añade el elemento que le ha pasado que era este string
00:37:45
gato vale y luego hace que mi lista es igual al nuevo entonces borra la lista que tenía nueva y
00:37:50
vieja y se queda con la nueva. Por lo tanto, cuando ahora le pido el tamaño tienes, estoy
00:37:57
apuntando, o sea, lista apuntará al rey nuevo, entonces tiene tamaño 1, porque tiene una posición,
00:38:05
por lo tanto me escribe este 1. Después me voy aquí y le digo, me vas a pillar en mi lista el
00:38:11
el señor get, vale, perdón, el señor 0, es la única posición que tiene, posición 0, me
00:38:20
pillará este objeto que había añadido allí, que es un string, por lo tanto, si yo lo tengo así,
00:38:27
podría hacer una jugada así, mira, así, pillo este objeto, este objeto es un object, te lo pone aquí,
00:38:33
y ahora te dice, escríbemelo por favor. ¿Qué me va a escribir ahora? Gato, ¿por qué? ¿Por qué
00:38:42
Ese es un object, me escribe Gato, una palabra. Me encanta cuando estudiáis. Tenéis meses
00:38:56
antes del próximo examen, entonces es bien que esperéis un poquito más antes de empezar
00:39:11
a estudiar. ¿Por qué me escribe Gato? Y siendo ese un object, no me debería escribir
00:39:16
object, arroba
00:39:32
y un número raro.
00:39:34
No, le he quitado el casting
00:39:37
mientras dormías.
00:39:38
En una palabra.
00:39:45
Polimorfismo.
00:39:51
Polimorfismo, mi palabra favorita.
00:39:51
La vuestra, la palabra del mes.
00:39:53
Ya era de enero.
00:39:55
Muy bien.
00:39:56
Por polimorfismo, porque él va a
00:39:59
utilizar el toString
00:40:01
No de la referencia
00:40:03
Va a utilizar el toString
00:40:05
Propio de la instancia
00:40:07
Y esto es un string
00:40:09
Por lo tanto utilizará el toString de string
00:40:11
Y por lo tanto me lo escribe bonito
00:40:13
Enhorabuena
00:40:15
Enhorabuena
00:40:20
Vamos, sigamos adelante
00:40:24
Entonces, funciona
00:40:25
Es más, yo puedo añadir otro objeto
00:40:27
La.add
00:40:29
voy, uso string porque es fácil de verlas, ¿vale?
00:40:32
En realidad podría añadir lo que me da la gana,
00:40:37
pero eso a lo mejor provoca daño, ¿vale?
00:40:40
Y pongo perro, ¿vale?
00:40:42
Entonces ahora yo puedo leer gato otra vez,
00:40:44
o puedo leer perro,
00:40:49
o puedo equivocarme.
00:40:50
¿Qué escribe esto?
00:40:54
Bueno, espérate, espérate.
00:40:58
Hagámoslo así.
00:41:03
Me he equivocado.
00:41:05
Si me lo escribe directamente, ¿vale?
00:41:06
Entonces puedo escribir cero, puedo escribir uno, puedo escribir dos, tres.
00:41:16
¿Qué pone esto? Esta cosa aquí, ¿qué me escribe?
00:41:22
Gato.
00:41:32
Gato. ¿Esto qué me escribe?
00:41:34
Perro.
00:41:37
Perro. ¿Y esto que me escribe?
00:41:39
Antes me escribía también nulo.
00:41:52
Pero me escribe
00:41:55
¿en qué color?
00:41:55
Rojo.
00:41:58
Que oye, ha habido un error. Vamos a ver si es verdad.
00:41:59
Dale.
00:42:02
Mira, este es el primer gato.
00:42:06
Esta es la parte nueva. Gato
00:42:08
es la respuesta de esto. Perro
00:42:10
en la respuesta de este de aquí.
00:42:12
Null en la respuesta de esto, porque
00:42:13
este señor ha llevado el B null, ¿vale?
00:42:15
Pero me escribe en
00:42:18
error
00:42:19
que aceso, no, no escribe
00:42:20
como llueve, más que aceso
00:42:23
a índice no válido,
00:42:25
index 2, out of bound of length 2.
00:42:27
¿Vale?
00:42:31
Este de aquí es el
00:42:31
mensaje que había escrito yo, y esto
00:42:33
era el e.getMessage.
00:42:35
¿Os acordáis?
00:42:39
Escribe error,
00:42:42
ojo, porque no lo está escribiendo en el mismo
00:42:43
canal. Lo está escribiendo en dos canales
00:42:45
distintos.
00:42:47
Este de aquí es el system.out,
00:42:49
este de aquí es el system.er.
00:42:51
¿Vale?
00:42:54
Y luego, normalmente van a la
00:42:55
consola los dos, pero
00:42:57
podría hacerlos ir
00:42:58
a sitios distintos.
00:43:01
Por ejemplo, a ficheros distintos.
00:43:03
¡Dudas!
00:43:06
O sea, mi sistema funciona.
00:43:08
Fijaos, ahora
00:43:09
lo que antes hacía
00:43:10
y yo pongo, pilla la rey,
00:43:12
exténdelo, cópialo todo,
00:43:15
ahora pon uno más.
00:43:17
Lo estoy haciendo así.
00:43:18
Porque lo estoy haciendo,
00:43:20
pero lo hace él por dentro.
00:43:24
Lo hace él aquí.
00:43:27
Y yo esto lo he implementado
00:43:29
una vez y a partir de ahora
00:43:30
solo uso esta cosa aquí y él me añade
00:43:32
cosas, dudas,
00:43:34
preguntas.
00:43:39
Vale.
00:43:47
Sigamos
00:43:48
implementando mi lista
00:43:48
array. ¿Vale? Con los otros
00:43:50
métodos que tengo que implementar.
00:43:52
Me queda para hacer el remove,
00:43:54
me queda para hacer el busca,
00:43:56
me queda para hacer el show.
00:43:58
¿Cuál queréis hacer?
00:44:05
Buscar.
00:44:10
Entonces, ¿busca qué tiene que hacer?
00:44:12
Tiene que recorrer
00:44:14
mi array, encontrar
00:44:16
cuando este
00:44:18
elemento es igual al otro.
00:44:20
¿Vale? Y cuando encuentra
00:44:22
que es igual al otro, pues me devuelve
00:44:24
la posición en la que está.
00:44:26
Si no lo encuentra, me devuelve menos uno.
00:44:28
Entonces,
00:44:31
interposición es igual a menos uno.
00:44:32
Y devuelvo posición.
00:44:37
Ya. Si no lo encuentro,
00:44:40
esto es lo que tiene que hacer.
00:44:42
Si lo encuentro, vamos a ver cómo recorre
00:44:43
una raíz.
00:44:45
Muy bien.
00:44:50
Int i es igual a
00:44:52
cero i menor
00:44:53
Porque lista.langueter y más más.
00:44:55
¿Qué hago?
00:45:03
Sí.
00:45:05
Lengueter, adverso.
00:45:06
Sí.
00:45:09
Element de i.
00:45:14
Element de i.
00:45:16
Lista de i.
00:45:20
Lista de i.
00:45:22
Lista de i.
00:45:23
Punto.
00:45:25
Equals.
00:45:26
Que.
00:45:29
ELEMENT
00:45:29
Y
00:45:33
Y
00:45:46
Y
00:45:46
Pregunta
00:46:02
¿Mejor esto
00:46:04
o mejor esto?
00:46:06
Hola, buenos días.
00:46:12
En el de arriba no estaría gustando realmente el elemento de la lista,
00:46:34
pero estaría gustando en otra lista, ¿no?
00:46:40
No, exactamente lo mismo.
00:46:42
En el de arriba sería, comparas el elemento que te deja algo constante
00:46:45
con una lista que va a cambiar de posición.
00:46:50
Entonces, ¿cuál es mejor?
00:46:53
Hay diferencia.
00:46:56
En uno yo tengo mi lista y digo, esto es igual a esto, no, esto es igual a esto, no, esto es igual a esto, y sigo.
00:46:56
En el otro tengo mi lista y el objeto y digo, esto es igual a esto, no, esto es igual a esto.
00:47:06
Hace lo mismo.
00:47:12
¿Qué diferencia hay? No, hay...
00:47:15
Está escrito distinto.
00:47:24
Entonces, ¿qué implica?
00:47:26
Hay diferencias sobre el punto donde puede saltar una Null Pointer Exception.
00:47:30
Si yo lo hago así, esto me da Null Pointer Exception si esto es Null.
00:47:41
Si yo te he hecho busca y entre paréntesis te he puesto un objeto Null, te saltaría una Null Pointer Exception.
00:47:49
esto te saltaría
00:47:56
en un point of exception
00:47:59
si dentro de lista
00:48:01
tú en algún momento
00:48:04
has hecho una add de null
00:48:05
entonces has añadido un objeto nuevo
00:48:08
que es null
00:48:11
¿entendéis la diferencia?
00:48:12
entonces, para evitar eso
00:48:17
tengo varias opciones
00:48:20
podría comprobar
00:48:21
cuando busco
00:48:24
que el elemento no sea nul.
00:48:26
O sea, que esto lo hago
00:48:30
solo si el elemento no es nul.
00:48:31
Si es nul, no lo busco.
00:48:33
Podría hacer que cuando añado un elemento,
00:48:34
solo lo añado
00:48:37
si el elemento que me han dado no es nul.
00:48:38
Esto me garantizaría
00:48:41
que todos los elementos de la lista
00:48:43
no son nul.
00:48:45
Y entonces podría utilizar
00:48:47
¿cuál de los dos?
00:48:48
Seguramente.
00:48:51
Si no hay nulos en mi lista,
00:48:53
¿cuántos tengo aquí?
00:48:55
Si yo garantizo que no puede haber null en la lista, esto es seguro, porque estoy llamando
00:48:57
equals sobre un objeto que nunca será null, entonces me funciona así, me da igual que
00:49:07
esto sea null, esto es null dirá, no son iguales, un objeto real con un null pues no
00:49:13
son iguales, pero el objeto sobre el que lo estoy llamando es éste, entonces es éste
00:49:18
que manda si es null pointer o no. Lo podemos hacer. Otra opción es meter todo esto en un
00:49:24
triketch y si explota le digo muy bien, pues entonces no son iguales. No la he encontrado.
00:49:33
A ver, opciones. Opción número A. Meto así y puedo o comprobar aquí, hace esto. Esta es una primera opción.
00:49:53
Compruebo que si no es null, pues entonces lo puedo utilizar y lo compruebo en toda la lista.
00:50:14
Otra opción. Las pongo todas. Esto lo aumento y hago la opción número dos.
00:50:18
Opción número dos. No compruebo, mas digo prueba. Si explotas, quiere decir que cuando has hecho esta cosa aquí has explotado.
00:50:38
Entonces, Capture Null Pointer Exception x pos es igual a menú.
00:50:51
Si me devuelve menos uno, es que ha podido buscarlo, pero no lo ha encontrado.
00:51:14
Si me devuelve menos dos, quiere decir que ha habido un error al buscar.
00:51:21
¿Entiende?
00:51:32
Esta cosa aquí me devuelve la posición del objeto buscado.
00:51:35
Si lo encuentra me devolverá 3
00:51:38
Está en posición 3
00:51:41
Fenomenal, lo ha encontrado
00:51:42
Si me devuelve menos 1 quiere decir que todo esto ha ido bien
00:51:44
Nunca ha saltado una excepción
00:51:47
Pero no lo ha encontrado
00:51:49
Al no encontrarlo se ha quedado menos 1
00:51:52
Si al entrar aquí
00:51:54
Por ejemplo, el elemento era nul
00:51:56
Por lo tanto, hacer esto ha hecho un nul pointer exception
00:51:58
Pues entonces entrará aquí dentro
00:52:01
Pondrá en posición menos 2
00:52:03
En vez de menos 1
00:52:06
Y me lo devuelve
00:52:07
Entonces yo desde fuera, cuando llamo busca, puedo hacer un switch diciendo que si es menos uno, no existe, si es menos dos, ha habido un error, y en cualquier otro caso, está en esta posición.
00:52:08
¿Entienden?
00:52:26
¿Cultan?
00:52:28
Esta es una segunda opción.
00:52:33
Tercera opción.
00:52:37
la tercera opción sería
00:52:38
en vez de utilizar esto
00:52:40
cambiar
00:52:42
lista de i con element
00:52:43
cambiarlos, pero entonces
00:52:46
para que funcione debería
00:52:48
hacer un cambio en el add
00:52:50
debería poner que aquí
00:52:52
no me pueda poner elementos
00:52:54
vacíos, entonces
00:52:56
esta cosa de aquí la hace
00:52:58
solo si
00:53:01
element
00:53:03
es not null
00:53:04
Pero has dicho, añade un elemento. Si es null, no te lo añado. Si no es null, pues lo añado.
00:53:05
Fijaos que el elemento aquí dentro no lo uso, entonces aquí usar el try-catch no serviría de
00:53:19
nada. Este código de aquí no lanza nunca una null pointer exception. No hago nunca element punto
00:53:33
algo. Por lo tanto, hasta si es null, él funciona. Entonces, en este caso, necesito
00:53:41
hacerlo así. Podría, pero si yo me he cerciorado que en la lista aquí no puede haber elementos
00:53:49
null, entonces es inútil que lo compruebe. Entonces, lo que haría es, el tercer tipo,
00:54:04
que está aquí. ¿Dónde está? ¿Dónde está? ¿Dónde está? ¿Dónde está? ¿Dónde está? ¿Dónde está?
00:54:11
Me he borrado.
00:54:15
Oh, esto me la...
00:54:17
Va.
00:54:19
El tercer
00:54:21
ejemplo que podría poner aquí...
00:54:23
Esto es sobre RAI.
00:54:25
Va.
00:54:29
El tercer ejemplo, que lo llamaré
00:54:36
búscalos, ¿vale?
00:54:38
En vez de utilizar esto,
00:54:40
utilizo esto.
00:54:42
Y como sé que esto no puede ser
00:54:50
Nunca. No me hace falta comprobar que salte una null pointer exception.
00:54:52
Este código de aquí nunca lanzará una null pointer exception.
00:54:59
Porque yo me he cerciorado que aquí dentro sólo hay objetos no null y además esto es privado,
00:55:04
entonces nadie puede haber entrado allí y haberme metido null saltándose el add.
00:55:11
¿Dudas? Entonces, aquí tenemos tres opciones.
00:55:18
una dos y tres me quedo con esta vale estar aquí existe busca 22 pero no es parte de la
00:55:33
lista es un método nuevo que me he creado vale entonces qué más hago esto ya puede
00:55:42
buscar vamos a ver si la búsqueda funciona vale entonces aquí yo puedo hacer si eso
00:55:57
punto busca de gato. Me debería devolver cero. Si busco perro, me debería devolver uno. Si busco
00:56:04
bocorrilo, me debería devolver menos uno. Busco gato, no. Busco perro. Fijaos que este señor a veces
00:56:39
aparece antes, a veces aparece
00:57:03
después. Porque estoy escribiendo
00:57:05
en la console, pero con dos
00:57:07
mecanismos de escritura distintos.
00:57:09
Entonces a veces llega antes, a veces llega
00:57:12
después.
00:57:13
Mientras todo lo que escribo en system.out
00:57:19
llegará ordenado,
00:57:21
lo que escribo en out y en air
00:57:23
pueden que se solapen. Son dos mecanismos distintos.
00:57:24
A quien se ejecute antes
00:57:27
es el que escribe antes.
00:57:29
Forma loquito
00:57:31
para no molestar.
00:57:32
¿Sí?
00:57:35
Ahí.
00:57:36
Funciona perfectamente. Podría buscarlo con busca dos y funcionaría igual.
00:57:37
Ahí.
00:57:44
¿Dudas?
00:57:51
Estos métodos que están decidiendo para las colecciones, ¿ya vienen decididos o los están creando otra vez para ir explicando lo que hacen las colecciones?
00:57:54
¿Dónde estabas al principio de la clase?
00:58:03
En casa lo vi.
00:58:06
Esto se ha grabado, ¿eh?
00:58:08
Se lo harán en contra de ti.
00:58:10
Mira,
00:58:13
me he creado una interfaz lista yo
00:58:14
proponiendo
00:58:17
cuáles son los mecanismos,
00:58:18
los métodos más comunes
00:58:20
para gestionar
00:58:23
lo que hacemos con los arrays,
00:58:25
de añadir algo en un array, quitar algo en un array,
00:58:26
saber el tamaño del array,
00:58:29
buscar algo dentro del array.
00:58:31
Estos son los métodos básicos.
00:58:33
Y con esto me he creado
00:58:36
una interfaz lista. Luego me he creado una clase mía que implementa lista y hemos decidido
00:58:36
implementar estos métodos usando por debajo un Array. En este caso de objetos.
00:58:44
Entonces, hemos implementado luego el add, que es igual a añadir un elemento a un Array.
00:58:56
Hemos implementado el size, que me devuelve el tamaño del array.
00:59:06
Hemos implementado el busca, que me busca este objeto.
00:59:10
Hemos implementado el get, que me pilla el objeto en posición y del array.
00:59:14
Me queda para enfrentarlos.
00:59:19
Una cosa que quiero que os fijéis, aquí estoy utilizando Equals, que Equals se utiliza
00:59:22
de object, entonces esto debería dar false. Esto no debería funcionar.
00:59:37
Estoy utilizando el equals, pero si la clase que estoy utilizando tiene una sobrescritura
00:59:44
del equals, como es el caso de la string, no voy a utilizar el de object, que es su
00:59:53
referencia, voy a utilizar el de la instancia, que es una string, por lo tanto él me está
00:59:59
utilizando el equals entre strings y por eso no porque aquí son objetos que el
01:00:04
ecuador y que no recase no es de la clase objeto entonces no lo puede
01:00:19
utilizar no lo reconoce debería da un castellano a string o para poder
01:00:26
dudas sigamos adelante vamos show que es más fácil como me tiene que escribir una representación de
01:00:30
esta red fácil ahí yo lista uso mi clase arrays.toString para hacer una representación de eso
01:00:48
que hace reír a alguno de vosotros, y a este punto lo devuelvo. Así que ahora puedo hacer
01:01:07
siso la.show. Ahí lo tenemos. Vale. Entonces vamos ahora a utilizar el remove. Pues para el
01:01:20
El remove tengo dos señores, tengo el removeElement y tengo el removePositions, empezamos por
01:01:45
esto por obvias razones, entonces lo que tengo que hacer es, me han dicho quita la posición
01:01:55
3, por lo tanto lo que tengo que hacer yo es recorrer el array, copiarlo directamente
01:02:02
hasta la posición.
01:02:11
Luego saltarme
01:02:14
esta posición y empezar a copiar
01:02:16
en diagonal. Esto también lo hemos
01:02:18
hecho varias veces.
01:02:20
Entonces
01:02:22
object
01:02:22
nuevo
01:02:25
es igual a new
01:02:28
object un poquito
01:02:30
más pequeño de lista.
01:02:32
Justo.
01:02:37
Y ahora for int y es
01:02:39
igual a cero y menor
01:02:41
que posición
01:02:42
y más más
01:02:44
desde cero hasta posición
01:02:46
copio directamente
01:02:49
nuevo de y
01:02:51
es igual a lista de y
01:02:53
ahora he llegado a posición
01:02:56
posición me la tengo que saltar
01:03:03
en lista
01:03:05
pero no en nuevo
01:03:08
entonces empiezo otra vez
01:03:09
for int y es igual a
01:03:11
posición
01:03:14
más uno
01:03:17
y menor que lista.length
01:03:18
y más más
01:03:23
desde posición más uno
01:03:25
la siguiente a la que no quería copiar
01:03:29
hasta el fondo
01:03:31
lo que hago es copiar de nuevo
01:03:31
de y menos uno
01:03:34
lo que hay en lista
01:03:36
de y
01:03:40
ahora estoy copiando en diagonal
01:03:43
al final
01:03:45
lista es igual a nueve
01:03:52
y voilà
01:03:59
eliminado la posición. A ver si funciona. MLA.remove 0. No, quito el perro. Perro. Se hizo MLA.shock.
01:03:59
Ya está. Me ha quitado el perro. Ahora, esto ya lo hemos visto mil veces. Lo hemos hecho varias veces esta
01:04:28
Menos que el add, o sea, menos que añadir a un array, pero sí que lo hemos visto al menos tres o cuatro veces.
01:04:49
Esto, ¿cómo lo hago? Una línea. ¿Qué hace esto? Pues busca element, me busca la posición del elemento que quiero borrar.
01:04:57
Entonces me devuelve tres. Y a este punto le digo, remueve tres usando este método.
01:05:40
no me pongo a reescribir todo el código otra vez que si luego lo tengo que
01:05:51
mejorar lo tengo en seis sitios distintos reutilizó lo que ya tengo
01:05:56
ahora esto me expone algunos problemas que yo puedo hacer qué pasa si le pongo
01:06:00
remove de menos uno de posición menos uno o de más o menos dos o menos cinco o
01:06:10
27
01:06:17
Hago el remove de la posición sólo si esa posición es válida.
01:06:20
Entonces si este de aquí cuando luego lo busca no lo encuentra me dará menos uno
01:06:48
entonces no lo remueve y si este de aquí cuando lo encuentra hace un error y me da
01:06:56
porque le he pasado aquí nul entonces explota y me dará menos dos tampoco lo remueve.
01:07:01
Pero no explota ni nada. Y ya está, tenemos implementada nuestra
01:07:08
lista utilizando Arrays. Por debajo estoy manejando Arrays, pero sustancialmente por
01:07:27
fuera yo aquí de Arrays no he visto nada. Y aquí ya puedo utilizar mis objetos añadiendo cosas,
01:07:41
quitando cosas, haciendo cosas raras, y de array ya no tengo ni la remota idea. Lo he hecho una vez,
01:07:49
me lo he aprendido, estoy listo, y ahora, a partir de ahora, simplemente importo mi lista array en
01:08:03
mis nuevos proyectos y puedo olvidarme de la gestión de los arreos. Y repito, esto habríais
01:08:13
podido hacerlo ya desde varias semanas. ¿Eso es lo que se le llamaría una librería?
01:08:19
La librería es más bien una colección de clases estáticas o no estáticas relacionadas con
01:08:31
con unos varios temas concretos, pero una sola cosa así no.
01:08:42
Ahora, si tú tuvieras la implementación de una lista, la implementación de una cola,
01:08:48
la implementación de una stack, la implementación de un árbol, la implementación de...
01:08:53
y todos en un mismo paquete, pues eso podría ser una library.
01:08:58
¿Dudas?
01:09:01
¿Podría repetir otra vez lo que has dicho en el método remove? O sea, le pasas...
01:09:10
Yo de removeTheElement lo que tiene que hacer es remover el primero. Nosotros lo hemos definido como removeElPrimero, ¿vale?
01:09:17
Y yo tengo ya un método que es buscaElement, este, que lo que hace es te doy un elemento, te doy un objeto y me devuelve su...
01:09:27
El primer objeto que tú me has pasado me devuelve su posición. Podría haber varios, yo podría poner tres gatos.
01:09:37
pero tú me devuelves la posición del primero, así que lo hemos definido aquí.
01:09:45
Cuando lo hemos definido, devuelve la posición del primer objeto, igual a element, ¿vale?
01:09:50
Entonces, como yo ya tengo este método, si yo a este método hago busca de un element,
01:09:57
me da la posición de ser, ¿vale? Entonces, con esta cosa de aquí,
01:10:02
yo voy a recibir a cambio un int, que es positivo si lo ha encontrado o negativo si no lo ha encontrado.
01:10:08
Y yo esto se lo paso como parámetro a remove, a este remove, porque este es remove de object y este es remove de int.
01:10:22
Entonces él me va a comprobar y me dice si es una posición válida, entonces si me has pasado menos uno no hará nada, no remove nada.
01:10:32
Pues si es una posición entre cero y el tamaño del array, pues entonces hazme todo el trabajo para quitarme esa posición.
01:10:38
Primero en dos pasos, int posición remove es igual a busca.lm.
01:10:48
Y aquí, si os queda más claro.
01:11:06
con esto paso de aquí
01:11:14
busco en qué posición
01:11:17
está el elemento para quitarla
01:11:18
y luego le digo, usa este otro
01:11:21
método para quitar el otro
01:11:23
eso también os
01:11:24
dice una cosa, que es cuando
01:11:28
tenéis que implementar varios métodos
01:11:30
o varias versiones del mismo método
01:11:33
cuidado con el orden con lo que implementáis
01:11:34
porque si empezáis de aquí
01:11:37
hacéis una
01:11:38
parrafada de código, que luego tenéis
01:11:40
que recopiar aquí
01:11:42
porque removeObject
01:11:43
puede usar removeInt
01:11:47
pero removeInt no usa removeObject
01:11:50
entonces allí tenéis que tener un poquito
01:11:53
de por qué yo he implementado antes
01:11:58
busca, si tú vas en orden
01:12:00
pues aquí habrías implementado el busca
01:12:03
habrías implementado el remove de la posición
01:12:06
y ahora deberías reescribirlo otra vez, como mínimo copiarlo
01:12:09
si tienes un puesto de espera
01:12:13
pero como lo he hecho yo
01:12:14
pues los he dividido y he escrito el código solo una vez
01:12:16
y aquí he reutilizado el código
01:12:19
entonces el remove the object me sale
01:12:20
como una línea de código súper fácil
01:12:23
además así se me ha quedado más
01:12:25
divide tímpera porque esto remueve
01:12:34
el otro busca, son dos ejercicios
01:12:36
distintos más sencillitos
01:12:38
esto al fin y al cabo lo que hace es
01:12:39
busca y remueve, busco este
01:12:42
objeto y luego lo remuevo. Entonces son dos pasos que yo podría, hasta si sólo tuviera este método
01:12:44
de aquí sin este y sin el busca, pues yo me habría hecho dos métodos auxiliares, uno para buscar y
01:12:52
uno para remover una posición, ¿eh? Dudas. Vale. Ahora. Control-C, control-U. MyLista,
01:12:58
miLista. Esta es mi lista con objetos, ¿vale? Utiliza object, etcétera, etcétera. Ahora,
01:13:22
Lo que no me gusta de object es que yo aquí he puesto, he quedado con mi lista y he empezado
01:13:35
a poner cosas, lo comento, ahora tengo vacía, vale, puedo hacer MLA es igual, no, punto
01:13:46
Vale, perfecto, he añadido gato, pero puedo hacer mla.addNewScanner, sin problema, porque
01:13:55
aquí se añaden objetos.
01:14:20
Ahora esto me puede dar problemas cuando yo digo oye me buscas perro, ah no, porque habrá
01:14:23
hecho un ahora habrá utilizado yo vamos a ver por qué entonces nosotros tenemos por aquí el
01:14:45
busca el busca lo que hace es utilizar elementos entonces ha utilizado el de string pero si no son
01:15:00
la misma cosa no está comparando que no son el mismo a la misma clase de la primera línea si
01:15:11
Si vosotros hacéis aquí un toString, un equals,
01:15:18
search, crea un equals, que está aquí,
01:15:25
veis, la primera cosa que busca es si son de la misma clase.
01:15:33
O sea, una de las primeras cosas que busca es si son de clases distintas.
01:15:37
Pues si son de clases distintas, pues no son iguales, son distintos.
01:15:40
esto me salva de que estoy comparando un escáner y un string
01:15:46
y no explota. Son clases distintas, son distintos, ya está, sigo adelante.
01:15:54
Aún así puede ser feucho, puede ser feo, entre comillas, el gestionar
01:15:59
un array que tenga dentro de todo. Una lista, una lista de objetos, de todo.
01:16:10
entonces la cosa interesante podría ser intentar evitar que sean de cualquier
01:16:18
cosa vale entonces tengo esta esta nueva versión de la lista
01:16:26
y son estas de que son copias la copiado donde vamos a intentar ver oye mira más
01:16:31
no puedo yo de alguna forma decirle oye mira no quiero objetos
01:16:36
quiero un tipo
01:16:41
Pero no quiero decir, oye, mira, esto tiene que ser string.
01:16:45
Entonces ahora esto me funciona, pero no me funciona solo para string.
01:16:50
Si ahora quiero hacerlo para coches, pues tengo que cambiar esto a coches.
01:16:53
Quiero lo que sea, un tipo genérico.
01:16:58
Esto me está diciendo, oye, cuando tú implementas la interfaz lista,
01:17:06
dime para qué lo implementas.
01:17:10
Si lo implementas para string, pues esto será string,
01:17:15
esto será string, esto será string.
01:17:18
Si tú lo implementas para coches, pues entonces esto será coche, coche, coche. Si lo implementas para gatos,
01:17:21
pues esto será gato, gato, gato y gato. Ahora, cuando tú implementas lista, si yo no le digo nada, lista se
01:17:29
mantiene por object. Y entonces aquí utilizo object. Si yo aquí le digo algo, pues ahora esta lista de
01:17:43
aquí, en vez de ser object aquí, pues aquí le tengo que poner string. Aquí le tengo que poner string.
01:17:55
Aquí le tengo que poner string. No, esto no, porque no es de larga. Aquí le tengo que poner string, ¿vale?
01:18:03
Entonces, lo que me gustaría a mí es mantener también a este nivel una cosa de ese estilo.
01:18:11
A ver si me lo pillo así.
01:18:21
Yo te digo, cuando tú creas mi lista de array, me dices de qué tipo tienes.
01:18:24
Y esto implementa una lista de ese tipo.
01:18:30
Si tú me dices al crear la lista de array que es de string, pues esta que aquí será una lista de string.
01:18:33
Cuando lo pones así, quiere decir que esto es un t.
01:18:40
Esto es un t.
01:18:47
Esto es un t.
01:18:53
Esto no, porque buscador no es parte de la lista.
01:18:54
Entonces este de aquí lo puedo quitar, este de aquí sí, y ya está.
01:18:56
¿Vale? Además esto, esto se me enfado, porque no puedo crear arrays de tamaño, de tipo genérico.
01:19:06
Tengo que hacer cosas distintas para poder hacer esto.
01:19:28
Entonces esto sería un problema.
01:19:30
No sé si aquí me lo podría pillar.
01:19:34
Tengo que solucionar este problema aquí. Me dice, no puedes crear un generic array of t.
01:19:42
Me tienes que decir cuando lo creas, me tienes que decir como sea.
01:19:47
Entonces por ahora lo soluciona así. Pásamelo desde fuera.
01:19:51
Cuando tú creas un MrArray, me pasas un array del tipo correcto y a partir de allí hago lo que me
01:20:06
Creamelo tú, cuando la tienes que usar, me lo creas un array vacío y a partir de allí
01:20:14
yo ya hago lo que tengo que hacer. Y a ver si aquí se molesta en alguna forma, ahora
01:20:23
hay que revisar un poco todo porque esto también se ha de hacer, este de aquí, este de aquí
01:20:32
es un problema. Esto de aquí, ahora hacerlo como object y luego hacer algo así. Lo creo con objetos,
01:20:40
como puede estar todo en objetos, cuando voy a hacer aquí, hago un downcasting. Como tanto sé
01:20:55
que estoy utilizando todos los elementos T, lo puedo hacer. ¿Lo veis esto? No puedo crear,
01:21:10
en realidad este mismo truquillo lo puedo utilizar aquí. Te creo un new object, pero te digo que eres,
01:21:20
esperando que esto no explote. Y lo mismo con estas otras cosas. Esto de aquí también, lista,
01:21:39
creo un object y al final remove me da un t, una red de t, esto se queda igual, object,
01:22:01
este buscador se me lo salto, este elemento sí debería funcionar, esto es t, y un t object que
01:22:14
devuelve devolver y ya está con esto y un poco de suerte cuando yo creo mi lista yo le puedo
01:22:26
decir que mi lista es una lista de streaming esta cosa de aquí me está forzando que esta
01:22:43
lista de aquí ya no puedo añadirle un escáner. Si yo hago mla.add new ScannerSystem.in
01:22:56
punto in, no importa, que era java punto útil, punto, no, java punto, lo hemos importado
01:23:05
al otro lado, java punto útil, punto escándalo, no sé por qué ahora, no importa, bueno, ahí,
01:23:41
veis que se enfada, porque me dice, oye mira, no, tú has definido que mi array es de tipo
01:23:52
string. O sea, tú has asociado string a esta t de aquí. Entonces, ahora yo donde uso t,
01:23:59
quiero un string. Y tú me estás diciendo, ponle un scanner. Y si te fijas, el add,
01:24:10
el método add, pilla un elemento t. Y tú me has dicho que t string. Entonces no puedes añadir un
01:24:18
un scan. Ahora, si yo le digo que esto es object, dicen encantado de la vida, añade los objetos que
01:24:24
te da la gana. Scanner es un object, string es un object, lo puedes añadir. Entonces, aquí estaría
01:24:38
en la misma situación de antes. Puedo añadir lo que me da la gana. No la he perdido la opción de
01:24:45
poder hacer una lista con dentro de todo, pero tengo una opción más avanzada, que es que si te
01:24:50
Con el esfuerzo a que sea string, ahora aquí dentro solo puedo poner string.
01:24:58
Supero el código y luego lo puedo utilizar como me dé la gana.
01:25:14
Si, eso, mla.show.
01:25:20
Ah, esto va para el panel.
01:25:30
Aquí tengo mi lista que funciona tranquilamente con string.
01:25:39
Y ahora quiero hacer una lista de coches,
01:25:44
mi lista array de coches. Solo puedes crear arrays del mismo tipo. Lo único que has hecho con T es que le das la opción de crear de varios tipos, pero no el array siempre va a ser del mismo tipo.
01:25:48
Yo estoy haciendo un control diciendo que puedo crear listas que contengan dentro todos el mismo tipo. Pero eso no quita que pueda hacer listas con tipo mezclado.
01:26:03
Si yo pongo object, puede meter dentro lo que te haga, lo he hecho.
01:26:17
Claro, eso sería...
01:26:22
Sustancialmente no lo estás limitando, estás diciendo, y aquí dentro quiero solo objetos.
01:26:24
Por lo tanto, como todos heredan de objetos, puedes poner un integer, puedes poner un sonoscanner, puedes poner una string, puedes poner un coche.
01:26:30
Y él te pillará todo diciendo, muy bien, estoy contento.
01:26:39
Si quisiera hacer uno de tipo primitivo, no existe.
01:26:42
Sí, porque tú aquí le pones integer y ahora tienes una lista de entero.
01:26:45
Porque en Java integer e int van de la manita. Y él hace muchos cambios entre integer e int. Pero
01:26:59
aquí estamos trabajando con tipos de objetos, entonces no le puedes poner aquí un tipo
01:27:06
primitivo pero si le pones integer es la misma cosa ahora él te dice no le va a poner y le puede
01:27:11
añadir 1 4 y 27 30 y esto funciona
01:27:16
porque está utilizando integer pero aquí yo no tengo a hacer new integer de 1 porque él
01:27:29
entiende que este 1 es un int pero que tú lo estás tratando como integer y lo hace en automático
01:27:34
Entonces, esto es una pincelada de tipos genéricos. Es mucho más complejo de esto los tipos genéricos, ¿vale?
01:27:43
Se pueden hacer cosas bastante complejas con los tipos genéricos, ¿vale?
01:27:58
Pero como primer inicio para entender un poquito para qué pueden servir, pues aquí lo tenemos, ¿vale?
01:28:04
hemos pasado desde tener
01:28:13
una lista de objetos que
01:28:15
me valía perfectamente
01:28:16
para hacer una lista de string
01:28:19
pero si alguien malintencionado
01:28:20
ponía un coche dentro de una lista de string
01:28:23
pues podía ponerlo
01:28:25
a tener un mecanismo para
01:28:26
no perder lo anterior
01:28:28
porque si yo hago una lista de objetos
01:28:31
si yo lo instancio como object
01:28:32
pues sigo en el mismo
01:28:35
caso anterior y puedo hacer lo que me da la gana
01:28:37
pero con esto
01:28:39
pues ya
01:28:41
Puedo hacer cosas más estrictas
01:28:42
Puedo decir string
01:28:45
Entonces vamos a string
01:28:46
Puedo poner aquí
01:28:47
Una clase
01:28:48
De la que luego hereden otras clases
01:28:51
Yo podría hacer una lista de personas
01:28:54
Y dentro poner profesores y alumnos
01:28:56
Eso no lo quiero
01:29:03
Es una herramienta para hacer las cosas
01:29:04
Más flexibles
01:29:07
¿Vale?
01:29:09
Aquí se enfadaba siempre un poco
01:29:10
Porque aquí estoy haciendo una cosa un poquito
01:29:13
peligrosa, pero… ¡Dudas hasta aquí!
01:29:15
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 8
- Fecha:
- 2 de febrero de 2026 - 11:18
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 1h′ 29′ 30″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 750.91 MBytes