按照第二个数组的元素对一个数组进行排序

11
假设我有两个类似下面这样的数组:
('1', '6', '8', '4', '5')
('a', 'c', 'd', 'f', 'w')

我想要对第一个数组进行排序,同时第二个数组中的元素顺序也应按照第一个数组的排序方式发生变化,以使两个数组的顺序如下:

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

有没有在Perl中实现这个的想法?
3个回答

19

你需要把 索引 按照数组中的顺序排列。就像这样

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

哈哈,这不是作业,我只是简化了一个我真正遇到的问题 :) 谢谢你的答案,它完美地解决了我的问题! - Abdel
1
$a和$b是什么?0是什么? - Eli Borodach

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

2

Borodin的回答是对你问题的一个非常优秀和典型的Perl响应。我认为你的数据结构表明哈希表可能会有用,所以这里提供一个通过哈希表关联数据并进行排序的示例。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接