5

伪代码:

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

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

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

2 回答 2

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

于 2012-04-25T15:20:17.080 回答
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做的。

于 2012-04-25T16:09:25.757 回答