假设我有两个如下所示的数组:
('1', '6', '8', '4', '5')
('a', 'c', 'd', 'f', 'w')
我要对第一个数组进行排序,第二个数组中元素的顺序应该和第一个数组一样变化,所以两者的顺序变成如下:
('1', '4', '5', '6', '8')
('a', 'f', 'w', 'c', 'd')
关于如何在 Perl 中做到这一点的任何想法?
假设我有两个如下所示的数组:
('1', '6', '8', '4', '5')
('a', 'c', 'd', 'f', 'w')
我要对第一个数组进行排序,第二个数组中元素的顺序应该和第一个数组一样变化,所以两者的顺序变成如下:
('1', '4', '5', '6', '8')
('a', 'f', 'w', 'c', 'd')
关于如何在 Perl 中做到这一点的任何想法?
您需要将索引排序到数组中。像这样
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
你可以使用哈希。使用第一个数组中的值作为从第二个数组中获取的值的键。然后只做一个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";
}
}
Borodin 的回答是对您的问题的出色和最 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";