Perl en Español

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

Eliminar elementos repetidos de array

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Dom Abr 06, 2008 1:24 am
xagutxu_perez
Perlero Nuevo
Perlero Nuevo
Registrado: 04 Abr 2008
Mensajes: 43
Eliminar elementos repetidos de array Responder citando

Hola a todos:

Tengo un problemilla con el cual me gustaría que me ayudarais. Tengo un array de cadenas de caracteres (de unos 200 elementos), y quisiera eliminar los elementos que están repetidos; la cadena consta, más o menos de 75 elementos diferentes, y quisiera crear otro array con esos 75 elementos, partiendo del de 200.
¿Alguien conoce una forma óptima de hacer eso? Estoy intentando con 'for' anidados, pero tarda relativamente mucho en procesar...

Gracias,

Xagutxu
Mensaje Dom Abr 06, 2008 5:35 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Tu mismo has dado la solución:
Perl:
foreach $caracter ( @array ) {
    push @nuevo_array, $caracter if not $visto_antes{$caracter}++;
}
Mensaje Dom Abr 06, 2008 12:01 pm
xagutxu_perez
Perlero Nuevo
Perlero Nuevo
Registrado: 04 Abr 2008
Mensajes: 43
if not Responder citando

Gracias, pero me queda una pequeña duda (perdón por mi ignorancia):

¿Qué hace la parte del "if not"? No entiendo muy bien la condición...

Gracias de nuevo,

Xagutxu
Mensaje Dom Abr 06, 2008 12:15 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Perl:
push @nuevo_array, $caracter if not $visto_antes{$caracter}++;

"Guarda en el @nuevo_array el $caracter si no se ha %visto_antes ese $caracter".

En esa línea, primero se ejecuta la parte del 'if' para ver si debemos guardar el carácter o no. En el 'if', primero miramos el valor de $visto_antes{ $caracter }. Esto es un elemento del hash %visto_antes.

Si un $caracter, es la primera vez que le vemos, entonces $visto_antes{ $caracter } será 0 (más bien, será nulo, porque no existirá). Entonces, con el efecto contrario del 'not', se invierte la condición, y se activa positivamente el 'if', guardando el $caracter en @nuevo_array. Luego, incrementa (++) el valor $visto_antes{$caracter} (que valdrá, lógicamente, 1).

Si un $caracter, NO es la primera vez que le vemos, entonces $visto_antes{ $caracter } será 1 (puesto por el efecto de incremento comentado antes). Por el 'not', se invierte el resultado, y el 'if' falla, por lo que el $caracter no se guarda.
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