Foros del Web » Programación para mayores de 30 ;) » Programación General »

duda sobre organizar elementos

Estas en el tema de duda sobre organizar elementos en el foro de Programación General en Foros del Web. hola a todos tengo en un programa un arreglo (@elementos) con el siguiente formato: 1::pedro:: 2::julio:: 3::alvaro:: 4::andres:: 5::zapata:: 6::yamile:: como puedo crear un arreglo ...
  #1 (permalink)  
Antiguo 29/05/2008, 09:07
 
Fecha de Ingreso: octubre-2007
Mensajes: 56
Antigüedad: 16 años, 6 meses
Puntos: 0
duda sobre organizar elementos

hola a todos

tengo en un programa un arreglo (@elementos) con el siguiente formato:

1::pedro::
2::julio::
3::alvaro::
4::andres::
5::zapata::
6::yamile::

como puedo crear un arreglo (@elementos2) que tenga los elementos arreglados por la segunda columna en orden alfabetico ?

de la siguiente manera:


3::alvaro::
4::andres::
2::julio::
1::pedro::
6::yamile::
5::zapata::


Gracias por la colaboracion (en perl )

Última edición por charlygarcia; 29/05/2008 a las 09:10 Razón: equivocacion
  #2 (permalink)  
Antiguo 29/05/2008, 09:36
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Respuesta: duda sobre organizar elementos

Una pregunta, no sería mejor tenés un hash ? de la forma

my %elementos = (1 => 'pedro', 2 => 'julio'...);

así puedes fácilmente ordenarlo por nombre o por valor...

Espero que te sirva

Saludos
__________________
Esteban Quintana
  #3 (permalink)  
Antiguo 29/05/2008, 14:56
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 524
Antigüedad: 18 años
Puntos: 11
Respuesta: duda sobre organizar elementos

Usando una transformada de Schwartz:

Código:
#!/usr/bin/perl
use warnings;
use strict;

my @elementos = qw(
    1::pedro::
    2::julio::
    3::alvaro::
    4::andres::
    5::zapata::
    6::yamile::
);

my @elementos2
    =  map  { $_->[1]                 }
       sort { $a->[0] cmp $b->[0]     }
       map  { [ (split q{:})[2], $_ ] }
       @elementos;

print "@elementos\n";
print "@elementos2\n";
Sale:
Código:
1::pedro:: 2::julio:: 3::alvaro:: 4::andres:: 5::zapata:: 6::yamile::
3::alvaro:: 4::andres:: 2::julio:: 1::pedro:: 6::yamile:: 5::zapata::
  #4 (permalink)  
Antiguo 30/05/2008, 12:16
 
Fecha de Ingreso: octubre-2007
Mensajes: 56
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: duda sobre organizar elementos

gracias jferrero, se nota que eres un gran experto en esto de perl, tratare de probar el codigo que das, y nuevamente te agradezco mucho.

Pero te hago otra pregunta:



veo que en este codigo empleas dos modulos, son estrictamente necesarios ?

use warnings;
use strict;

Como lo harias sin modulos ?
  #5 (permalink)  
Antiguo 30/05/2008, 12:43
 
Fecha de Ingreso: octubre-2007
Mensajes: 56
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: duda sobre organizar elementos

jferrero:

en realidad eres un gran programador y respondes las dudas, sin plantear nuevas dudas, el codigo que me diste me funciono de maravilla, ademas me enseñaste algo nuevo sobre organización, algo que no sabia que existia, la

transformada de Schwartz, no tengo palabras para agradecerte nuevamente, tal vez la unica manera sea demostrarte mi admiracion publica por ser tan excelente programador, mi programa funciona correctamente gracias a tu ayuda.

Carlos A
  #6 (permalink)  
Antiguo 02/06/2008, 06:45
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Respuesta: duda sobre organizar elementos

Cita:
use warnings;
use strict;
Sin esos módulos te funcionaría igual, pero es preferible usarlos, el strict es para estar obligado a declarar correctamente las variables con my...entre otras cosas...

http://perlenespanol.baboonsoftware....se_strict.html

Más info...

Saludos
__________________
Esteban Quintana
  #7 (permalink)  
Antiguo 03/06/2008, 01:22
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 524
Antigüedad: 18 años
Puntos: 11
Respuesta: duda sobre organizar elementos

Cita:
Iniciado por charlygarcia Ver Mensaje
el codigo que me diste me funciono de maravilla, ademas me enseñaste algo nuevo sobre organización, algo que no sabia que existia, la transformada de Schwartz
Si no entiendes algo del código, pregúntalo. Pero no lo uses tal cual te lo he dado, porque entonces no podrás aprovecharlo para otros casos que se te presenten en el futuro.
  #8 (permalink)  
Antiguo 03/06/2008, 10:48
 
Fecha de Ingreso: octubre-2007
Mensajes: 56
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: duda sobre organizar elementos

Hola a todos

El codigo me funciono muy bien (gracias) pero tengo una pregunticas:

my @elementos2
= map { $_->[1] }
sort { $a->[0] cmp $b->[0] }
map { [ (split q{:})[2], $_ ] }
@elementos;


el primer map dice que vamos a trabajar con la segunda columna si o no ?

el segundo map usa un split con split q{:})[2] quiere decir que se parte por donde encuentre '::' ?

Mejor dicho ya me funciono, pero si jferrero pudiera regalarnos una explicadita seria muy bueno para poder utilizarlo luego en otras cirscunstancias.


Gracias
  #9 (permalink)  
Antiguo 03/06/2008, 13:45
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 524
Antigüedad: 18 años
Puntos: 11
Respuesta: duda sobre organizar elementos

Código:
my @elementos2
    =  map  { $_->[1]                 }
       sort { $a->[0] cmp $b->[0]     }
       map  { [ (split q{:})[2], $_ ] }
       @elementos;
Hay que leer la transformada de abajo hacia arriba.

Los @elementos son pasados, uno a uno, al conjunto map-sort-map.

El primer map (empezando por abajo), lo que hace es mapear cada elemento ($_) en algo muy extraño: un array anónimo ([]) que contiene dos elementos. El segundo elemento de este array es el propio elemento $_. El primer elemento es algo más complicado.

Ese primer elemento, lo que hace es un split() usando ':' como separador. El resultado de un split es una lista de valores. Esos valores quedan encerrados entre los paréntesis, convirtiéndolos en un "array". De ese array ficticio, solo nos quedamos con el tercer elemento (2). Es decir, nos quedamos con el tercer campo de cada elemento $_, que son los nombres por los que queremos ordenar.

Cada mapeo resulta entonces en algo como
Código:
[ 'pedro', '1::pedro::' ]
El siguiente paso es pasar todos estos nuevos arrays al sort. En el sort, se reciben en $a y $b los elementos a comparar, y nosotros tenemos que decir cómo se comparan esos elementos.

Como $a y $b son arrays anónimos, no podemos compararles tal cual. Solo queremos comparar el primer elemento de cada array. Por eso escribimos
Código:
$a->[0]
La indirección '->' nos mete dentro del array anónimo referenciado por $a. Y de ese array, nos quedamos con el primer elemento ([0]). Que son, justamente, los nombres.

La comparación entre esos dos nombres, la haremos alfanuméricamente, por lo que usaremos 'cmp'.

El resultado después del sort son todos los arrays anónimos, ordenados por los nombres.

Ahora hay que hacer el proceso inverso del primer map, con un segundo map. Este map recibe los arrays anónimos, en el orden que nos interesa, pero de los que solo nos interesa el segundo elemento ([1]) que, al final, eran los elementos originales de los que partíamos.

Uno a uno, se van guardando en @elemento2.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:38.