我有两个需要排序的数组。
例如,我可能有以下内容:
@aa = (1, 4, 5, 1, 2);
@bb = (3, 1, 2, 2, 3);
以下脚本对@aa
中的元素进行排序,然后重新排列@bb
,如下所示:
my @idx = sort { $aa[$a] cmp $aa[$b] } 0 .. $#aa;
@aa = @aa[@idx];
@bb = @bb[@idx];
这将@bb
保留为(3, 2, 3, 1, 2)
。
但是,我现在想重新排列@bb
中的元素,以便与@aa
中的相同值相对应的那些元素按升序排列。例如,@bb
中的前3个和2个都对应于@aa
中的1个,因此我希望能够交换它们,所以@bb = (2, 3, 3, 1, 2)
。
有没有简单的方法可以做到这一点。我曾考虑过一个新数组,其中将@aa
和@bb
中的每对元素都在一起,然后使用它,但是看不到有什么用。
答案 0 :(得分:1)
如果要对数字进行排序,则应使用<=>
,而不是cmp
。
在我看来,您要求在aa值相等时要求您修改排序以按bb值进行排序。这很简单:
my @idx = sort {
$aa[$a] <=> $aa[$b] ||
$bb[$a] <=> $bb[$b]
} 0 .. $#aa;