我如何在 Perl 中按特定元素对二维数组进行排序?

How do i sort a 2d array by a particular element, in Perl?

我构建了一个二维分数数组,想按第 x 个元素(即总计)排序。第一个元素标识玩家:数组如下所示;

$array[0][0] = "name one";
$array[0][1] = n1; # (some number)
$array[0][2] = n2; # (some number)
$array[0][3] = n3; # (some number)
$array[0][4] = n4; # (Total of above 3)

$array[1][0] = "name two";
$array[1][1] = n1; # (some number)
$array[1][2] = n2; # (some number)
$array[1][3] = n3; # (some number)
$array[1][4] = n4; # (Total of above 3)

如何按每个维度的第 4 个元素排序? 我试过了

@new_array = sort { $a->[4] <=> $b->[4] || $a->[4] <=> $b->[4] } @array;

但得到了原始数组。

按照第 5 个元素的降序对数组中的 arrayrefs 进行排序

my @sorted_by_largest_total = sort { $b->[4] <=> $a->[4] } @data;

或者,如果那个“总计”(第 5 个元素)确实总是最后一个元素,最好对最后一个元素使用索引 -1。那么玩家人数变来变去也没关系,照样有效

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

我认为数据是这样的,每个 arrayref 都有元素:名称,然后是数字(在问题示例中是三个),然后是这些数字的总和。

请注意,使用非常有用的 Sort::Key 模块

会更简单
use Sort::Key qw(rnkeysort);  # Reverse-Numerical

my @sorted_by_largest_total = rnkeysort { $_->[-1] } @data;

库中有大量函数用于各种通用标准(如此处 reverse-numerical),排序越复杂,工作就越简单。

例如,如果要排序的分数严格为整数,则有 ikeysortrikeysort,对于无符号整数 - 可能是分数? -- 有 ukeysortrukeysort.