2013-05-06 9 views
6

nehme ich zwei Arrays haben, die wie folgt aussehen:sortieren Anordnung nach Elementen einer zweiten Anordnung

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

Ich möchte das erste Array sortieren, und die Reihenfolge der Elemente in dem zweiten Feld sollte in verändern die gleiche Art und Weise wie das erste Array, so dass die Reihenfolge der beiden wird wie folgt dar:

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

Irgendwelche Ideen, wie das in Perl zu tun?

Antwort

10

Sie müssen die Indizes in das Array sortieren. Gefallen Sie diesen

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"; 

Ausgang

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

Es sieht für mich aus wie @Abdel Hausaufgaben? :) –

+0

Haha, nein, das ist keine Hausaufgabe, ich habe nur ein aktuelles Problem vereinfacht, das ich habe :) Danke für die Antwort, es funktioniert perfekt! – Abdel

+0

Was ist $ a und $ b? Was ist 0? –

2

Borodins Antwort ist eine ausgezeichnete und die meisten Perlish Antwort auf Ihre Frage. Es fällt mir ein, dass die Struktur Ihrer Daten darauf hindeutet, dass ein Hash nützlich sein könnte. Hier ist ein Beispiel, wie Sie die Daten über einen Hash-Code in Beziehung setzen und auf diese Weise sortieren können.

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

Sie könnten einen Hash verwenden. Verwenden Sie Werte aus dem ersten Array als Schlüssel für Werte, die aus dem zweiten Array stammen. Dann mach einfach eine foreach my $key (sort keys %the_hash) { do stuff }. Wenn die Schlüsselwerte nicht eindeutig sind, dann wird ein Hash von Arrays verwendet und die Werte in den Hash-Wert geschoben.

#! 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"; 
    } 
}