Vie May 12, 2006 2:22 am
|
 |
dacons
Perlero Nuevo

|
Registrado: 27 Feb 2006
Mensajes: 48
|
|
| Eliminar item vector |
|
|
Hola, ¿que tal?
Tengo un programa que recorre un vector y compara las palabras para contar el número de veces que aparece cada palabra, el problema está en que luego quiero meter en una lista la palabra y el número y no quiero que salgan palabras repetidas.
| Código: |
for ($i=0; $i<=$#@palabras; $i++){
$cont=0;
for($j=0; $j<=$#@palabras; $j++){
if($palabra[$i] eq $palabra[$j]){
$cont++;
}
}
}
|
pero así saldrían repetidas. ¿Cómo puedo eliminar las palabras que ya he contado? |
|
|
|

Vie May 12, 2006 5:08 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
|
|
|
|
|
El array de palabras lo recorres en dos bucles anidados, por lo que es posible que te encuentres, efectivamente, contando palabras que habías visto en la pasada anterior.
Una forma de arreglarlo primero es que el bucle interior no recorra desde el principio del array, sino en la palabra siguiente a la que estamos analizando:for($j=$i+1; $j<=$#palabras; $j++){, para evitar duplicaciones, pero estaríamos con el mismo problema en cuanto a las posibles palabras duplicadas que existan al final del array.
Una forma de resolverlo puede ser esta: cada vez que encontremos una palabra igual a la que estamos buscando, la borramos:$palabras[$j] = ""; y de esa manera no la contaremos cuando el bucle principal llegue a su nivel. Naturalmente, hay que tener en cuenta dos cosas: el array queda modificado y, además, hay que saltarse la comprobación de elementos nulos:next if $palabras[$i] eq "";. Si no nos preocupa que el vector quede modificado, entonces la solución será:
| Código: |
#!/usr/bin/perl
use warnings;
@palabras = do { open F,"<kk.txt"; <F> };
for ($i=0; $i<=$#palabras; $i++) {
next if $palabras[$i] eq "";
$cont=1;
for($j=$i+1; $j<=$#palabras; $j++) {
if($palabras[$i] eq $palabras[$j]) {
$cont++;
$palabras[$j] = "";
}
}
print "La palabra $palabras[$i] sale $cont veces\n";
} |
Si nos interesa mantener el array, lo que podemos hacer es que antes de entrar en el bucle, copiamos ese array a otro:@copia = @palabras.
De todas formas, en Perl, este problema es el mejor ejemplo para mostrar el funcionamiento de las variables hash, pues le vienen muy bien a este caso.
Si tenemos un fichero kk.txt:
| Código: |
abobábamos
abobaban
abobabais
abobabas
abobad
abobada
abobado
abobadas
abobados
abobaban
abobabais
abobabas
abobad |
entonces con un programa así:
| Código: |
1 #!/usr/bin/perl -l
2 use warnings;
3 use strict;
4
5 my @palabras = do { open F,"<kk.txt"; <F> };
6 my %palabras_unicas;
7
8 foreach my $palabra ( @palabras ) {
9 chomp $palabra;
10 $palabras_unicas{$palabra}++;
11 }
12
13 foreach my $palabra ( sort keys %palabras_unicas ) {
14 print "La palabra $palabra sale $palabras_unicas{$palabra} veces";
15 } |
obtenemos como salida:
| Código: |
La palabra abobabais sale 2 veces
La palabra abobaban sale 2 veces
La palabra abobabas sale 2 veces
La palabra abobad sale 2 veces
La palabra abobada sale 1 veces
La palabra abobadas sale 1 veces
La palabra abobado sale 1 veces
La palabra abobados sale 1 veces
La palabra abobábamos sale 1 veces |
Explicación:en la línea 5 leemos el fichero y lo metemos en el array. En la línea siguiente definimos la variable hash que nos guardará las palabras únicas.
En el bucle de las líneas 8 a 10 recorremos el array, quitamos el final de línea de cada palabra (chomp) y la guardamos en el hash, aumentando en uno (++) las veces que aparece. Si es una palabra repetida, lo que estamos haciendo es incrementar ese valor de hash en uno.
En el siguiente bucle, pintamos las palabras que hemos encontrado, ordenadas alfabéticamente (sort) junto con las veces que aparecen. |
|

Vie May 12, 2006 6:59 am
|
 |
dacons
Perlero Nuevo

|
Registrado: 27 Feb 2006
Mensajes: 48
|
|
|
|
|
ya lo solucione, pero con los dos for anidados y otro vector con un copia de las palabras ya leidas.
Tu explicación es muchisimo más sencilla y más eficiente que lo que yo he hecho,
Muchisimas gracias una vez más |
|
Powered by phpBB © 2001, 2005 phpBB Group
|