my @unsortedArray = { ["Harry", 10], ["Tim", 8], ["Joe", 3]};
my @sortedArray = ?????
最终sortedArray应当基于COL-2(整数),照顾1对1的关系的排序与“人的名字”(col-1)。最终的结果应该是这样的:
sortedArray should be { ["Joe", 3], ["Tim", 8], ["Harry", 10] };
my @unsortedArray = { ["Harry", 10], ["Tim", 8], ["Joe", 3]};
my @sortedArray = ?????
最终sortedArray应当基于COL-2(整数),照顾1对1的关系的排序与“人的名字”(col-1)。最终的结果应该是这样的:
sortedArray should be { ["Joe", 3], ["Tim", 8], ["Harry", 10] };
你可以给一个谓词sort
,那就是:这是评价比较列表的元素的功能。
my @unsorted = (["Harry", 10], ["Tim", 8], ["Joe", 3]);
my @sorted = sort { $a->[1] <=> $b->[1] } @unsorted;
在谓词(在大括号中的表达式),并且$a
是$b
被比较的外列表中的元素。
sort
只关心一维列表,所以它不会混淆外部列表元素的内部结构。所以姓名和号码之间的关系可以毫不费力地保留下来。
有关更多详细信息,请参阅perldoc -f sort
和perldoc perlop
。
一种更有效的解决方案,尤其是对于较大的阵列,可以是使用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
所做的。
另请参阅:[Sort :: Key](http://p3rl.org/Sort::Key) – daxim 2012-04-25 21:38:44
'@array = {...}'(几乎总是)不正确的语法。使用'@array =(...)'分配给一个数组。 – mob 2012-04-25 15:09:20
@mob:我想知道当你提到几乎*时你有什么边缘情况?:) – Zaid 2012-04-25 16:08:27
@Zaid:'@array_containing_a_single_hashref = {...}' – mob 2012-04-25 16:10:41