2010-10-26 11 views
3

I ont une structure de données comme suitComment trier plusieurs tableaux selon un tableau?

@colors = qw(red blond green); 
@numbers = qw(349 1234.5678 3.14159265); 
@hats = qw(fedora porkpie bowler); 
my %hash = (colors => \@colors, numbers => \@numbers, hats => \@hats); 

Je souhaite régler ce en fonction des valeurs de l'un des réseaux, le maintien de l'association d'éléments de réseau parallèles. Autrement dit, si j'échange $hash{numbers}[2] et l'index $hash{numbers}[3], je veux faire le même échange pour tous les autres tableaux dans le hachage. Dans ce cas, si je sort {$a <=> $b} sur numbers:

$sorted{numbers} = [3.14159265, 349, 1234.5678]; 
$sorted{colors} = ["green", "red", "blond"]; 
$sorted{hats} = ["bowler", "fedora", "porkpie"]; 

La solution que je utilise maintenant la structure intervertit de %hash dans un tableau où $array[$i]{$k} == $hash{$k}[$i], ne @sorted = sort {$a->{numbers} <=> $b->{numbers}} @array, puis convertit @sorted retour de tableau de hachages à hachage de tableaux .

Je ne m'inquiète pas vraiment si le tri est stable, je me demande juste s'il y a une meilleure manière de le faire.

+0

BTW j'ai trouvé d'autres questions similaires (http://stackoverflow.com/questions/762399/sort-by-value-hash-of-hash-of-hashes-perl http://stackoverflow.com/ questions/827105/how-can-i-sort-perl-hashes-dont-values-are-array-references) mais je ne pense pas que ce soit la même chose. – flies

+0

Transformer les lignes en colonnes, puis trier? par exemple. '[[349 fedora rouge], ...]' La structure de données générale semble difficile à traiter. Je le changerais probablement. –

+0

@pst c'est la solution que je décris dans ma question. – flies

Répondre

9

Voici un truc que j'ai utilisé.

my @permutation = sort { $numbers[$a] <=> $numbers[$b] } (0..$#numbers); 
@colors = @colors[@permutation]; 
@numbers = @numbers[@permutation]; 
@hats = @hats[@permutation]; 
# No change to %hash needed, since it has references to above arrays. 
+2

Je pense que vous feriez mieux de repenser votre structure de données, par ex. utiliser un tableau de hachages à la place d'un hachage de tableaux. Mais si vous devez trier les "enregistrements" répartis sur plusieurs tableaux, c'est le moyen de le faire. – cjm

+0

J'ai demandé à mon collègue qui utilise python et c'était sa suggestion, seulement en python il utiliserait 'argsort' pour le faire. – flies