Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Eliminar item vector

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Vie May 12, 2006 2:22 am
dacons
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Feb 2006
Mensajes: 48
Eliminar item vector Responder citando

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?
Mensaje Vie May 12, 2006 5:08 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Vie May 12, 2006 6:59 am
dacons
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Feb 2006
Mensajes: 48
Responder citando

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
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group