2013-05-06 17 views
6

Załóżmy, że mam dwie tablice, które wyglądają tak:Sortuj tablicę według elementów drugiej tablicy

('1', '6', '8', '4', '5') 
('a', 'c', 'd', 'f', 'w') 

Chcę uporządkować pierwszej tablicy i kolejność elementów w drugiej tablicy powinno się zmienić w w ten sam sposób, co pierwsza tablica, więc kolejność tych dwóch elementów jest następująca:

('1', '4', '5', '6', '8') 
('a', 'f', 'w', 'c', 'd') 

Jakieś pomysły, jak to zrobić w Perlu?

Odpowiedz

10

Musisz posortować w tablicy tablice indeksów. Podoba Ci się to

use strict; 
use warnings; 

my @aa = qw/ 1 6 8 4 5 /; 
my @bb = qw/ a c d f w /; 

my @idx = sort { $aa[$a] <=> $aa[$b] } 0 .. $#aa; 

@aa = @aa[@idx]; 
@bb = @bb[@idx]; 

print "@aa\n"; 
print "@bb\n"; 

wyjściu

1 4 5 6 8 
a f w c d 
+1

Wygląda mi na zadanie domowe @Abdel? :) –

+0

Haha, nie to nie jest praca domowa, po prostu uprościłem faktyczny problem, który mam :) Dzięki za odpowiedź, działa idealnie! – Abdel

+0

co to są $ ai $ b? co to jest 0? –

2

odpowiedź Borodina jest doskonałym i najbardziej Perlish odpowiedź na swoje pytanie. Przyszło mi do głowy, że struktura twoich danych sugeruje, że hasz może być użyteczny, więc tutaj jest przykład powiązania danych przez haszowanie i sortowanie w ten sposób.

use strict; 
use warnings; 
use List::MoreUtils qw(mesh); 

my @aa = qw/ 1 6 8 4 5 /; 
my @bb = qw/ a c d f w /; 

my %x = mesh @aa, @bb; 
print join(" ", sort keys %x), "\n"; 
print join(" ", @x{sort keys %x}), "\n"; 
3

Można użyć skrótu. Użyj wartości z pierwszej tablicy jako kluczy do wartości pobranych z drugiej tablicy. Następnie po prostu zrób foreach my $key (sort keys %the_hash) { do stuff }. Jeśli wartości kluczy nie są unikalne, użyj tablic asocjacyjnych i przenieś wartości do haszu.

#! perl 
use strict; 
use warnings; 

my @key_data = ('1', '6', '8', '4', '5', '4', '5'); 
my @val_data = ('a', 'c', 'd', 'f', 'w', 'z', 'w'); 

my %the_hash; 

for (my $ii=0; $ii<=$#key_data; $ii++) { 
    push @{$the_hash{$key_data[$ii]}}, $val_data[$ii]; 
} 

for my $key (sort keys %the_hash) { 
    print "key $key\n"; 
    foreach my $val (@{$the_hash{$key}}) { 
     print "  $val\n"; 
    } 
}