Perl:基于特定列对具有多个列的2D数组进行排序

时间:2012-04-25 14:51:37

标签: arrays perl perl-data-structures

伪代码:

my @unsortedArray = { ["Harry", 10], ["Tim", 8], ["Joe", 3]};
my @sortedArray = ?????

最终sortedArray应该基于col-2(整数)进行排序,处理与“人名”(col-1)的1对1关系。最终结果应如下所示:

sortedArray should be { ["Joe", 3], ["Tim", 8], ["Harry", 10] }; 

2 个答案:

答案 0 :(得分:8)

您可以为sort提供一个谓词,即:一个被评估以比较列表元素的函数。

my @unsorted = ( ["Harry", 10], ["Tim", 8], ["Joe", 3] );

my @sorted = sort { $a->[1] <=> $b->[1] } @unsorted;

在谓词(花括号中的表达式)中,$a$b是外部列表中要比较的元素。

sort只关注一维列表,因此它不会混淆外部列表元素的内部结构。因此,名称和数字之间的关系可以毫不费力地保留。

有关详细信息,请参阅perldoc -f sortperldoc perlop

答案 1 :(得分:2)

更有效的解决方案,尤其是对于较大的阵列,可能是使用List::UtilsBy::nsort_by

use List::UtilsBy qw( nsort_by );

my @unsorted = ( ["Harry", 10], ["Tim", 8], ["Joe", 3] );

my @sorted = nsort_by { $_->[1] } @unsorted;

虽然在小的情况下不太可能注意到开销,但对于更复杂的函数,O(n log n)密钥提取成本变得更高,并且更优选的是仅提取每个值的“排序密钥”一次,这是nsort_by的作用。