Activa JavaScript para disfrutar de los vídeos de la Mediateca.
ProgramacionJavaEjercicio109910AsignacionTareas
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:
Programacion Java Ejercicio 109910 Asignacion Tareas
Ahí está. Vale, pues ya estamos grabando y vamos a iniciar la presentación, ¿vale?
00:00:00
Entonces, me imagino que se lo han mirado a todo el mundo, porque para eso lo he puesto, porque se lo miren y lo intenten.
00:00:04
He revisado hace un ratito y tenía dos entregas. Bueno, no sé, quiero pensar que lo han intentado y que se han quedado casi a punto de hacerlo y por eso no lo han subido el resto.
00:00:11
Hasta 80 usuarios que tenemos, dos entregas son muy poquitas, pero bueno, ahí está.
00:00:22
En mi caso vi la hora, creía que la hora era más tarde
00:00:28
La tengo hecha, pero ya se ha pasado
00:00:31
Ahora hay que mirarla en la tarea
00:00:33
Y es que es muy importante
00:00:34
Si uno... y así es
00:00:36
Entonces
00:00:46
Vale
00:00:47
Entonces
00:00:54
La tarea esta consiste en lo siguiente
00:00:57
La idea es tener dos ficheros
00:00:59
Uno es de nombres de usuarios
00:01:01
Y otro es de tareas que van a hacer los usuarios
00:01:03
Y la idea es
00:01:06
Distribuir de forma aleatoria
00:01:07
las tareas entre los usuarios
00:01:09
una serie de condicionantes
00:01:10
y bueno, que se los pone aquí
00:01:13
anunciado, ¿no? que por ejemplo
00:01:15
hay que tener un poco de precaución cuando se leamos
00:01:17
la primera lista
00:01:19
de usuarios, pues no repetir nombres
00:01:21
cuidadito con las líneas vacías que no nos la dan tal
00:01:22
y alguna cosita más que ir por ahí
00:01:25
¿vale?
00:01:27
¿qué más?
00:01:30
ah, bueno, sí, también pido
00:01:31
todo esto está hecho a posta para que
00:01:32
practiquen ustedes ciertas cosas
00:01:34
que sustituyan, por ejemplo, los caracteres
00:01:36
del alfabeto español, la A con acento, las diéresis, todas estas cosas, las que sustituyan.
00:01:38
Si pone Pepe Pérez y pone uno con acento y otro sin acento, pues que se consideren la misma persona.
00:01:45
Esto es importante, pues nos lo pide.
00:01:54
Y luego también pone que trabajemos para números aleatorios, saben que en informática los números son pseudoaleatorios,
00:01:57
y hay una forma de hacerlos un poquitín más aleatorios que es trabajando con semillas.
00:02:02
por ejemplo es investigar para que quería que ustedes investigaran un poco sobre esto de las semillas
00:02:06
las semillas son un numerito que lo que hacemos es que incrementamos la aleatoriedad de las funciones aleatorias
00:02:11
son un poquito más aleatorias, nunca son perfectas en computación
00:02:18
pero con las semillas se hacen un poquitín más interesantes
00:02:22
y quería que lo investigaran y que le dieran tres vueltas
00:02:26
el objetivo del curso también es investigar cosas
00:02:30
por supuesto, en ese puesto
00:02:32
prohibido usar ArrayList, yo no sé que manía
00:02:36
con los ArrayList, porque le gustan tanto a ustedes los ArrayList
00:02:38
no digo ustedes
00:02:40
como
00:02:41
ustedes los 80 de este año, sino en general
00:02:43
yo no sé por qué a los alumnos les gusta
00:02:46
tanto el ArrayList cuando hay otros tipos de colecciones
00:02:48
que hay siempre mucho más interesantes y adecuadas
00:02:50
para hacer las cosas, entonces
00:02:52
les prohíbe también usar ArrayList
00:02:53
para que usen las otras y se las miren
00:02:55
y que usen colecciones adecuadas
00:02:57
el día que hagamos el examen será muy importante
00:02:59
No vale usar cualquier colección para cualquier cosa.
00:03:02
Una cosa importante es usar la colección adecuada a las necesidades que tengamos.
00:03:05
Esto es importante.
00:03:10
Y luego, bueno, el tema de identificadores, comentarios, códigos,
00:03:11
un montón de códigos que expliquen las cosas, que lo hagan bien.
00:03:15
Y como siempre, programamos para que lo entiendan los demás, no para entenderlo yo.
00:03:18
Siempre ese programa para que lo entiendan los demás.
00:03:22
Para que los demás, cuando lean ese código, entiendan muy bien lo que se está haciendo ahí.
00:03:24
No usar unos identificadores que no hay quien se entere.
00:03:29
Pues poner una variable ij74, pues no da mucha información, pero si le pongo nombre de usuario plantilla, pues da muchísima más información.
00:03:32
Muy bien, pues vamos a empezar ya con esto.
00:03:41
Entonces, había que hacer este programita y también otra cosa que les he puesto para que practiquen es la ejecución de la recepción de parámetros por parte del programa.
00:03:44
Tenía dos ejecuciones, una si recibe dos parámetros, que son dos nombres de fichero, y otra muy interesante, si recibe solo un parámetro.
00:03:55
si recibes solo un parámetro supone que es el nombre del fichero de usuarios
00:04:00
y entonces en ese caso lo que hacemos es que a ese fichero de usuarios se le asigna de forma aleatoria
00:04:04
un numerito que va desde 1 hasta el número de usuarios que tenga
00:04:10
de forma que implícitamente nos genera un orden aleatorio de esos usuarios
00:04:13
por si lo quiero ordenar numéricamente, pues primero, segundo, tercero, cuarto, quinto
00:04:19
pues me lo hace pasándole solamente el nombre del fichero de usuarios, esta es la idea
00:04:22
entonces estos ficheros, pues el primero de ellos es un listado de nombres
00:04:27
les voy a poner el fichero para que lo vean, miren, todo esto se lo voy a subir
00:04:32
y ahora les comento una cosita, lo tienen todo, ya lo tienen subido, ahora se lo habilito
00:04:36
para que lo vean y se lo pueden descargar, con lo cual no se preocupen del código aquí de nada
00:04:40
si quieren tomar notas, perfecto, pero recuerden que todo este código lo van a tener
00:04:44
en cuanto termine la conferencia, la charla, la clase, donde quiera
00:04:48
pero primero los ficheros, fíjense, es un fichero de nombres y además está hecho a posta
00:04:52
ya, pues unas cuantas cosas, son nombres
00:04:57
en general, he puesto los nombres de una clase
00:04:58
de usuarios de una clase, alumnos
00:05:00
entonces fíjense que yo hago varias cosas a posta
00:05:02
la primera es que repito algunos de los nombres
00:05:05
no me acuerdo cuál exactamente, me parece que
00:05:07
este de Ávila, por ejemplo, lo repito
00:05:09
y fíjense que a este le he puesto Ávila Fernández
00:05:10
con acento en las mayúsculas, y miren que aquí
00:05:13
pone Ávila Fernández Pablo
00:05:15
la misma persona, pero sin acento
00:05:17
porque lo hago a posta, para verificar
00:05:18
que está bien la conversión de acentos
00:05:21
y demás, y que me los da como el mismo usuario
00:05:23
que eso es lo que me piden
00:05:25
Y luego, otra cosa de las que hago es que aposta, pongo una línea en blanco para que también el programita lo considere
00:05:26
y esta línea en blanco no la incorpore como un usuario.
00:05:34
Entonces ya pongo yo el fichero aposta para verificar que funcionan las cosas.
00:05:37
Y este segundo fichero, este es el de usuarios, y ahí incorpora a los usuarios y demás.
00:05:43
Y el de tareas, pues miren aquí, el de tareas, pues fíjense, lo voy a hacer un poco más grande,
00:05:47
Pues he puesto cuatro tareas chorradas
00:05:52
Pueden ser por ejemplo ejercicios de un examen
00:05:54
Una resolución de ecuaciones
00:05:56
El cálculo de Fibonacci
00:05:58
Al ser un programita
00:05:59
O el cálculo numérico
00:06:01
De unas integrales
00:06:05
O un cálculo aproximado al tipo de pi
00:06:06
Cosas de estas, pues tareas que hay que hacer
00:06:08
Para lo que fuera
00:06:10
Y yo quiero asignar aleatoriamente estas tareas
00:06:12
A todos los usuarios
00:06:14
Fíjense, muy importante
00:06:16
Es diferente el número de usuarios y de tareas
00:06:18
Si tengo menos usuarios no hay problema
00:06:20
Porque tengo tareas para todos, ya está
00:06:23
Pero ¿qué ocurre? Si tengo menos tareas
00:06:25
Tengo que repetir las tareas a los usuarios
00:06:26
Pero de forma aleatoria
00:06:29
Si yo quiero asignar aleatoriamente estas tareas a los usuarios
00:06:30
Y si tengo usuarios
00:06:33
Pues ir asignando las tareas
00:06:34
Cuando se me acaben, vuelvo a aleatorizarlas
00:06:36
Las vuelvo a asignar y así sucesivamente
00:06:38
Y todos los usuarios van a tener una tarea de forma aleatoria
00:06:40
¿Qué ocurre al ejecutarse?
00:06:43
Pues fíjense, ¿qué va a ocurrir?
00:06:46
Pues que si yo ejecuto con dos parámetros, el nombre de fechero de usuario y el nombre de fechero de tareas,
00:06:47
voy a tener una asignación de los usuarios o a los usuarios de tareas de forma aleatoria.
00:06:52
Pues al primero le toca el cálculo de pi, al segundo el teorema de Pitágoras, al tercero el cálculo tal, al cuarto, al quinto...
00:06:59
Y fíjense que a todos ellos le van tocando tareas de forma aleatoria.
00:07:04
¿Ven ahí? ¿Lo ven, no?
00:07:08
Vale, pues se lo van viendo como les toca a cada uno de ellos, todo esto.
00:07:11
¿Lo ven, no?
00:07:15
Vale, yo aparte en la ejecución pues he hecho alguna cosita más
00:07:15
Pues ya que estoy leyendo ficheros, pues aprovecho
00:07:18
Y a medida que voy leyendo hago un listado directo de la lectura
00:07:20
Es decir, que a medida que leo cada usuario
00:07:24
Voy sacando ese usuario
00:07:25
Lo separo por comas
00:07:28
Y los apellidos del nombre los separo por un punto y coma medio
00:07:29
Que ya veremos ahora cómo lo hago
00:07:31
Primer usuario, en el segundo saco un punto y coma
00:07:32
Tengo un usuario, voy leyendo, lo ven ahí, ¿no?
00:07:35
Este es el listado directo de la lectura
00:07:38
Luego, una vez sacado el usuario
00:07:40
Fíjense que lo que tengo aquí es el mismo listado
00:07:42
Pero ahora ya está ordenado por nombre
00:07:45
Altares va antes que Ávila
00:07:48
Que va antes que Bravo
00:07:50
Que va antes que Corregidor
00:07:51
Que va antes que Crejo
00:07:52
Este ya está ordenado por apellido
00:07:53
Que es como yo listo mis usuarios
00:07:57
Aunque los lea como los lea
00:08:00
Yo los listo ordenados por nombre
00:08:01
Y en el fichero de las tareas
00:08:03
Pues ya aprovecho de leerlo
00:08:05
Y lo voy visualizando
00:08:06
Como cada tarea es una línea
00:08:07
Pues visualizando las líneas y todas las tareas
00:08:08
Resolución de tal, cálculo de cual
00:08:10
Para ti, para ti, para ti, para ti
00:08:12
esto no me lo piden, pero yo lo quiero hacer
00:08:13
porque me apetece
00:08:16
y además en este proceso verifico
00:08:17
la correcta lectura de los ficheros
00:08:20
y demás y que todo está funcionando
00:08:22
porque a mí lo que me piden realmente
00:08:23
es esto de aquí
00:08:26
que es la asignación aleatoria
00:08:27
fíjense que aquí no tenemos ningún nombre repetido
00:08:29
el señor este que estaba hábil, fíjense
00:08:32
está solamente una vez, lo ven aquí
00:08:34
era un usuario repetido, pero
00:08:36
está salvado ese problema
00:08:38
y el otro problema que era que había una línea en blanco
00:08:39
pues como verán no aparece ningún usuario en blanco
00:08:41
como tiene que ser
00:08:44
¿vale? esto es la ejecución con dos parámetros
00:08:44
fichero de usuarios, fichero de tareas
00:08:47
teníamos la otra ejecución
00:08:50
que era con un solo parámetro, solamente
00:08:52
tenemos el fichero de usuarios y lo que hacemos es que asignamos
00:08:53
a cada usuario un numerito de forma aleatoria
00:08:55
entre uno y el número de usuarios que tengo
00:08:57
de forma que, fíjense
00:08:59
pues asignar al target local 17, a vilar 5
00:09:01
a pablo, tal, tal, tal, tal, tal, si lo ven
00:09:04
si yo hubiera ordenado por los números
00:09:05
pues saldría ordenado por números, pero esto
00:09:07
fíjense, pasando solo
00:09:09
un fichero que es el de usuarios
00:09:11
no paso el nombre de fichero de tareas
00:09:14
a cada número, a cada usuario
00:09:16
le asigno un número entre 1 y el número
00:09:18
total de usuarios que será el máximo de estos
00:09:20
que será por 27, por ahí
00:09:22
por lo que veo por aquí, y cada uno tiene un número
00:09:24
distinto asignado de forma aleatoria
00:09:26
bueno, vamos a ver como se consigue esto
00:09:28
de acuerdo
00:09:30
los ficheros, las tareas
00:09:31
que no tenemos, pues ya nos vamos a meter con este fichero
00:09:36
que nos han dicho más que sea único
00:09:38
un único fichero
00:09:39
o sea, todo lo que haga lo tengo que hacer
00:09:41
todo aquí
00:09:43
y eso es lo que hemos hecho, hacerlo todo aquí
00:09:44
vamos a abrir
00:09:47
y hacer un poquito más grande
00:09:48
¿lo ven ahí bien?
00:09:50
Sara, ¿me estás oyendo?
00:09:56
Sí, sí, perfecto, perfecto
00:09:58
tampoco te quiero cortar, va muy bien
00:09:59
con que digas de vez en cuando sí o algo
00:10:01
pues yo es que tengo una sensación de estar hablando para el cuello de mi camisa
00:10:03
no, no, vas muy bien
00:10:05
es que no sé si me lleno o no
00:10:07
no se corta ni nada
00:10:08
¿no? ¿todo bien?
00:10:11
bueno, pues vamos a continuar
00:10:13
un poquito, entonces este es el fichero único
00:10:15
este Java que nos han pedido, aquí tenemos el ficherito
00:10:17
entero, lo ven
00:10:19
este se comió un poco, ahora lo hacemos un poco más pequeño
00:10:20
estas líneas que son un poco más grandes
00:10:23
ahora las cortamos un poco
00:10:25
bueno
00:10:27
entonces, bueno, estas son las
00:10:31
importaciones de librería que nos piden a medida que vamos
00:10:34
programando, no tiene mucha importancia
00:10:36
y pues nada
00:10:38
el ejercicio, pues yo le he llamado
00:10:40
y miren lo primero que hacemos
00:10:42
lo primero que hacemos es esto que les digo
00:10:44
yo voy a estar leyendo estos usuarios de un fichero
00:10:46
entonces, en el enunciado este que les he puesto
00:10:48
a ustedes, no se lo pido
00:10:51
explícitamente, pero hombre, tiene sentido
00:10:52
¿verdad? que si voy a estar leyendo usuarios
00:10:55
pues de alguna forma los meta en algo
00:10:56
que los genere como entidades
00:10:58
y esas entidades van a ser objetos
00:11:00
entonces, este usuario
00:11:02
pues yo lo que hago es un usuario muy sencillo
00:11:05
fíjense, lo único que tiene aquí es el nombre
00:11:07
de usuario
00:11:08
que no le he separado ni siquiera en apellidos
00:11:09
porque es una cosa muy sencilla
00:11:12
Y sí que, muy importante, le hago el Implements Comparable.
00:11:13
¿Para qué? Para poder ordenar mis usuarios.
00:11:17
Ya que, claro, como implemento el Comparable de usuario,
00:11:22
este genérico Comparable de usuario,
00:11:26
quiere decir que esta clase implementa la comparación de elementos del tipo usuario.
00:11:28
Evidentemente se van a comparar a través del nombre,
00:11:33
que es el atributo que tiene el usuario y que lo va a identificar.
00:11:36
Fíjense cómo ha construido el constructor.
00:11:39
lo hago en línea porque es muy sencillito, no ocupo líneas para abajo
00:11:41
miren, otro constructor vacío, pues una cadena vacía
00:11:44
miren como hago el constructor de copia
00:11:48
para preservar la ocultación de código
00:11:51
fíjense como creo este usuario, fíjense lo que hago
00:11:56
yo quiero crear un usuario desde otro usuario
00:11:59
para no copiar este nombre, el espacio de memoria donde está este nombre
00:12:04
lo que hago es que creo un nuevo string
00:12:09
con el nombre de usuario que me han pasado como parámetro
00:12:11
entonces esto que me pasa es una referencia a un nombre
00:12:14
con ese getNombre que lo que me va a devolver es un string
00:12:18
creo un nuevo espacio de memoria
00:12:22
y ese nuevo espacio de memoria se lo asigno yo a mi
00:12:24
referencia privada de usuario
00:12:27
así tengo mi, de forma privativa
00:12:30
tengo esa zona de memoria para mí
00:12:32
para mi nombre, ¿vale? y nadie más va a poder acceder ahí
00:12:35
Entonces estamos preservando la ocultación
00:12:39
Ahí, el acceso y todo
00:12:41
Está muy bien hecho, ¿de acuerdo?
00:12:43
Sí
00:12:46
Gracias Sara por saber que me oyen
00:12:46
Nada, nada
00:12:49
Muy bien, gracias
00:12:50
Miren por ejemplo como devuelvo el nombre
00:12:52
No devuelvo directamente este
00:12:55
Este puntero
00:12:57
Referencia
00:13:01
No devuelvo el nombre
00:13:02
Devuelvo un new string de nombre
00:13:04
¿Para qué? Para preservar la ocultación
00:13:06
de este atributo, ¿vale? Jamás voy a devolver esto, ¿de acuerdo? Devuelvo un nuevo espacio
00:13:09
de memoria donde copio ese nombre, ¿eh? Y así preservo la ocultación 100%. Este está
00:13:16
muy bien hecho, aposta. Consume un poquito más de recursos, consume un poquito más
00:13:22
de tiempo, es verdad, pero preserva la ocultación de los datos. Los datos privados tienen que
00:13:27
estar siempre ocultos, súper importante. Vale, cuando establezco el nombre, pues aquí
00:13:33
sí que lo hago un poco a pelo marinero, porque ya que tengo todo lo demás preservado, pues
00:13:38
digo, bueno, pues esta me la salto. En principio ya me lo van a hacer. Pero bueno, podría
00:13:44
haber aquí sido un poquitín más exagerado y cuando quiero establecer el nombre a través
00:13:49
de un parámetro, pues igual le hago aquí un newString de nombre, voy a poner un igual
00:13:56
a nombre, newString de nombre y así genero un nuevo espacio de memoria para esta asignación
00:14:00
y asignárselo de esa manera
00:14:04
bueno, uno de los métodos que tengo en su momento
00:14:06
es el hash code, es el método que me devuelve el código
00:14:09
hash de cualquier información
00:14:11
¿vale? pues me genera
00:14:12
un número dependiente
00:14:15
del nombre, de los
00:14:17
atributos, ¿vale? que es un número aleatorio
00:14:19
este es en base a números primos y demás
00:14:21
matemáticamente hablando, pero siempre
00:14:23
me devuelve el mismo, ¿vale?
00:14:25
acuérdense del hash, lo hemos seguido en su
00:14:27
momento, equals me va a decir
00:14:29
si dos objetos son
00:14:31
iguales para el caso de este objeto usuario y el comparto es el método que necesariamente tengo que
00:14:33
implementar por qué escribir por qué recuerden que se implementa el comparable de usuarios
00:14:43
donde necesito como comparados como comparó dos usuarios a través de su nombre como el nombre es
00:14:52
un string y string ya tiene compareTo
00:14:57
pues uso el compareTo de string
00:14:59
porque el nombre es un string
00:15:01
entonces comparo mi nombre
00:15:02
con el nombre del parámetro, del nombre
00:15:05
comparo
00:15:06
voy a hacerlo así, a ver, ahí va
00:15:08
comparo, ¿vale?
00:15:10
mi nombre
00:15:13
con el nombre del
00:15:14
parámetro que me pasa
00:15:17
¿vale? y de esa comparación
00:15:19
este compareTo
00:15:21
el valor lo devuelvo yo como valor
00:15:23
Andrés, perdona
00:15:25
la sesión está bloqueada
00:15:26
y hay gente que está esperando para entrar
00:15:29
me están avisando por whatsapp
00:15:30
que no pueden entrar
00:15:32
en la configuración
00:15:35
de web he puesto que
00:15:37
a partir de los 10 o 15 minutos
00:15:39
no voy a dejar entrar a nadie más
00:15:41
entonces, bueno, le dejaré entrar si puedo
00:15:42
está esperando, pero otro día no dejo
00:15:45
porque es que si no están sonando pitiditos todas las sesiones
00:15:47
no voy a hacerlo más
00:15:49
pues otro día, si es que hacemos mal, no voy a dejar entrar
00:15:50
a ver si puedo
00:15:52
porque no me deja
00:15:55
Pues no sé cómo
00:15:55
Aquí me dice que Alberto no sé quién está
00:15:57
Pero no sé cómo habilitarle
00:15:59
No sé cómo
00:16:01
Si me dicen cómo
00:16:04
Yo encantado
00:16:05
Participantes, a ver
00:16:07
Dos participantes esperando
00:16:09
Admitir, vale, creo que los ha admitido
00:16:10
Me parece que sí
00:16:14
Sí, Alberto Jiménez, ¿no?
00:16:16
Señor Jiménez, ¿estaba usted esperando?
00:16:18
No, sí, ya estoy
00:16:21
Sí, llevaba un rato
00:16:22
Que no conseguía entrar
00:16:23
No, es que lo he bloqueado
00:16:25
Si lo he bloqueado yo hace 10 minutos
00:16:26
No quiero estar cada
00:16:28
N estando pitidito
00:16:29
Entonces cada vez que entra un usuario se van a pitir
00:16:32
Ah, vale
00:16:33
Me parece que ha dejado 10 o 15 minutos de margen
00:16:35
Vale, vale
00:16:39
Sí, sí, sí, pero es que creía que era las 8 y media
00:16:41
He visto el mensaje y ya me tiré
00:16:43
El próximo día
00:16:45
Pongo un tiempo
00:16:56
Prudente
00:17:00
Y ya está
00:17:01
vale, lo que, por donde andaba
00:17:02
entonces, ¿has quedado claro?
00:17:05
uso el compare to the string
00:17:07
para devolver un valor del compare to the usuarios
00:17:09
realmente yo comparo usuarios a través
00:17:11
del string nombre, entonces
00:17:13
el compare to the string me sirve
00:17:15
y el toString, pues nada
00:17:16
devuelvo el nombre con un formato
00:17:19
de 20 caracteres
00:17:21
y ya está
00:17:23
vale, joder
00:17:25
¿oyen ustedes el pitidito?
00:17:26
hola
00:17:32
¿hay alguien por ahí?
00:17:33
Nosotros no oímos pitidito
00:17:34
Yo creo que lo oyes solo tú
00:17:36
Madre mía, pues qué pesadilla esto
00:17:37
Cada vez que hay no sé qué
00:17:39
Un pitidito por ahí
00:17:41
Vale, bien
00:17:43
Continuamos
00:17:46
Entonces ya, visto esto
00:17:47
La declaración de la clase está usuario
00:17:50
Una clase extremadamente simple pero
00:17:51
A nivel conceptual nos sirve muy mucho
00:17:54
Para las clases que ustedes van a tener que desarrollar
00:17:56
Y luego ya nos metemos en el mail
00:17:58
¿Y qué hace el mail? Bueno, pues ya nos metemos un poco
00:18:00
con la chicha del código este de nuestro programa, ¿no?
00:18:02
Entonces, lo primero, pues fichero, nombre fichero usuarios y nombre fichero tareas.
00:18:05
Variables que vamos a utilizar para los nombres de los ficheros que vamos a utilizar.
00:18:10
Y aquí les voy a hacer una salvedad muy importante.
00:18:14
El código que yo les he pasado pone, en vez de nombre fichero usuarios, pone nombre fichero alumnos.
00:18:19
En muchos sitios que aquí vamos a ver que pone usuarios, en el código que yo les proporciono en el aula virtual pone alumnos,
00:18:25
pero que sepan que es lo mismo
00:18:30
una cosa de alumnos y esto es para usuarios en general
00:18:32
pero da igual, alumnos y usuarios
00:18:35
es lo mismo, a fin de cuentas
00:18:37
es lo mismo, que lo sepan
00:18:39
porque aquí van a haber usuarios
00:18:40
y cuando abran los ficheros en la aula virtual
00:18:42
van a haber alumnos
00:18:44
pero funciona exactamente igual
00:18:45
que lo sepan
00:18:48
entonces inicializamos estas dos variables donde vamos a almacenar estos nombres
00:18:49
y una variable línea
00:18:53
para ir leyendo
00:18:54
es una variable booleana
00:18:55
que dice si existen tareas
00:18:58
es para saber, todo esto
00:19:00
fíjense que el programa yo se lo he hecho muy comentado
00:19:02
para que se lo puedan estudiar
00:19:04
con ganas, tranquilamente
00:19:06
pues nada, simplemente sabemos con esta
00:19:07
variable si existe o no un fichero de tareas
00:19:10
¿vale?
00:19:12
entonces
00:19:13
si la longitud de
00:19:14
args es mayor que 1
00:19:18
¿vale?
00:19:19
es decir, si vamos a tener
00:19:22
dos o más parámetros
00:19:24
que nos da igual que haya más
00:19:26
nosotros vamos a usar dos
00:19:27
Y si hay más, pues se ignoran absolutamente
00:19:30
Pero los dos primeros parámetros
00:19:32
Van a ser los que usaremos como
00:19:34
Nombre de ficheros
00:19:36
Entonces, si hay dos parámetros, el nombre de fichero de usuario
00:19:37
Será el primero de ellos
00:19:40
Ars de 0 y el nombre de fichero
00:19:41
De tareas será Ars de 1
00:19:44
¿Vale?
00:19:46
El nombre de este
00:19:48
Hombre, pero bueno, no pasa nada
00:19:50
Y entonces, si tenías esos dos ficheros
00:19:52
Existe un fichero de tareas y es true
00:19:54
¿De acuerdo?
00:19:56
sin embargo, si la longitud en vez de ser mayor que 1
00:19:57
es exactamente 1, quiere decir que me han pasado
00:20:00
solo un parámetro
00:20:01
y si me han pasado solamente un parámetro
00:20:02
solo tengo usuarios
00:20:04
entonces, fichero de usuarios del parámetro que me han pasado
00:20:11
fichero de tareas no tengo
00:20:13
y existen tareas
00:20:15
no existen tareas, con lo que le hago false
00:20:17
y hace que no existen tareas
00:20:19
y si he pasado
00:20:21
ni siquiera un parámetro, pues mira
00:20:23
le damos un mensaje al usuario y le decimos
00:20:25
oye macho, que este para ejecutarlo
00:20:27
necesitas nombre de usuario de ficheros
00:20:29
y opcionalmente
00:20:31
el nombre de usuario de tareas
00:20:33
le pongo extension txt para que sepan que el formato
00:20:35
es de texto plano, no tiene por qué ser extension txt
00:20:38
vale
00:20:40
ya hemos solucionado el tema de leer los ficheros
00:20:42
ya sabemos si existen o no, se nos han pasado
00:20:44
los parámetros o no, a continuación
00:20:45
importantísimo
00:20:48
declaro las colecciones que voy a utilizar
00:20:50
para almacenar las cosas
00:20:51
La colección de usuarios que voy a utilizar
00:20:53
Un triset de usuarios
00:20:56
De forma que ya tenemos usuarios ordenaditos
00:20:58
¿Vale?
00:21:00
Y además hago un triset
00:21:02
¿Y por qué hago un triset y no hago un trilist?
00:21:04
A ver, Sara, ¿qué opina?
00:21:06
Yo estoy aquí para decir el sí
00:21:10
Ya, ya, pregunto
00:21:12
No, no, no
00:21:14
Yo paso palabra
00:21:15
Que responda otro
00:21:17
A ver, otro
00:21:18
A ver quién me contesta, un voluntario
00:21:21
¿Por qué uso un triset y no un linked list, por ejemplo?
00:21:23
O un sorted map
00:21:30
Esa es pregunta de examen
00:21:30
¿Puedo recorrerlo?
00:21:33
¿Eh?
00:21:37
Erlo, ¿eh?
00:21:40
Entendido, Erlo
00:21:41
Oiga
00:21:42
Sí, decía que sí es para poder recorrerlo
00:21:43
Hombre, cualquier colección se puede recorrer
00:21:46
Cualquiera
00:21:49
Pero las mapas
00:21:50
Para poderlo ordenar
00:21:52
¿Eh?
00:21:53
Para poderlo ordenar
00:21:55
Una de las razones es para poderlo ordenar muy bien
00:21:56
Y hay otra, muy importante
00:21:59
Esto es pregunta de examen, ¿eh?
00:22:01
Y estamos ya un poquito del examen
00:22:07
Hombre, las colecciones se las han estudiado a fondo, ¿no?
00:22:09
Ya, del capítulo anterior, ¿no?
00:22:12
A ver, ¿qué características tiene un set?
00:22:18
Súper importante
00:22:20
Hay una característica muy importante
00:22:21
De las colecciones de tipo set
00:22:23
¿Eh?
00:22:25
Tienen duplicados
00:22:30
Exacto, pero justo exactamente al contrario
00:22:31
No admiten duplicados
00:22:34
y es una de las cosas que me pedían en el enunciado
00:22:36
que no queríamos duplicados
00:22:40
pppere solo lo queremos una vez en mi conjunto
00:22:42
no puede estar dos veces pppere
00:22:45
por mucho que lo intente, no tiene doble existencia
00:22:46
solo existe una vez
00:22:49
entonces utilizo un set precisamente para evitar duplicados
00:22:49
y el hecho de que sea un triset o no
00:22:53
bueno, pues es interesante porque lo podríamos ordenar
00:22:56
de otra manera, pero bueno, si encima además
00:22:59
lo tengo ya ordenado, pues es que eso que gana
00:23:00
pero lo más importante es el que sea un set
00:23:02
es porque no admite duplicados
00:23:05
¿vale? y repito
00:23:07
como segunda opción elijo un tree
00:23:10
porque además ya los voy a tener ordenados
00:23:12
claro, y además voy a tener esos usuarios
00:23:13
ordenados por el nombre
00:23:16
jolín, pues que interesante, pues ya me lo han
00:23:18
vamos, blanco y en botella, pues ya
00:23:20
mejor imposible
00:23:22
yo directamente de la colección me ordeno las cosas
00:23:23
no me toque complicar la vida
00:23:26
y además le llamo
00:23:27
le doy un identificador a esto que me da información
00:23:28
acerca de lo que hace, es la colección
00:23:32
de usuarios
00:23:34
y es del tipo
00:23:34
triset de usuario
00:23:36
es el tipo que tiene
00:23:38
muy bien
00:23:40
y lo que hago es que la inicializo
00:23:42
la inicializo vacía, un new triset
00:23:44
no le paso
00:23:46
nada porque ya el orden
00:23:48
aquí le podría pasar el orden pero
00:23:50
los usuarios ya están ordenados por defecto
00:23:51
hay una ordenación por defecto
00:23:54
recuerda, implementa
00:23:55
comparable, ya tenemos una ordenación por defecto
00:23:58
que la hemos especificado
00:24:00
al hacer el compare to
00:24:02
Y entonces
00:24:03
Tenemos aquí nuestra colección de usuarios
00:24:13
Y luego tengo las tareas
00:24:15
Y fíjense
00:24:17
Vuelvo a usar un set, claro
00:24:19
No puedo tener dos tareas iguales
00:24:21
O no debería tener dos tareas iguales, ¿verdad?
00:24:23
Si hago el cálculo de pi, pues hago el cálculo de pi
00:24:25
Podría hacer el cálculo de pi por
00:24:27
Bueno, hay muchas formas de calcular pi
00:24:30
pero cálculo de pi 1 y cálculo de pi 2
00:24:33
ya son dos tareas diferentes
00:24:36
pero si tengo cálculo de pi 1
00:24:37
solo va a ser una vez
00:24:39
y en este caso hago un hash set
00:24:41
porque que estén ordenadas o no
00:24:43
la verdad es que me da un poco lo mismo
00:24:45
entonces hacemos las tareas
00:24:47
metidas en un hash set
00:24:49
necesitamos un orden dentro de las tareas
00:24:51
la verdad es que me da igual
00:24:54
de hecho no hemos declarado un orden en las tareas
00:24:55
porque no me interesa
00:24:57
de hecho las tareas si se fijan
00:24:59
las tareas realmente no las defino
00:25:01
ni siquiera como una clase
00:25:03
como tarea me sirve simplemente
00:25:05
el texto que define la clase me sirve
00:25:07
para la tarea
00:25:09
entonces utilizo el propio string y me ahorro
00:25:10
un montón de implementaciones
00:25:13
que no es que estarían mal pero no
00:25:14
voy a decir un poco inútiles pero
00:25:16
no son inútiles pero no
00:25:18
digamos que son un poco innecesarios
00:25:20
vale
00:25:22
a partir de ahí fíjense lo que tengo
00:25:24
súper importante un try catch
00:25:26
catch
00:25:28
y empiezo con un try
00:25:30
¿y por qué hago esto?
00:25:32
Sara, ¿está por ahí?
00:25:34
aquí estoy, aquí estoy
00:25:36
¿por qué hago un try?
00:25:37
porque puede dar un error
00:25:38
¿eh?
00:25:39
porque puede dar un error
00:25:40
¿y por qué puede dar un error?
00:25:41
las excepciones
00:25:42
¿por qué puede dar un error?
00:25:43
pues...
00:25:48
¿por qué lo metas?
00:25:49
¿eh?
00:25:50
al estar desordenado
00:25:50
porque no existe el fichero
00:25:52
bueno, pero eso ¿cómo se llama?
00:25:55
genérico
00:25:58
¿por qué?
00:25:58
por una excepción
00:26:00
no, la excepción es lo que se genera
00:26:01
Yo hago todo esto en un bucle try-catch que es un tratamiento de excepciones evidentemente porque tengo operaciones de entrada-salida y las operaciones que dan este tipo de errores capturados en excepciones son casi siempre, hay algunas también aritméticas, pero son casi siempre operaciones de entrada-salida y la lectura, escritura de ficheros son operaciones de entrada-salida que dan errores.
00:26:06
Estos son preguntas de examen, ¿eh? Todas.
00:26:28
Estas y otras 843.321 más que se me ocurren.
00:26:31
Pero todos estos son preguntas de examen, ¿eh?
00:26:36
Entonces, claro, como hay operaciones de entrada y salida,
00:26:39
yo tengo que envolver esto en un try-catch, ¿vale?
00:26:41
Para capturar esa excepción que se produce.
00:26:43
Y cuidado no confundan, la excepción es lo que se produce,
00:26:45
pero lo que produce el error es la operación de entrada y salida.
00:26:48
Cuidado no confundan los dos ejemplos, ¿eh? ¿Vale?
00:26:51
Entonces, fíjense lo que estoy haciendo aquí.
00:26:55
le asignó lector fichero de user de usuarios es aquí donde le meto el file reader el nombre de
00:26:56
fichero usuario que me ha pasado y luego le hago un buffer reader pues para que esté bufferizado
00:27:04
y con un buffer pues siempre las cosas funcionan muchísimo mejor vale y luego a continuación
00:27:09
si lo he abierto y no me ha dado errores si me da errores captura el try-catch y ya me olvido pero
00:27:17
si no tengo errores, pues quiere decir que lo he podido abrir bien
00:27:22
pues yo me pongo a leer los usuarios
00:27:24
entonces, ¿cómo leo los usuarios?
00:27:25
bueno, primero saco información para ver, fichero usuario
00:27:28
listado directo de lectura, le recuerdo que esto
00:27:30
es el resultado, este de aquí
00:27:32
fichero usuario
00:27:34
listado directo de lectura, lo ven aquí, ¿verdad?
00:27:36
fichero usuario
00:27:39
listado directo de lectura, y me pongo a leer líneas
00:27:40
entonces, ¿cómo leo las líneas? pues nada, del buffer
00:27:42
le hago un readline, ya está
00:27:44
un readline, me lee la línea completa
00:27:46
de texto, hasta el retorno de carro, pum, y me lo devuelve
00:27:48
En un string, que es este, se lo asigno a línea
00:27:50
Si eso es distinto de nulo
00:27:53
Quiere decir que hay información
00:27:55
Esa información la trato
00:27:56
¿Vale?
00:27:58
¿Qué línea es empty? Es decir, que había una de nada
00:27:59
Pues, continue, vuelvo a ver la siguiente línea
00:28:03
¿Vale? No añado líneas vacías
00:28:05
¿Vale?
00:28:07
¿Cómo me salto ya las líneas vacías? Con esto de aquí
00:28:08
¿Qué hace al continue? Recuerda, me vuelve
00:28:11
Al inicio del bucle
00:28:13
Entonces no hago lo demás, porque no tengo nada que hacer
00:28:14
Pues no hago lo demás
00:28:17
Si no, quiere decir que si tengo información la tengo que reemplazar
00:28:18
Y miren lo que hago aquí
00:28:22
Imprimo, ¿vale?
00:28:23
Por el dispositivo estándar de salida
00:28:26
Dispositivo estándar de salida
00:28:29
Imprimo la línea
00:28:32
Pero no la imprimo de cualquier manera, no
00:28:34
Fíjense lo que hago
00:28:36
Me agarro la línea y como yo he metido los nombres
00:28:37
Me dice enunciado el tipo
00:28:42
Pérez Jiménez, coma, Pepito
00:28:43
apellido, apellido, coma, nombre
00:28:45
reemplazo estas comas por puntos y comas, ¿vale?
00:28:50
para distinguirlos, los apellidos del nombre de los usuarios
00:28:53
se los separo por coma, ¿vale? entonces los apellidos del nombre los separo por punto y coma
00:28:57
y los usuarios en tesis los separo por comas, pero eso es solo en este listado
00:29:01
porque este replace es momentáneo de aquí
00:29:06
es al visualizarlo, ¿vale? ¿de acuerdo?
00:29:09
Y una vez que lo he reemplazado, miren lo que hago. Añado a mi usuario, Pere Jiménez Pepito, lo añado a la colección de usuarios. ¿Y cómo lo añado a la colección de usuarios? Pues nada, como es un nuevo usuario, creo ese nuevo objeto usuario a partir de la información de la línea de información.
00:29:13
Pero no de cualquier manera
00:29:40
Lo que pasa es que esa línea de información
00:29:41
Le limpia los acentos
00:29:43
Y limpia los acentos
00:29:45
Se hace a través del método limpia acentos
00:29:47
Que vamos a ver un poquito más adelante
00:29:49
Ahora no me voy a detener en él
00:29:51
Es un método que recoge
00:29:52
Un texto
00:29:55
Un string
00:29:57
Y lo limpia de acentos
00:29:58
Si tiene una A con acento la quita el acento y la deja como una A
00:30:01
Si tiene una Ñ la quita la Ñ
00:30:03
Y le pone una N en mi caso
00:30:05
Limpia estos caracteres propios
00:30:06
del alfabeto español como nos decía en el inicio, ¿vale?
00:30:09
pero fíjense lo que hago, yo aprovecho ya todo y lo hago todo de golpe
00:30:12
fíjense, lo hago todo de golpe
00:30:14
todo esto lo hago de golpe, me ahorro aquí
00:30:16
pues en vez de hacer esto en 5 o 6 líneas de código lo hago todo de golpe
00:30:19
a la línea limpio los acentos
00:30:22
ese string lo utilizo para inicializar un nuevo usuario
00:30:25
un nuevo objeto de la clase usuario
00:30:29
genero ese espacio y ese espacio generado por ese objeto
00:30:31
esa nueva instancia la añado
00:30:34
a la colección de usuarios
00:30:37
se añade la referencia de esta nueva instancia
00:30:39
y se gestiona la
00:30:41
que me da falso
00:30:43
es decir
00:30:47
que no me lo admite
00:30:48
si ya tengo texto y no me lo admite
00:30:50
la única razón por la que puede ser
00:30:52
es porque ya estaba ese usuario
00:30:54
¿vale?
00:30:57
y entonces si ya estaba ese usuario
00:31:00
evidentemente no se añade porque ya estaba
00:31:02
pero lo que hago yo es que saco
00:31:04
por el dispositivo
00:31:07
estándar de salida
00:31:08
visualizo una información
00:31:10
que la tengo aquí, que es esta de aquí
00:31:12
entrada repartida nos añade
00:31:14
y así yo sé
00:31:16
que lo que ha pasado es que había uno
00:31:18
para añadir pero como ya está de alta
00:31:20
como usuario no le vuelvo a añadir
00:31:22
es decir, si perejimenez, pepito
00:31:24
ya existía, no le añado
00:31:26
lo he leído, lo intento añadir pero no puedo
00:31:27
y lo visualizo que no lo añado
00:31:30
y ya está, eso lo hace el bucle
00:31:32
hasta que se termina el fichero
00:31:34
añado todos los usuarios a la colección
00:31:36
una vez hecho esto
00:31:38
bueno, este println de backslash
00:31:40
b, lo que hace es que imprime
00:31:42
un espacio atrás
00:31:44
un backspace, un espacio atrás
00:31:45
entonces me quita la última coma
00:31:47
que hemos ido añadiendo al usuario
00:31:50
la última coma del último usuario lo quita
00:31:52
el último no tiene esa coma
00:31:53
porque ya es el último, un truquito
00:31:55
una vez que he hecho esto
00:31:58
cierro el buffer
00:32:00
cierro el fichero y nada, pues ya está
00:32:02
y miren
00:32:04
la magia de las colecciones de Java
00:32:06
saco el listado ordenado
00:32:08
aquí lo tenemos, leído y a continuación
00:32:10
saco el listado ordenado, ¿y cómo saco el listado
00:32:12
ordenado? la magia de las
00:32:14
colecciones, tachán
00:32:17
a ver dónde está, aquí
00:32:18
saco el listado ordenado
00:32:20
mis usuarios los saco ordenados
00:32:22
¿qué hago para hacerlos
00:32:24
para tenerlos ordenados? nada
00:32:26
al ser un tree
00:32:28
set y estar bien implementado
00:32:30
el ordenamiento en la clase
00:32:33
de usuarios, automáticamente al
00:32:34
irlos introduciendo ellos se han ido ordenando
00:32:36
solos y lo que hago es que los visualizó esta colección tiene un plus string
00:32:38
este es lo activo porque hago que salga la colección de usuarios sumada concatenada con
00:32:46
una cadena vacía el sistema interpreta que quiero voy a querer transformar esta colección en un
00:32:52
string y él lo que hace
00:33:01
es que transforma la colección en un string
00:33:03
este de aquí, ¿está bien?
00:33:04
ese que está en azul
00:33:06
por ahí que le estoy pasando, ¿lo ven?
00:33:08
y es el listado ordenado
00:33:10
sale directamente ordenado
00:33:12
¿vale? muy bien
00:33:15
¿que existen tareas? pues nada
00:33:16
si existen tareas, ¿qué es lo que hacemos?
00:33:18
pues nos ponemos a leer el fichero de tareas, ¿no? habrá que leerlo
00:33:20
pues hacemos lo mismo que hemos hecho antes
00:33:23
lo abrimos, no sé qué, patatas
00:33:24
si está vacío, no sé cuántos
00:33:26
y si no está vacío, pues vamos añadiendo
00:33:28
las tareas, añadimos la línea que estamos leyendo
00:33:30
y aquí
00:33:32
ya está, con esto
00:33:34
hemos leído todas las tareas y las visualizamos
00:33:36
y ya está
00:33:38
y si no existen tareas
00:33:39
los que se ejecutasen, si no existen tareas
00:33:42
¿qué es lo que queríamos que hiciera? no teníamos el segundo
00:33:44
parámetro y queríamos que asignara
00:33:46
aleatoriamente los números entre uno
00:33:48
y el número de usuarios, es decir, un orden numérico
00:33:50
pues mire lo que hago
00:33:52
para hacer eso, le meto
00:33:54
las tareas, estoy añadiendo
00:33:56
tareas
00:33:59
pero que añado en las tareas, fíjense, añado
00:34:00
un contador que voy haciendo de número de usuarios
00:34:04
empieza siendo 0 y se va incrementando antes de añadirse
00:34:07
se incrementa para que el primero sea 1, se va incrementando y se pasa
00:34:12
en forma de value of del número, es decir, 1
00:34:16
pasado a string y se mete como tarea
00:34:20
la primera tarea se llama 1, más más, se hace un 2
00:34:23
Se transforma en un string
00:34:28
Y se mete ese string, la segunda tarea se llama 2
00:34:29
Y así va a suceder esto
00:34:32
Mientras que recorramos
00:34:34
Los elementos de usuario
00:34:36
De la colección de usuarios
00:34:38
Me recorro toda la colección de usuarios
00:34:40
Por cada usuario
00:34:41
Por cada elemento de usuario
00:34:43
De la colección de usuarios
00:34:45
Añado un numerito
00:34:47
Entonces añado tantos numeritos como usuarios tengan en la colección
00:34:48
Y ya está
00:34:52
Y esta es la parte del catch
00:34:53
Cuando tengo una excepción de estas
00:34:55
no he sido muy fino
00:34:57
con la recepción de extensiones
00:34:58
habría que haber sido un poco más fino
00:35:00
ahora que lo veo, creo que deberíamos
00:35:02
haber
00:35:05
analizado con un poquitín más de detalle
00:35:05
la lectura de un fichero
00:35:08
lo no sé qué, tal y que, habría que
00:35:11
afinar un poquito más
00:35:13
con esta captura de extensiones, porque aquí va a salir
00:35:14
la acepción de una revista, pero bueno
00:35:16
es suficiente y ya está
00:35:18
con esto finalizamos la lectura de fichero
00:35:20
al final se pone un comentario, se finaliza la lectura de fichero
00:35:23
y pasamos a lo siguiente que es la asignación
00:35:25
bueno, pues miren
00:35:27
¿qué es lo que voy a hacer?
00:35:29
voy a hacer uso de una lista de tareas
00:35:32
¿vale? una nueva variable
00:35:34
que como va a ser utilizada una lista
00:35:36
pero como las listas son abstractas
00:35:39
yo para cuando la inicializo
00:35:41
le hice una link en list
00:35:43
es decir, una lista que va
00:35:44
recuerden las listas
00:35:46
son listas dinámicas
00:35:47
¿vale?
00:35:52
enlazadas ¿vale?
00:35:54
Que va añadiendo la información a medida que se va introduciendo
00:35:54
Entonces, primero irá el primero de los que añadimos
00:35:58
Luego el siguiente, luego el siguiente, luego el siguiente
00:36:00
¿Vale?
00:36:02
Es un link en list
00:36:02
¿Y qué hacemos aquí?
00:36:03
Pues nada, empezamos a asignar a los usuarios
00:36:05
Le asignamos tareas
00:36:07
Y ya está
00:36:08
No hay problema
00:36:08
Entonces, fíjense
00:36:09
Me recorro todos los usuarios
00:36:11
Que le llamo elemento usuario a cada uno que va recogiendo
00:36:13
De mi colección de usuarios
00:36:14
Yo quiero asignarle a todos los usuarios una tarea
00:36:16
Pues me recorro todos los usuarios de mi colección de usuarios
00:36:18
¿Y qué hago?
00:36:21
Pues lo primero, digo
00:36:23
Oye, si lista de tareas está vacío, evidentemente la primera vez que yo me meto aquí, que acabo de crear mi lista de vacías como una nueva linked list vacía, la primera vez que me meto está vacía.
00:36:24
Si está vacía la lista de tareas, lo primero que hago es que le añado a mi lista de tareas, esta que voy a usar aquí, le añado todas las tareas que yo tengo.
00:36:37
Recuerden que tareas era un hash
00:36:46
Un hash set
00:36:49
¿Vale? Pero era un set, es una colección
00:36:55
¿Vale? Entonces pulsar el add all
00:36:57
¿Vale? Añado todas las
00:36:59
No tengo lista, lista, tareas en la lista
00:37:01
No pasa nada, toma, todas las tareas
00:37:04
¿Vale? Las añado todas
00:37:05
Y se lo paso
00:37:07
¿Lo ven aquí?
00:37:09
Se la metemos en la lista de tareas, ya deja de estar vacía
00:37:11
Porque le he metido todas las tareas que están
00:37:13
Y me pongo a generar un número
00:37:15
para generar la semilla
00:37:17
de esa aleatoriedad
00:37:19
la semilla de esa aleatoriedad
00:37:20
aquí lo he hecho
00:37:22
como lo he hecho
00:37:24
lo he hecho generando un número
00:37:24
a través de
00:37:28
bueno, pues utilizo aquí
00:37:29
una generación, esto es matemática pura y dura
00:37:36
saco los segundos, los minutos y alguna cosa más
00:37:38
por ahí y genero un numerito con eso
00:37:41
que eso depende del instante
00:37:42
en el que estoy ejecutando
00:37:44
Así tengo una semilla que depende del momento en el que ejecuto, cosa que ahora no va a ser lo mismo que dentro de un segundo, dentro de siete, que dentro de quince, que pasado mañana, que dentro de un mes, que dentro de una semana.
00:37:45
Se me dejará un numerito diferente dentro del instante de tiempo en el que estoy.
00:37:54
Y eso es lo que voy a utilizar de semilla en el Shuffle, este que es lo que se encarga de esbarajar o desorganizar, o desordenar, ¿no?
00:37:59
Yo quiero desordenar mi lista de tareas
00:38:11
Y miren que les meto
00:38:14
Nuevo
00:38:16
Número aleatorio
00:38:17
Utilizando esta semilla que es
00:38:20
Número aleatorio de tiempo, esta es la semilla
00:38:22
¿Vale? Que la he generado en este instante
00:38:23
Y depende de este instante
00:38:26
Hay alguna forma más sencilla de hacerlo
00:38:27
También
00:38:30
Con el kernel milisegundos y cosas así
00:38:30
Es otra opción
00:38:34
Pero bueno, hay varias maneras
00:38:34
Y nada, pues ya hemos generado esto
00:38:37
Pues me ha generado
00:38:40
Pues fíjense lo que le hago
00:38:40
Saco un elemento de usuario
00:38:43
Porque estoy recorriendo todos los usuarios
00:38:47
Y lo que hago es que saco una de las tareas
00:38:48
Extraigo
00:38:51
De la lista de tareas
00:38:53
La tarea remove
00:38:54
Extraigo la primera tarea de la lista
00:38:56
Y la saco de la lista
00:38:59
Y ya me queda una tarea
00:39:00
¿Lo ven?
00:39:02
Al usuario que le toque
00:39:04
Le extraigo la primera de las tareas
00:39:06
La primera de las tareas
00:39:09
Disponible en la lista
00:39:11
y ya está, y eso me genera
00:39:12
esto de aquí
00:39:14
tal, tal, cálculo de pi, patacín, teorema de Pizzagorassi
00:39:15
este es Fibonacci, el otro
00:39:18
este, tal, pim, pam, pim
00:39:20
ahí lo que es, ¿eh?
00:39:22
¿lo ven, no?
00:39:24
cuéntame
00:39:26
¿ahí al final lo estás ordenando?
00:39:27
¿ahí o allá?
00:39:30
en la visión, cuando salen los datos
00:39:32
cuando salen los datos
00:39:34
la salida de datos, ¿sí?
00:39:36
en la imagen anterior
00:39:37
Dices la visualización de la ejecución
00:39:39
Ahí
00:39:42
Cuéntame
00:39:43
Aquí los nombres están en orden alfabético
00:39:44
Sí
00:39:47
Y las tareas también están en orden
00:39:48
No
00:39:51
Calculo pi, teoría mapitágoras
00:39:52
Fibonacci
00:39:54
T, C, R
00:39:57
C
00:40:00
No, no está en orden
00:40:01
Por eso digo que
00:40:03
Es que es lo que yo quiero
00:40:05
yo quiero aleatoriamente
00:40:07
asignar a los usuarios que están ordenados
00:40:09
el desorden
00:40:11
de la lista de tareas, es que es exacta entre lo que quiero
00:40:13
yo no veo
00:40:15
el desorden
00:40:18
quiero decir, va, cálculo pi, teorema
00:40:18
la al va antes que
00:40:21
ab, que va antes que brr
00:40:24
que va antes que co, que va, esto está ordenado
00:40:26
a la derecha
00:40:27
k, t, k
00:40:29
esto no está ordenado
00:40:32
pero va siempre igual
00:40:33
se repite, ¿no?
00:40:34
Bueno, esto si está así es porque la aleatoriedad es un petardo, simplemente, porque teóricamente debería de hacerse un random cada vez que se gastan, esto cada vez que se termina, que lista de tareas termina de extraer todas las tareas, como lista de tareas está vacío se vuelven a copiar las tareas y se vuelven a desordenar, por esto se generan las semillas.
00:40:36
Para esto son las semillas
00:41:06
Claro, ¿qué ocurre? Miren
00:41:07
Si la ejecución es tan rápida que la semilla no pasa
00:41:08
Ni un segundo
00:41:12
Y esto es el problema
00:41:13
Como no ha pasado ni un segundo, la semilla es la misma
00:41:15
Y el aleatorio va a ser el mismo, seguramente
00:41:18
Seguramente tengamos que usar milisegundos
00:41:20
Para que esto funcione mejor
00:41:23
¿Entienden o no?
00:41:24
De acuerdo, sí, sí
00:41:27
Pero la idea es que esto fuera
00:41:28
Yo tengo otra versión de este programa que está con milisegundos
00:41:31
Y les aseguro que salen distintas
00:41:33
A ver, no me voy a fijar aquí
00:41:35
Pi, Pitágoras, Fibonacci, ecuaciones
00:41:36
Integrales, Pi, Pitágoras, Fibonacci, ecuaciones
00:41:39
Integrales, Pi, Pitágoras, Fibonacci, ecuaciones
00:41:41
Integrales, Pi, Pitágoras, Fibonacci, ecuaciones
00:41:43
Integrales, Pi, Pitágoras, Fibonacci, ecuaciones
00:41:45
Integrales, Pi, Pitágoras, pues tiene toda la pinta que se repite siempre lo mismo
00:41:47
Pero eso si se repite
00:41:50
Es porque está hecho en tan corto
00:41:51
Espacio de tiempo
00:41:53
Que el numerito que se genera aquí, el número de
00:41:54
Aterotiempo es el mismo, es el problema
00:41:57
¿De acuerdo?
00:42:01
Entonces seguramente haya que usar los milisegundos
00:42:02
Y ya está
00:42:04
en vez de con second
00:42:05
se usa minisecond
00:42:07
vale
00:42:08
si está claro o no
00:42:10
si
00:42:12
muy bien pues entonces ya está
00:42:13
sacamos el usuario, sacamos la lista de tareas
00:42:16
y se han sacado
00:42:18
más cosas
00:42:19
el programa ya está, nos queda revisar
00:42:22
el limpiacentos, el limpiacentos que hace
00:42:24
yo le paso un string como parámetro
00:42:26
y me devuelve
00:42:28
ese mismo string pero sin acentos
00:42:30
y como hago esto
00:42:33
pues de la forma más fácil posible, con un switch
00:42:34
voy pillando
00:42:37
carácter a carácter los caracteres
00:42:38
del parámetro, que me encuentre una A
00:42:41
de una forma, de otra
00:42:42
o de otra, de la que no quiero que me aparezca, le pongo
00:42:44
una minúscula, que me encuentre
00:42:47
la mayúscula, con el acento para un lado, con el acento para el otro
00:42:49
o con el acento circunflejo, le pongo
00:42:51
una mayúscula limpia, y así
00:42:52
eso es lo que hago con cada una de las vocales, lo ven aquí
00:42:54
a la Ñ le pongo
00:42:56
la N minúscula, y a la Ñ mayúscula
00:42:58
le pongo la N mayúscula
00:43:01
y una vez que he hecho esto
00:43:02
en el char at i
00:43:07
pues nada, una vez que he cambiado
00:43:09
todos los caracteres
00:43:11
por el que quiero
00:43:12
lo que hago, fíjense, si me encuentro este, reemplazo
00:43:14
en el parámetro, que es lo que le paso
00:43:17
le reemplazo el carácter este
00:43:19
que me acabo de encontrar en el char at i
00:43:21
que es este de aquí, que coincide con la
00:43:23
que yo quiero que incide
00:43:25
entonces lo estoy limpiando, estos caracteres
00:43:27
los limpio todos por sus caracteres
00:43:29
y el alfabeto inglés correspondiente
00:43:31
una vez hecho todo esto, devuelvo el parámetro
00:43:33
y se han cerrado
00:43:34
¿lo ven ahí, no?
00:43:36
¿y una vez hecho esto, lo que conseguimos?
00:43:41
pues lo que tenemos aquí, que a cada usuario
00:43:43
le ha asignado una tarea de forma
00:43:45
aleatoria, ¿vale?
00:43:47
o pseudo-aleatoria
00:43:48
¿eh?
00:43:51
sí, pues la otra versión es con milisegundos
00:43:53
y seguro, yo no sé por qué sale esta
00:43:54
pero bueno, da igual, no hay problema
00:43:59
no tiene medio problema
00:44:01
¿vale?
00:44:02
Bueno, ¿ha quedado claro esto?
00:44:08
Respondo por todos, sí
00:44:13
Sí, ¿no? Sí, vale
00:44:14
Muy bien, pues nada, esto era
00:44:16
Fíjense que hay un montón de conceptos implícitos en este programa
00:44:18
Por eso les quería mostrar este programa
00:44:21
Como tampoco sé si va a ser el último que veamos o no
00:44:23
Pues quería mostrar uno que tuviera bastante cositas
00:44:28
Para que se hagan un poco una idea de
00:44:30
De todo, un poquito en general
00:44:31
También es importante
00:44:35
Que se den cuenta de una cosa súper interesante
00:44:37
Utilizando colecciones con muy poco código
00:44:39
Se hace muchísimo
00:44:43
A esto si le quitan comentarios y alguna cosa más
00:44:43
Y están todas estas líneas en rojo
00:44:46
Si se fijan se quedan poquísimos
00:44:47
Hay muchas líneas en rojo pero porque hay muchos comentarios
00:44:49
Pues yo lo que quiero es que ustedes
00:44:52
Entiendan lo que se está haciendo aquí
00:44:54
Y bueno, lo comprendan y lo asimilen
00:44:55
Y lo entiendan muy bien, ¿de acuerdo?
00:44:59
Vale, pues yo por mi parte nada más
00:45:01
Intentaré la pesadilla hasta subir el vídeo
00:45:02
A la mediateca
00:45:05
Esta fantástica
00:45:07
y compartírsela, se lo comparto siempre donde está el ejercicio
00:45:08
aparte, les voy a habilitar
00:45:11
el ejercicio para que lo puedan ver
00:45:13
ya les digo que el código difiere
00:45:15
un poquitín, vale, pero nada
00:45:17
cosas sin relevancia
00:45:19
algún nombre, algún identificador
00:45:20
y ya está, vale
00:45:23
y nada, pues por mi parte ya está, si tienen alguna
00:45:24
duda me preguntan y les digo
00:45:27
y si no, pues
00:45:28
nos vamos a cenar o algo
00:45:30
ah, bueno, estamos en fase 0
00:45:32
no podemos tomar caña ni nada, entonces
00:45:35
Eso lo dejamos para otro día
00:45:37
¿Alguna duda, alguna cuestión o algo que quieran preguntar?
00:45:38
Yo sobre algo que no es del ejercicio, Andrés
00:45:44
Si es una duda general
00:45:46
Por favor en los foros
00:45:49
Porque así la tenemos todos
00:45:51
Era solo preguntar si la semana que viene habrá tutoría
00:45:52
No tengo ni idea
00:45:55
Porque es que
00:45:57
Si no recuerdo mal, esta era la última tutoría
00:45:58
Sí
00:46:03
Creo
00:46:03
De lo que pase de aquí en adelante es un auténtico misterio
00:46:04
Pero créanme
00:46:08
no lo sé yo, no lo sabe tampoco el coordinador
00:46:09
de distancia, no sabe nadie
00:46:12
lo que va a pasar de aquí en adelante
00:46:13
entramos en terreno
00:46:16
farragoso
00:46:17
desconocido
00:46:20
no sabemos si va a haber examen, si no, si va a ser presencial
00:46:22
telemático
00:46:25
cromático
00:46:26
sublimático, no tenemos ni idea de nada
00:46:29
pero nadie, no sabemos nadie nada
00:46:32
de hecho no lo saben ni los de arriba porque
00:46:33
tampoco saben cómo va a evolucionar tanto el tema este
00:46:35
entonces están esperando
00:46:37
un poco
00:46:39
acontecimientos
00:46:40
o alguna decisión. Dígame.
00:46:42
¿Se sabe
00:46:44
aproximadamente con cuánto tiempo se nos va a visitar
00:46:45
más o menos?
00:46:48
Sí, sí, sí. Sé exactamente que no sé nada.
00:46:49
Eso es lo único que sé con precisión.
00:46:54
Espero que más de una hora.
00:46:57
Pero yo también.
00:47:00
Claro, porque imagínese.
00:47:01
Hombre, yo lo que pasa es que la ventaja mía es que
00:47:04
yo les puedo tener el examen ya preparado.
00:47:06
Pero es que no les puedo decir nada.
00:47:09
No son los profesores. El problema es que para planificarte bien un examen...
00:47:11
Pero que me escuche, que no le puedo decir una cosa que no sé, si yo le doy la razón, pero no le puedo decir nada.
00:47:17
No le puedo decir qué va a ser con dos semanas, porque no tengo ni idea ni nada de nada, pero ni yo ni nadie lo sabe.
00:47:22
No, pero a lo mejor había comentado que con un mínimo de tiempo se iba a avisar o algo.
00:47:29
Que no, que no, que no tenemos ni idea de nada. Cero.
00:47:33
Porque para el tema de pedir permisos
00:47:37
De los trabajos y eso
00:47:41
Ante la nueva situación
00:47:43
Pero que entiéndanme
00:47:44
Que yo estaría encantado de todo
00:47:47
Pero es que no les puedo decir nada
00:47:49
Entiendo, entiendo
00:47:50
Me encantaría decirles
00:47:54
Con dos semanas, no se preocupen
00:47:56
Pues me encantaría, pero es que no les puedo decir nada
00:47:58
Así que
00:48:00
Esto es lo que
00:48:03
Uy, ¿qué pasa aquí?
00:48:06
A ver
00:48:07
Dejo ya grabar esto, ¿no?
00:48:08
Porque debe de tener un pauso
00:48:10
Que tengo
00:48:12
- Idioma/s:
- Autor/es:
- Andrés Ramos González
- Subido por:
- Andres R.
- Licencia:
- Reconocimiento - Compartir igual
- Visualizaciones:
- 100
- Fecha:
- 11 de mayo de 2020 - 21:36
- Visibilidad:
- Público
- Centro:
- IES ALONSO DE AVELLANEDA
- Duración:
- 48′ 13″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 111.33 MBytes