2013-05-06 133 views
6

假設我有兩個陣列看起來像這樣的元素的數組:排序根據第二陣列

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

欲第一陣列,和元件的第二陣列中的次序應該改變排序以同樣的方式爲第一陣列,因此兩者的順序爲如下:

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

如何做到這一點在Perl任何想法?

回答

10

您需要將指數排序到數組中。像這樣

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

它看起來像我@Abdel家庭作業? :) – 2013-05-06 11:43:35

+0

哈哈,不,這不是作業,我只是簡化了一個實際的問題,我有:) 感謝您的答案,它完美的作品! – Abdel 2013-05-06 11:50:41

+0

什麼是$ a和$ b?什麼是0? – 2018-01-23 09:23:58

2

鮑羅廷的答案是你的問題一個優秀的和最Perlish的響應。我確實發現數據的結構表明一個散列可能是有用的,所以這裏是一個通過散列和以這種方式排序數據的例子。

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

你可以使用散列。使用第一個數組中的值作爲從第二個數組中取得的值的鍵。然後就做一個foreach my $key (sort keys %the_hash) { do stuff }。如果鍵值不唯一,則使用數組的散列並將值推入散列工作。

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