• Publicidad

hash con n niveles

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: hash con n niveles

Notapor explorer » 2009-09-24 03:48 @200

Si, suponemos, que de la tabla tenemos que sacar las secuencias enlazadas por los id, entonces, en el caso de un
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
id      nivel   descripcion     pcelementobalanceid
1       2       aaaaa           0
2       2       zzzzz           1
3       2       yyyyy           2
4       3       xxxxx           3
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

al recorrerlo, de arriba abajo, tendríamos esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$hash{1} = 'aaaaa';
$hash{2}{1} = 'aaaaa';
$hash{3}{2}{1} = 'aaaaa';
$hash{4}{3}{2}{1} = 'aaaaa';
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

que no sabemos si es lo que también quieres, porque acabamos de generar 4 elementos distintos para el hash %hash.

Mi programa hace esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$hash{4} = 'xxxxx';
$hash{4}{3} = 'yyyyy';
$hash{4}{3}{2} = 'zzzz';
$hash{4}{3}{2}{1} = 'aaaaa';
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Que el resultado final es el mismo, pero lo hace a base de "pisar" las claves que va encontrando.

Si mi programa "pisa" claves ya visitadas es muy probable que sea debido a que está mal hecha la recursión, o que no acabo de entender el problema final, el porqué de todo esto.

Le daré otra vuelta. Yo supongo que la solución será un proceso destructivo-constructivo-recursivo, siempre y cuando los conjuntos de id sean disjuntos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: hash con n niveles

Notapor anibalmauricio » 2009-09-24 11:47 @532

Hola Joaquín. Te agradezco por la colaboración y ayuda que me has brindado.

ej jerarquia.jpg
Espero que con este ejemplo puedas entenderme mejor
ej jerarquia.jpg (24.85 KiB) Visto 461 veces


Con esta imagen tal vez se aclare mucho más lo que debo hacer. Básicamente es un árbol de relaciones. Lo que debo hacer es vincular a cada padre su hijo. Lo que pensé fue en crear un hash de n niveles o ¿tú crees que haya una forma más fácil, simple o sencilla de hacer esto?

Con el hash armado debo generar una grilla de movimientos, cada uno vinculado al otro, no sé si me entiendes.

¿Es así como lo ves? ¿Lo imaginaste de una forma diferente?

Cordial saludo.
anibalmauricio
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2009-09-23 10:46 @490

Re: hash con n niveles

Notapor explorer » 2009-09-24 13:48 @616

Se podría hacer tanto con un hash como con un array.

¿Qué es una grilla de movimientos?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: hash con n niveles

Notapor anibalmauricio » 2009-09-24 14:14 @635

Bueno, en nuestro "léxico de trabajo", :lol: :lol: :lol:, una grilla de movimientos es básicamente una tabla HTML en donde debo traer los datos de las cuentas (cualquier dato) y llenar la tabla.

Me hizo falta comentarte que la cantidad de niveles es n, es decir, no lo conocemos, todo depende de la tabla de configuración. Según la cantidad de niveles que haya en esta tabla entonces ese será el máximo de niveles o nodos que tenga el árbol.

PD: La imagen te muestra más o menos como debe quedar la estructura de la grilla (tabla). Nota que tiene una especie de sangrías dependiendo del nivel.
Adjuntos
ej tabla.jpg
Ejemplo de tabla.
ej tabla.jpg (14.52 KiB) Visto 454 veces
anibalmauricio
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2009-09-23 10:46 @490

Re: hash con n niveles

Notapor explorer » 2009-10-04 13:25 @601

Bueno, el caso es que es fácil la solución, pero requiere pensar un poco en cómo organizar los datos que se van leyendo.

Lo normal es leer todo el fichero, primero, para crear un hash en donde guardaremos la información de cada nodo.

Luego, recorremos todas las claves mientras tengamos cambios en el árbol que vamos a construir.

La construcción del árbol se basa en recorrer de forma recursiva siguiendo los enlaces, destruyendo nodos a medida de que los vamos enlazando con los demás.

Otra forma de hacerlo... es usar una librería ya hecha :)

Supongamos que tenemos este fichero de entrada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
id      descripcion     pcelementobalanceid
T1      titulo1         0
C1      capitulo1       T1
C2      capitulo2       T1
G1      grupo1          C1
G2      grupo2          C1
S1      subgrupo1       G1
S2      subgrupo2       G2
PCORUS1 pcorus1         S1
PCORUS2 pcorus2         S2
G3      grupo3          C2
PCORUS3 pcorus3         G3
T2      titulo2         0
C3      capitulo3       T2
G4      grupo4          C3
PCORUS4 pcorus4         G4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Entonces, con este programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use Tree::Numbered::Tools;
  7. #use Data::Dumper;
  8.  
  9. my @array;
  10. my %hash;
  11.  
  12.  
  13. open my $fichero, '<kk.txt';
  14.  
  15. <$fichero>;
  16. push @array, [1, 0, 'ROOT', 'ROOT'];
  17. $hash{0}   = [1, 0, 'ROOT', 'ROOT'];
  18.  
  19. my $numero_nodo = 2;
  20. while (<$fichero>) {
  21.     chomp;
  22.     my ($id, $descripcion, $padre) = split " ";
  23.     $hash{$id} = [$numero_nodo++, $descripcion, $padre];
  24. }
  25.  
  26. #print Dumper \%hash;
  27. #print "=" x 40, "\n";
  28.  
  29. for my $id (keys %hash) {
  30.     next if $id eq '0';
  31.     push @array, [ $hash{$id}[0], $hash{$hash{$id}[-1]}[0], $hash{$id}[1] ];
  32. }
  33. close $fichero;
  34.  
  35. #print Dumper \@array;
  36.  
  37. my $tree = Tree::Numbered::Tools->readArray(
  38.                 arrayref            => \@array,
  39.                 use_column_names    => 0,
  40. );
  41.  
  42. # Pintar el árbol
  43. foreach ($tree->listChildNumbers) {
  44.     print $_, " ", join(' -- ', $tree->follow($_,"Value")), "\n";
  45. }
  46.  
  47. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

obtenemos esta salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2 titulo1
4 titulo1 -- capitulo1
6 titulo1 -- capitulo1 -- grupo1
9 titulo1 -- capitulo1 -- grupo1 -- subgrupo1
11 titulo1 -- capitulo1 -- grupo1 -- subgrupo1 -- pcorus1
7 titulo1 -- capitulo1 -- grupo2
10 titulo1 -- capitulo1 -- grupo2 -- subgrupo2
12 titulo1 -- capitulo1 -- grupo2 -- subgrupo2 -- pcorus2
5 titulo1 -- capitulo2
8 titulo1 -- capitulo2 -- grupo3
13 titulo1 -- capitulo2 -- grupo3 -- pcorus3
3 titulo2
14 titulo2 -- capitulo3
15 titulo2 -- capitulo3 -- grupo4
16 titulo2 -- capitulo3 -- grupo4 -- pcorus4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

que ya es fácilmente trasladable a una estructura en forma de tabla. Solo hay que traducir el número de hijos en cada nodo por el número de celda que tenemos que escribir.

Aquí usamos Tree::Numbered::Tools para la creación del árbol. Pero hay que hacer un trabajo previo porque el formato de entrada no es como lo espera el módulo.

Incluso se puede usar algún módulo como Data::Format::HTML o Data::Table para generar el HTML final.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 22 invitados