如何在Perl中返回排序列表的索引?

时间:2013-08-08 11:25:41

标签: perl

说,我有一个清单:

@abc = (5,7,6,2,7,1);

我必须获得一个排序列表以及一个排序列表索引。所以输出将是:

@sorted_list = (7,7,6,5,2,1);
@sorted_list_index = (1,4,2,0,3,5);

我也在寻找一个非常有效的方法解决这个问题,因为我实际上正在处理一个包含2 ^ 16个条目的长列表。

2 个答案:

答案 0 :(得分:12)

如果要对索引进行排序,则需要生成它们

0..$#unsorted

然后你将它们排序为其他任何东西

my @sorted_indexes = sort { $unsorted[$b] <=> $unsorted[$a] } 0..$#unsorted;

可以使用切片来抓取已排序的值。

my @sorted_values = @unsorted[ @sorted_indexes ];

答案 1 :(得分:0)

这是我的解决方案:

use strict;
use warnings;

my @abc = (5,7,6,2,7,1);
my $i = 0;

#Create an array of hashes (with value and index)
my @temp_abc = map { {value=>$_, index=>$i++} } @abc;

#Sort by the value of each hash
my @sorted_temp_abc = sort { $b->{value} <=> $a->{value} } @temp_abc; 

#extract the values to array @sorted_list
my @sorted_list = map { $_->{value} } @sorted_temp_abc;

#extract the values to array @sorted_list_index
my @sorted_list_index = map { $_->{index} } @sorted_temp_abc;

print "@sorted_list\n";        #<-- prints: 7 7 6 5 2 1
print "@sorted_list_index\n";  #<-- prints: 1 4 2 0 3 5