2013-05-06 17 views
6

Supponiamo di avere due array che assomigliano a questo:ordina un array in base agli elementi di un secondo array

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

voglio ordinare il primo array, e l'ordine degli elementi del secondo array deve cambiare allo stesso modo come il primo array, quindi l'ordine dei due diventa la seguente:

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

Tutte le idee su come farlo in Perl?

risposta

10

È necessario ordinare gli indici nella matrice. Ti piace questa uscita

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

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

Mi sembra come i compiti di @Abdel? :) –

+0

Haha, no questo non è compito, ho solo semplificato un problema reale che ho :) Grazie per la risposta, funziona perfettamente! – Abdel

+0

cosa sono $ a e $ b? cos'è 0? –

2

risposta di Borodin è una risposta eccellente e la maggior parte la Perl alla tua domanda. Mi viene in mente che la struttura dei dati suggerisce che un hash potrebbe essere utile, quindi ecco un esempio di collegamento dei dati tramite un hash e ordinamento in questo modo.

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

È possibile utilizzare un hash. Utilizzare i valori dal primo array come chiavi per i valori presi dal secondo array. Quindi basta fare un foreach my $key (sort keys %the_hash) { do stuff }. Se i valori chiave non sono univoci, utilizzare un hash di array e inserire i valori nell'hash funziona.

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