Ejemplo Map: frecuencia palabras - 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:
Vale, entonces, vamos a grabar, por tanto si habláis me autorizáis a grabar vuestra voz, ¿vale?
00:00:00
Entonces vamos a hacer un ejercicio que se basa sobre, o sea, que hace un contador de frecuencia de palabras, ¿vale?
00:00:08
Entonces vamos a crear, no, aquí en map, vamos utilizando un map, entonces creamos un nuevo package, contador,
00:00:14
Palabras. Y aquí dentro ponemos nuestro...
00:00:23
Entonces ponemos, no sé, contador, frecuencia, qué sé yo. Contador, frecuencia. Palabras.
00:00:43
Supongo que hacemos directamente un main aquí, ¿no?
00:00:57
Sí, sí.
00:00:59
Porque tampoco...
00:01:00
Bueno, entonces tenemos este main.
00:01:03
Aquí nos dice que vamos a utilizar un hashMap de stringInteger, ¿vale?
00:01:05
No podemos usar un stringInt porque...
00:01:09
Hola, buenos días.
00:01:18
¿Eh?
00:01:21
Porque no es un objeto.
00:01:22
Entonces usamos integer porque...
00:01:24
Porque es exactamente lo que se llama una clase wrap, ¿eh?
00:01:33
Es una clase que engloba, envuelve el tipo primitivo y lo transforma en un objeto.
00:01:37
Además Java es suficientemente listo para que estos intercambios lo hace en automático, digamos así.
00:01:51
Entonces donde puedo poner un integer, puedo poner un integer, donde puedo poner un integer, puedo poner un integer.
00:01:58
Y él asume, hace la conversión automática entre uno y otro.
00:02:02
¿Vale? Entonces esta de aquí será frecuencia, es igual a new ashmap de string integer para acá, ¿vale?
00:02:05
Entonces vamos a usar un ashmap, podemos usar un map a la izquierda, da igual, y ¿qué vamos a hacer?
00:02:25
Vamos a tener una frase, ¿vale?
00:02:33
Vamos a hacer lo siguiente, si os parece bien.
00:02:38
¿Dónde queremos poner nuestras palabras?
00:02:44
¿En un list, en un array, en un set, en un qué?
00:02:50
En un array.
00:02:54
¿Un array? Never, una lista.
00:02:56
Array ya ha pasado, vamos a una lista.
00:02:59
List, string, palabras, o frase, o frase, es igual a new ArrayList de string, ¿vale?
00:03:01
Y vamos a hacer una cosa un poquito distinta, que es la siguiente.
00:03:17
Frase es igual a
00:03:24
frase split
00:03:31
de...
00:03:34
¿Eh?
00:03:37
No, esto no existe.
00:03:43
Esto es un método mío.
00:03:48
Si quisieras usar los splits sobre una string, pues sí.
00:03:50
Pero no estoy usando eso. Estoy creando un método mío.
00:03:55
sustancialmente lo que quiero hacer es lo siguiente
00:03:59
yo creo una lista
00:04:03
de palabras, que será mi frase
00:04:24
de cómo la hago con este método
00:04:27
¿qué hace este método? pues ahora mismo
00:04:30
nada, me pone cinco palabras que yo conozco
00:04:35
y que funcionen, cuando más adelante ya me funcione el programa
00:04:39
entonces me puedo poner aquí y decir
00:04:44
dame una frase
00:04:46
un poquito más
00:04:48
interesante y a partir de esta
00:04:50
frase interesante hago todo
00:04:52
lo que tengo que hacer para crear esta lista
00:04:54
o sea, sustancialmente
00:04:57
me invento que esta parte ya se ha hecho
00:04:58
y la haré después
00:05:00
porque no es esta la parte interesante
00:05:02
esta parte de aquí son ejercicios
00:05:05
que ya hemos hecho al principio del curso
00:05:06
dame una frase y divídela en palabras
00:05:08
pues ya la hemos hecho
00:05:10
entonces esto lo sé hacer
00:05:12
No me limito ahora a hacer esa parte de allí, porque es la parte menos interesante.
00:05:13
El ejercicio es sobre ashmat, entonces ahora hago como que este de aquí me hace la magia
00:05:19
y ya cuando paso de aquí ya tengo lo que me han dado originalmente, el texto, el artículo
00:05:26
y cosas por el estilo, dividido en frases, en palabras que componen una frase, ¿sí?
00:05:31
Luego cómo se hace, pues después, ahora lo ignoro.
00:05:38
Aquí simplemente lo que hago es frase, punto add, y añado unas cuantas palabras, que son
00:05:42
... hola, hola, ¿sí?, entonces, es más, yo luego cuando haré esto, asumo que esta
00:05:57
cosa de aquí me pilla una frase, un artículo, un lo que sea, me lo divide en palabras y
00:06:31
quita los puntos de arriba y de abajo y me lo pone todo en minúscula.
00:06:40
¿Sí?
00:06:44
¿Cómo se hace?
00:06:45
No lo sé, no me interesa, lo hace esto.
00:06:46
Después lo haré.
00:06:51
Entonces, aquí me estoy haciendo un método mock, un método falso, que me da lo que me
00:06:52
tiene que dar.
00:06:57
¿Vale?
00:06:59
Sin puntos, sin cosas raras, solo la palabra y todo en minúscula.
00:07:00
¿Sí?
00:07:06
paso aquí, yo tengo que recordarme que, como se dice, divide la frase en palabras sin puntuación,
00:07:07
todo en minúsculas regulares. Entonces yo paso esta cosa aquí, ahora esta cosa aquí
00:07:24
no la está haciendo, me está creando una frase. Yo me espero que de esta cosa aquí
00:07:32
me debería decir que es sustancialmente gato aparece tres veces o la aparece dos veces y
00:07:39
luego perro una delfina una y no más esto es lo que yo me espero de esta cosa aquí actualmente
00:07:50
Si me dará este resultado mi programa, pues funciona.
00:08:05
Asumo que funcione.
00:08:10
Luego puedo probar con otros ejemplos aquí para ver que funcione con datos, digamos, controlados.
00:08:11
Y a ese punto ya paso a implementar bien este método de aquí.
00:08:21
Teniendo en cuenta que si yo lo trabajara así, pues este método lo podría dar a un grupo de trabajo y este método a otro.
00:08:26
¿Vale? Entonces estoy paralelizando el desarrollo de mi sistema
00:08:31
¿Vale? Let's go
00:08:35
Entonces, asumamos que esto ha hecho la magia
00:08:39
Ahora tengo una lista con todas las palabras que es necesaria
00:08:42
Tengo que empezar a trabajar con este aquí
00:08:45
Tengo que recorrer esta lista, pillar las palabras
00:08:48
Y por cada palabra preguntarme
00:08:52
¿Está aquí dentro? Si está aquí dentro
00:08:54
Voy a pillar cuál es el valor actual
00:08:57
Y sumarle uno
00:09:00
Si en vez de no estar aquí dentro, es una cosa nueva y la pongo en él.
00:09:02
Entonces, lo hacemos de versión easy, versión básica, versión fea.
00:09:07
Pero requiere el menor conocimiento posible para que funcione.
00:09:13
Luego después, a lo mejor vemos si la hacemos un poquito mejor.
00:09:19
Entonces, pillo la primera frase.
00:09:24
Entonces, perdón, por todas las palabras de la frase.
00:09:25
vale entonces iterator de string palabra es igual a frase punto no perdón es un iterator
00:09:29
frase punto iterator no quiere trabajar importe que es ya va útil vale entonces vile it punto
00:09:40
as next
00:10:18
que hago es pillar una palabra
00:10:19
string palabra es igual
00:10:24
a it.next
00:10:27
y en este punto voy a preguntarme
00:10:29
si esta palabra existe o no
00:10:33
si
00:10:35
how se llama
00:10:36
frecuencia
00:10:40
frecuencia.contains
00:10:42
key
00:10:46
palabra
00:10:48
los dos casos, ¿vale?
00:10:51
la palabra ya existe
00:10:56
la palabra no existe
00:10:57
este es el caso fácil
00:11:00
la palabra no existe, la he buscado entre las claves
00:11:02
y la palabra no está
00:11:05
por lo tanto, frecuencia
00:11:06
punto put
00:11:09
palabra
00:11:11
uno
00:11:12
m1 es un
00:11:14
íntegro, yo quiero un íntegro
00:11:17
¿vale?
00:11:19
new integer de 1.
00:11:20
Y ahora te dice, pero ¿qué estás haciendo?
00:11:24
El constructor integer de int es deprecado.
00:11:27
Pues no lo hay, está adentro.
00:11:30
¿Sí?
00:11:34
Ahora, aquí en vez quiere decir que ya existe.
00:11:35
Entonces, ¿qué hago?
00:11:39
Pues primero le digo int f es igual a frecuencia.getPalabra.
00:11:40
Con esto usa la clave palabra para encontrar su correspondiente valor, que es un integer.
00:11:54
Entonces me lo puede guardar un int.
00:12:03
Ya lo tengo.
00:12:05
Como ya existía, ya lo tengo.
00:12:06
Que ya se había visto tres veces, me habrá dado tres.
00:12:07
que ya se ha visto 57 veces, me ha dado 57. Hago f++, porque ahora se ha visto una vez más,
00:12:10
y lo vuelvo a poner. Frecuencia, punto put, palabra, f. Cuando yo pongo put sobre algo que ya existe,
00:12:18
me sobrescribe el valor anterior. Por lo tanto, en este caso, lo que hace es que si había aquí dentro
00:12:31
que la palabra gato eran tres veces, ha leído un otro gato, ahora lee tres, pone cuatro y le pone
00:12:41
gato cuatro. Entonces ahora dentro de mi sistema está gato asociado con el intercuarto. Y ya está.
00:12:48
Una vez que ha hecho esto, no sé, vamos a ver si se hizo, frecuencia. Una maravilla.
00:12:55
Ahora, que queremos complicarlo un poco, que queremos decir, mira, pero esto pónmela ordenadas alfabéticamente, ordenada por número, se puede hacer.
00:13:15
Puedes hacer todo lo que queráis.
00:13:46
Probamos a completar esto
00:13:47
Yo os he dicho, usad frases
00:13:51
Inglesas, porque así quitamos
00:13:53
Del medio los acentos
00:13:55
Las señas y cosas así que son más complejas
00:13:57
De trabajar
00:13:59
¿Vale? Vamos a ver cómo lo hacemos
00:14:01
¿Vale?
00:14:05
Ahora, asumamos que no es así
00:14:06
Sino que me han dado
00:14:09
Una cadena
00:14:11
¿Vale?
00:14:13
Y mi cadena será
00:14:14
hola, gato, gato, perro, gato.
00:14:16
¿Sí? Fácil.
00:14:25
Por lo tanto, vamos a arreglar esta de aquí.
00:14:27
Entonces, ¿cómo lo hago?
00:14:29
Pues pillo la string que me han dado,
00:14:31
digo que string array splitted
00:14:34
es igual a string.split de espacio. Y luego, había una forma, raise.toList.
00:14:40
lo hago antes. string es igual a string.toLowerCase. Ahí, ya está, todo mismo. Y ahora lo que
00:15:02
quiero hacer es frase punto a doble de a raíz punto
00:15:19
no me acuerdo
00:15:27
había una forma para transformar
00:15:38
esto directamente en una
00:15:59
es una cosa
00:16:01
así no lo pilla
00:16:03
esto no le gusta, hay que transformar esto
00:16:05
en una colección
00:16:10
y no me acuerdo si estaba
00:16:11
collections punto
00:16:14
hay un método que te pilla directamente
00:16:16
un array
00:16:24
y te lo transforma
00:16:28
en una
00:16:30
en una lista
00:16:31
pero no me acuerdo como sea
00:16:34
list enumeration
00:16:35
no me acuerdo
00:16:42
array.list
00:16:48
Entonces, esto me lo transformo en una lista, lo añado aquí, de hecho, podría ser que
00:16:50
devuelve esto, de acuerdo, Arrays.asList, que devuelve, devuelve una, no leo, devuelve
00:17:08
entonces podría hacer directamente esto no
00:17:29
bueno una maravilla
00:17:50
vamos a ver si nuestro programa funciona click maravilla de una fenómena ahora el problema es
00:17:58
es que esta no es una frase real, porque no tiene comas, puntos y cosas por el estilo.
00:18:07
Entonces una frase real sería más como, me gustan mucho los gatos, porque de hecho
00:18:16
Los gatos son maravillosos, maravillosos, viva los gatos, entonces punto, son tres espacios.
00:18:28
Entonces ahora cuando yo hago esto, me salen cosas raras, entonces lo divide, ofreciendo
00:18:51
espacios pero ahora tengo que comprobar si al final de mi palabra están o no estas cosas aquí
00:19:03
vale entonces como lo hago me han separado por espacios entonces por cada palabra tengo que
00:19:10
hacer como un... Limpiarla. Entonces for string s dos puntos cliptender. Entonces pillo ese y lo
00:19:22
que hago es ese punto trim, le quito espacios a la derecha y a la izquierda. Tiene muchos espacios,
00:19:42
pues se lo quito, ¿vale? No creo que sea necesario porque como he utilizado esto, pues a lo mejor no lo hago, ¿vale?
00:19:52
Luego, voy a mirar... En teoría los signos podrían estar delante y detrás. ¿Hay signos delante? Sí,
00:19:58
porque, claro, en español, en inglés no, ¿no? A comillas a lo mejor, sí, a comillas podría ir. Entonces quito
00:20:08
cosas que no sean letras ni a la izquierda ni a la derecha. He puesto todo lo del case, entonces aquí
00:20:16
solo hay letras minúsculas, me interesan solo letras minúsculas, ¿vale?
00:20:20
Entonces, por ejemplo, quito la parte
00:20:24
la primera parte, ¿vale? Entonces digo
00:20:29
char c es igual
00:20:33
a ese punto char
00:20:40
0. Cuile c
00:20:44
mayor que
00:20:54
a
00:20:59
y c
00:20:59
menor que c,
00:21:02
está en minúsculos, ¿eh? Ah, esto lo haría así.
00:21:04
Y que
00:21:06
paga.
00:21:09
Mientras
00:21:12
no sea esta cosa aquí,
00:21:12
mientras no sea
00:21:17
una letra, yo he empezado desde el principio,
00:21:18
¿vale? Y mientras no sea una letra
00:21:21
lo que tengo que hacer es eliminar ese carácter.
00:21:23
¿Vale? Entonces
00:21:25
s es igual
00:21:26
a
00:21:28
ese punto, esto era substring, substring de 1. Esto lo voy a hacer, porque yo leo, no es una letra,
00:21:30
Pues entonces, transformo S en su substring, o sea, en una subcadena que empieza desde la primera posición.
00:21:58
Sostantialmente, quito la primera.
00:22:07
¿Entiendes?
00:22:11
Y lo vuelvo a hacer.
00:22:12
Ahora es una letra, he acabado.
00:22:14
Ahora es otro signo de interpulsión.
00:22:16
Siguiría adelante, adelante, adelante.
00:22:19
Este de aquí iría quitando todos los símbolos raros antes de la primera letra.
00:22:22
¿Sí?
00:22:28
Ok, he limpiado la parte izquierda
00:22:28
Ahora intento limpiar la parte derecha
00:22:34
Lo mismo, pero desde derecha hasta izquierda
00:22:36
O sea, pillo el último
00:22:38
P es igual
00:22:39
A S.charact
00:22:42
De
00:22:45
S.length
00:22:46
Menos uno
00:22:47
El último carácter
00:22:50
¿Vale?
00:22:55
Y digo que mientras este carácter
00:22:56
No sea
00:23:00
Una
00:23:00
una letra
00:23:02
pues lo que hago es
00:23:05
quitar la última
00:23:07
o sea, su string
00:23:10
desde el principio
00:23:12
hasta
00:23:13
esto
00:23:15
ahora, con un poco de suerte
00:23:18
esto funciona
00:23:27
hay que ver por qué string
00:23:28
siempre es especial
00:23:31
si esta cosa de aquí me lo hace bien
00:23:32
o no
00:23:35
porque si con esto lo hago por valor
00:23:35
no funcionará, si esto lo hace por referencia
00:23:39
si funciona
00:23:41
entonces vamos a ver
00:23:41
si lo hace
00:23:45
boom, explose
00:23:46
ancho 0
00:23:49
menos 1, out of bound
00:23:51
for length 0
00:23:53
vale, aquí
00:23:54
he intentado poner un
00:23:59
menos 1 aquí, porque me ha
00:24:02
dado una cadena
00:24:04
que es larga 0
00:24:06
entonces esto lo
00:24:07
hacemos, siempre
00:24:09
de cuando S tiene algo, pero hay algo, vamos a ver por qué lo hace, entonces aquí le
00:24:12
hacemos escribir schizo proceso dos puntos S, y luego después de este while veo que
00:24:28
quedado en S, limpio izquierda y después de esto limpio derecho. Vamos a ver donde explota.
00:24:41
¡Ah! Vale. Me ha ido bien. Gusto ha ido bien. La primera vez que encuentra gatos empieza a
00:24:56
limpiar a la izquierda y lo hace bien, pero cuando limpia a la derecha explota. ¿Por qué?
00:25:15
¿Por qué va de cero a ese punto lento y menos uno?
00:25:21
Porque se enfada porque intenta acceder...
00:25:44
¿Por qué? Porque la S es de lente cero.
00:25:54
Pero S no es de lente cero.
00:25:59
Que cuando lo escribe aquí, S es esto.
00:26:12
Entonces, debería estar bien.
00:26:15
cuando entra de aquí ese punto substring desde cero hasta la última que no pilla.
00:26:18
Este debería ser este, pero como si esta cosa de aquí me estuviera dando cero, en vez no debería ser cero.
00:26:27
y eso es el punto l
00:26:35
porque aquí me da menos 1 y 0
00:26:47
porque no cambio C aquí dentro entonces
00:27:10
y ya el punto empieza a ir a ir y nunca cambia el C. Esto lo tengo que volver a
00:27:15
hacer cada vez que hago esto. Y lo mismo aquí, porque lo quito, pero ahora tengo que actualizar
00:27:21
el carácter, que en este caso sería este. Ahora sí. ¿No entendéis? No. Si yo pillo,
00:27:31
si está así, aquí dentro el carácter no cambia nada, nunca. C no cambia nunca. Entonces,
00:27:43
aquí detectó que el último es un punto me dice aquí está el último pero no es cambiado entonces
00:27:49
sigue siendo un punto entonces me dice también quita el último y vuelve aquí dice es un punto
00:27:55
quita el último es un punto quita el último es exactamente me destruye todo si yo lo hago así
00:28:00
mira se escriba ese no me va a devolver todas las combinaciones de es y ya datos puntos quita
00:28:06
el punto pero como no he actualizado el carácter ahora cree que este es el punto entonces me quita
00:28:16
este es el punto, me lo quita
00:28:21
este es el punto, me lo quita
00:28:23
hasta llegar a vacío
00:28:24
y cuando hace vacío y le quita el punto
00:28:26
al menos uno explota
00:28:28
¿vale? sustancialmente he hecho un bucle infinito
00:28:30
porque
00:28:33
no actualizo
00:28:35
no actualizo
00:28:36
cuánto vale C aquí dentro
00:28:38
y como mi condición es sobre C
00:28:40
si entra allí dentro no saldrá nunca
00:28:42
siempre que yo aquí hago una condición
00:28:44
sobre una cierta
00:28:47
variable
00:28:48
esta variable tiene que cambiar aquí dentro
00:28:50
porque si no cambia nunca
00:28:53
entro en el while, me quedaré en el while
00:28:55
al infinito o no entro
00:28:57
en el while y no entraré nunca
00:28:59
¿Me explico? Entonces aquí hay que
00:29:00
decirle, vale, ok, si lo que
00:29:03
has encontrado no es una letra
00:29:05
quítala y ahora
00:29:07
actualiza de cuál es el último carácter
00:29:09
es decir, vuelve a escribir esto
00:29:11
actualiza
00:29:13
cuál es el último carácter
00:29:15
ahora el último carácter
00:29:17
podría ser otra vez un punto o podría ser una O. Si es una O, has acabado el byte. ¿Se entiende?
00:29:19
Ahora funciona perfectamente. Medianamente funciona perfectamente. Sigue habiendo cosas raras.
00:29:27
En principio lo procesa bien. Pero no lo está actualizando del otro lado.
00:29:45
No, porque es siempre la última. Se actualiza solo por la S.
00:29:53
Básicamente lo que se hace con ese método es coger las palabras y dividirlas de derecha a izquierda.
00:30:06
O sea, primero por la derecha y luego por la izquierda, dejando solo la palabra y dando puntos y tal.
00:30:15
El trim es una cosa que lo hace para quitar espacios a la derecha o a la izquierda.
00:30:20
Si lo que me ha pillado es espacios, espacios, espacios, espacios, gato, espacios, espacios, espacios, me deja gato.
00:30:29
Quita los espacios a la derecha o a la izquierda.
00:30:35
No debería pasar, porque si tengo espacios, espacios, espacios, me debería dar como 3 palabras.
00:30:43
Ahora, aquí está pasando una cosa rarita, que es uno de los problemas de trabajar con string.
00:30:47
Si os fijáis, yo tengo una red de string.
00:31:00
Entonces, con esto estoy accediendo a cada uno de los string, a los objetos string, y lo modifico.
00:31:05
entonces técnicamente debería modificar ese objeto
00:31:14
y en splitted
00:31:17
ahora debería haber todos los objetos modificados
00:31:19
sin embargo si os fijáis al final yo devuelvo splitted
00:31:23
y lo que llega aquí
00:31:27
debería ser el splitted con todas las palabras limpiado
00:31:29
sin embargo no ha limpiado nada
00:31:40
Y esto es porque string es un medio objeto, es entre objeto y no objeto.
00:31:43
Yo creo que hace, si esto fueran alumnos y yo hubiese hecho modificaciones en alumnos, lo habría hecho.
00:31:54
Pero como string, a veces string se pasa como referencia y a veces se pasa por valor.
00:32:00
Y aquí probablemente cuando hace esta cosa de aquí, no está pillando la referencia desde dentro del objeto diciendo es este de aquí.
00:32:06
me ha estado haciendo una copia y entonces cuando yo la modifico aquí,
00:32:17
porque la estoy modificando sobre S, no se modifica en Splitted.
00:32:21
Y cuando devuelvo Splitted, Splitted es igual.
00:32:28
Si yo aquí lo pongo, si hizo
00:32:31
Arrays.DrawString Splitted, veréis que es
00:32:34
como al principio.
00:32:44
Veis, no ha hecho la limpia.
00:32:47
lo ha hecho sobre como una copia que es una cosa extraña es la razón de cuando
00:32:52
hacéis vosotros ejemplos o pruebas sobre objetos no uséis string como prueba de
00:32:56
objeto porque string se porta como le da la gana
00:33:03
string es un objeto es un semi objeto entonces como lo solucionó pues que esto
00:33:07
no me vale, creo otro string limpiado igual a new string de splitted.length, un array
00:33:16
del mismo tamaño, vale, y a este punto me compensa hacerlo como int i es igual a cero
00:33:36
i menor que splitted punto length i más más, es decir que string s es igual a splitted
00:33:52
de ahí y cuando lo he limpiado, taca taca taca taca taca taca, aquí añado al limpiado
00:34:05
d y ss y al final no devuelvo splitter, más devuelvo limpiado. Esto en vez que con arrays
00:34:15
con listas
00:34:34
de alguna forma
00:34:37
entonces ahora
00:34:38
ha encontrado
00:34:39
tres gatos, no obstante
00:34:45
la frase original
00:34:47
tenga gatos raros
00:34:48
tiene gatos punto
00:34:50
tiene gatos
00:34:52
con tres excavaciones
00:34:54
vale
00:34:56
ahora, yo con esto
00:34:59
suficiente para mi
00:35:02
vale, estaba trabajando un poquito
00:35:04
Entonces, seguro que si os ponéis allí, hay algunas combinaciones de cosas raras que no funcionan, ¿vale?
00:35:06
Si yo, por ejemplo, pongo esto, ya no me funciona, ¿sí?
00:35:14
Porque no pilla esto como dos palabras.
00:35:20
Para él, una palabra es esta, una palabra es esta, pues esta es una palabra única.
00:35:24
¿Sí? Entonces, debería meterme letra por letra a encontrar si tiene un espacio o cosa por el estilo,
00:35:29
o hacer una regex, una expresión regular más compleja de esta y decirle si es espacio,
00:35:37
si es punto, si es coma, si es lo que quiera, pues considerarlo como uno nuevo. Pero si quiero hacer
00:35:48
esto, pues busco esto sí, para estas cosas de aquí, una vez que lo he entendido, pues me voy
00:35:57
a la inteligencia artificial y le digo, oye, hazme un programita, que lo que hace es que te doy una
00:36:02
frase y él me separa las palabras, teniendo en cuenta que pueden haber puntos, y eso trabaja
00:36:07
bien. Y más o menos. ¿Más dudas?
00:36:14
Podríamos seguir con, vale, cuando me lo escribe lo quiero ordenado por algún tipo,
00:36:25
Entonces, cuando lo escriba aquí, lo quiero ordenado por palabra.
00:36:54
Si lo quiero por palabra, una opción relativamente fácil podría ser esta, creo.
00:37:06
Me gato, gustan, echo, los maravillosos, me mucho, son, vivan.
00:37:11
Perfecto, ¿vale?
00:37:37
¿Por qué? Porque estoy aprovechando
00:37:39
de que el stream map
00:37:41
ordena las cosas
00:37:43
dentro por su clave.
00:37:46
La clave es un string.
00:37:48
Los strings vienen ordenados alfabéticamente.
00:37:49
Pues, que no da.
00:37:52
Si quisiera por
00:37:57
esto,
00:37:59
a lo mejor la cosa sería un poquito más compleja.
00:38:01
Voy a ver mi hash map
00:38:11
porque es más rápido.
00:38:12
Entonces, una vez que he obtenido
00:38:16
esto, esto sería un ordenado, entonces ahora pillo set, reset, set, vamos a decir, sí,
00:38:18
Preset de integer ord es igual a new preset de frecuencia.get, no, .values, que no es la key, son los valores.
00:38:36
Ah, sí, perdón.
00:39:11
¿Vale?
00:39:12
Que, pero, no me permite.
00:39:14
No es...
00:39:16
Ah, venga.
00:39:18
Reset lo importo...
00:39:24
¡Ay!
00:39:26
Entonces, con esto
00:39:28
me ha creado un
00:39:30
conjunto de valores...
00:39:32
Me he equivocado.
00:39:34
Si lo hago así...
00:39:36
¡Ah! ¡Uf!
00:39:39
Porque...
00:39:43
Sí, no me interesa.
00:39:45
no puede estar
00:39:47
tened en cuenta que el triset
00:39:50
no me permite duplicados
00:39:52
entonces si hay gato que aparece
00:39:55
tres veces y cocodrilo que aparece
00:39:57
tres veces, pongo una sola vez
00:39:59
tres
00:40:01
pero no me vale, porque yo simplemente lo que intentaré
00:40:01
hacer es pillar la frecuencia
00:40:05
menor e ir a recorrerme
00:40:06
todo el map
00:40:09
a la búsqueda de esa frecuencia allí
00:40:10
si aparece tres veces, tres veces
00:40:13
y pondré las palabras
00:40:14
Pones ahí. Luego empezaré otra vez. Vale, ahora pillo la segunda frecuencia. Es nueve. Vale,
00:40:16
voy a buscar toda la que... ¿Entiendes? La frecuencia, si lo hago así, iría de menor a mayor.
00:40:23
Desde menores... desde frecuencia menor a frecuencia mayor. Si lo quiero hacer al revés,
00:40:38
No sé si el org.getlast... Sí, lo tengo. Tengo getlast, por lo tanto puedo trabajar con getlast.
00:40:45
Vale, entonces, will.org.cj mayor que cero, lo que hago es pillar int frecuencia actual es igual a org.getLast, ¿sí?
00:41:08
Y ahora, con esta frecuencia actual, tengo que recorrerme toda la red y preguntar cada una de las keys.
00:41:42
Y si tengo esto como frecuencia, pues entonces la añado a lo que tengo que escribir.
00:41:50
Tengo que escribirse a una lista.
00:42:00
Lista de string ordenados.
00:42:14
por frecuencia es igual a new ArrayList de Spring, tiquetito, ¿vale?
00:42:23
Entonces, tengo la frecuencia actual que estoy buscando.
00:42:34
Voy a recorrerme el array entero.
00:42:37
Entonces, iterator.it de string it es igual a frecuencia.get, no, .kset.iterator.
00:42:40
¿Sí?
00:43:08
Will
00:43:13
it.next
00:43:13
int
00:43:16
comprobar
00:43:26
es igual
00:43:29
a it.
00:43:31
punto
00:43:33
a frecuencia
00:43:33
necesito los string
00:43:36
string
00:43:43
comprobar
00:43:45
es igual a
00:43:47
y t.next
00:43:49
si
00:43:50
frecuencia
00:43:52
.get
00:44:00
comp
00:44:02
es igual
00:44:03
a frecat
00:44:05
entonces la palabra que estoy
00:44:07
mirando ahora tiene como frecuencia
00:44:11
exactamente la que estoy buscando
00:44:14
por lo tanto lo añado a la lista
00:44:15
que mi lista era
00:44:17
ordenados
00:44:19
por freq. Ordenados por freq.add y añado la palabra con dos puntos, con freq.add.
00:44:22
Se puede optimizar, sí, se puede hacer cosas raras. Lo que queda es el parámetro it. Este
00:44:42
es it2. It2, it2, it2. Se podría mejorar la... porque esto está buscando siempre todo
00:44:47
las mapas siempre todo las mapas siempre todas las mapas hasta hasta frecuencias que ya ha
00:44:57
encontrado pero no quiero machacar el quiero destruir el asma si quiero cuando lo encuentro
00:45:02
destruyó de nuevo esa par esa es entrada en toda la siguiente vez eso no lo contará porque estará
00:45:08
más para más pequeño ahora lo que sí voy quitando es desde esto justo porque esos son los valores
00:45:15
Entonces, yo pillo la primera y la elimino. Bueno, no. Sí, porque le he puesto esto. Entonces, lo que hago aquí, ahora será, una vez que he hecho esto de aquí, he pillado todas las frecuencias, elimino la última.
00:45:24
a menos que no me la haya quitado, esperad, y el last lo remuevo, no, no vale, entonces ahora lo remuevo, remove, remove, entonces esto me va destruyendo org, vale, de organizar un ordenador, que es esto,
00:45:57
Son todos los valores, entonces me va pillando siempre el último, me pilla el último, hace
00:46:29
lo que tiene que hacer con el último y lo quita, me pilla el último, hace lo que tiene
00:46:39
que hacer con el último y lo quita, etc.
00:46:43
Hasta que llega un momento en que ya no habrá valores ahí dentro, entonces se ha acabado.
00:46:46
Al cabo, este de aquí, con un poco de suerte, aquí dentro las tengo ordenadas por frecuencia
00:46:53
3, 3, pero esta palabra no está ordenada por, si quisiera ordenarla ahora, antes de
00:47:06
Y este de aquí podría ser list.sort, no, list.sort, no, collection, collections.sort de ordenados por frecuencia.
00:47:28
No, me lo meto.
00:47:54
Sería demasiado, sería demasiado.
00:47:55
Aquí quieres ordenarlo tanto alfabéticamente como por cantidad de...
00:47:58
Sería bastante más complejo. O sea que dentro de la misma frecuencia, me lo debería organizar en una lista de listas y cada frecuencia ponerlo en una lista y luego ordenar eso y luego después combinarla.
00:48:04
Pero ahora no tengo el poder psicológico para hacer esa cosa.
00:48:20
Eso no tienes.
00:48:24
Lo hacéis vosotros para el lunes.
00:48:27
Exacto.
00:48:29
Entonces, esto lo puedo complicar cuantos da la gana, esto es lo que deberíais hacer
00:48:30
vosotros para jugar con estas cosas, es decir, hago el ejercicio, vale, el ejercicio son
00:48:37
cuatro líneas de códigos, lo hemos visto al principio, y luego ponéis a decir, y si
00:48:41
quiero esto, y si quiero esto, y claro, es que a veces una tontería se puede explotar
00:48:44
desde una perspectiva computacional en el sentido de que requiere de todo lo posible
00:48:55
que esta cosa aquí que hemos hecho nosotros haya una forma de hacerla mucho más ligera elegante
00:49:00
porque si nos interesa es en la primera parte que es aquí fija la cosa hay otros contenidos
00:49:08
aquí
00:49:24
esta
00:49:25
a lo mejor se puede hacer
00:49:27
de una forma un poquito mejor
00:49:30
¿vale? porque aquí sostancialmente
00:49:32
es uno de esos casos que te dice
00:49:36
si estás
00:49:38
una cosa, si no estás otra
00:49:40
¿vale? entonces
00:49:42
dentro de frecuencia
00:49:44
tengo un par de
00:49:46
métodos que son el
00:49:50
UTF-ABSENT
00:49:52
y el GET
00:49:55
por default
00:49:57
que puede
00:49:58
que podrían
00:50:00
ayudarme
00:50:03
por ejemplo podría
00:50:04
utilizar esto
00:50:07
entonces decir
00:50:08
int
00:50:18
s es igual a esta
00:50:19
cosa
00:50:23
y luego esto
00:50:24
y luego esto
00:50:28
entonces esto me lo va a
00:50:30
pillar, va a pillar palabra
00:50:41
si lo encuentra me dará
00:50:44
al asociado con cuarta palabra. Me da la 3, yo le pongo 4 y lo vuelvo a poner. Ya está.
00:50:46
Si en vez no lo encuentra, me devuelve un valor por defecto. Este. Entonces me devuelve
00:50:52
0, le sumo 1, 1 y lo pongo. Esto se queda mucho más elegante de nuestro if esta cosa,
00:50:58
if esta cosa. Mucho más legible, mucho más limpio.
00:51:06
A lo mejor la misma cosa se puede hacer con el otro, que sería, el otro es el frecuencia.put y fabsafe.
00:51:11
Para poner una palabra que no existe sí, pero si ya existe no me lo actualizaría, por lo tanto esto no.
00:51:35
Debería preguntarme que si esta cosa aquí es null, pues entonces quiere decir que no la he metido, entonces la meto yo, pero mejor así.
00:51:51
Esto es más bonito.
00:51:59
Sí, fijaos que he cambiado el método. Si os fijáis aquí yo hago tres cosas.
00:52:04
Hago lo splitting, hago el añadir, hago el organizar.
00:52:09
Estos deberían ser tres métodos para que el main me quede con split a la frase o crea el HashMap, organiza el HashMap, organiza un poquito el main y luego los varios programas lo podrías hasta separar a programadores.
00:52:15
Decirle, mira, tienes que hacer un programa que te dan esto y tienes que devolver esto. Ya está. Luego lo integro con una vaga.
00:52:37
¿Sí? Esto debería seguir funcionando. Madrilla de programa. ¿Dudas? ¿Preguntas?
00:52:44
¿Hay alguna forma de poder ordenar los timers? Diciendo, o sea, me ve por la clave, por igual, tenemos que, por ejemplo, decirle tal interior de mejor interior, me puede decir, por ejemplo.
00:52:59
No, porque como está hecho el map, el map depende de la clave. La cosa importante del
00:53:16
map es la clave. Cuando eliges la clave, entonces sí que con el trimap te organiza por clave.
00:53:28
Pero como valor, no porque tendría menos sentido. Es como si tú haces un índice de
00:53:34
un libro y en vez de ordenarlo por las palabras, pues lo ordenas por la página, pues sería
00:53:42
el primer libro. Pero es que entonces, tu índice serían los números. Normalmente los
00:53:52
HashMaps, si lo has hecho con la clave correcta, son una maravilla, siempre te queda la posibilidad
00:54:02
Es decir, cuando insertas gato y su frecuencia, creas también otro ashmap donde hace la revés.
00:54:16
Que será un ashmap de frecuencia, entonces un integer y una lista de string.
00:54:27
Y lo que haces tú es pillar su frecuencia.
00:54:35
Si ya existe esa frecuencia, lo añades así.
00:54:37
Pero es un...
00:54:40
Porque si lo encuentras otra vez, lo tienes que...
00:54:41
Imagínate, tú gato lo tienes tres veces.
00:54:43
Pues lo deberías añadir a la lista de palabras que se han encontrado tres veces.
00:54:45
Ahora, si lo encuentras otra vez, lo tienes que quitar desde la lista de tres y ponerlo en la lista de cuatro.
00:54:50
Por ejemplo, con cierto cuidado.
00:54:56
Pero lo podrías hacer y al final tendrías dos SashMap.
00:55:01
Uno que te permite buscar por palabra su frecuencia y uno que te permite, dada una frecuencia, buscar cuántas palabras tienen esa frecuencia.
00:55:04
El problemilla aquí es que en el caso de palabras, hay muchas palabras con frecuencia
00:55:16
la que sea, pero las palabras son distintas, entonces se diferencian.
00:55:23
En el otro caso, muchas palabras aparecen pocas veces, entonces a lo mejor tendrías
00:55:28
listas muy largas de 1, 2, 3, 4, entonces luego no sé cuánto... te volverías a recorrer
00:55:34
listas grandes, porque sí.
00:55:43
- 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:
- 1
- Fecha:
- 6 de marzo de 2026 - 14:03
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 55′ 51″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 468.57 MBytes