参考已排序的数组对数组进行排序

jks*_*hah 8 arrays sorting perl

我有一个包含所有可能元素的引用数组,并按自定义顺序排序,而不是字母数字排序.例如,

@ref_array = ('one','two','three','four','five','six');
Run Code Online (Sandbox Code Playgroud)

现在所有输入数组都需要根据引用数组的顺序进行排序.输入数组将始终是引用数组的子集.

@in1 = ('three','one','five');  # Input
@out1 = ('one','three','five'); # Desired Output

@in2 = ('six','five','four','three','two','one'); # Input
@out2 = ('one','two','three','four','five','six') # Desired Output
Run Code Online (Sandbox Code Playgroud)

Сух*_*й27 10

my %h = map { $ref_array[$_] => $_ } 0 .. $#ref_array;

my @out1 = @ref_array[ sort { $a <=> $b } @h{@in1} ];
my @out2 = @ref_array[ sort { $a <=> $b } @h{@in2} ];
Run Code Online (Sandbox Code Playgroud)

%h保持key => val对,如one=> 0,two=> 1等.

@h{@in1}2,0,4散列切片,并且数组切片@ref_array[0,2,4]one, three, five

  • 太好了!这比我的解决方案更优雅.(虽然*请*开始解释你的答案!) (5认同)
  • @amon如果OP要求,我会写解释,因为我是一个慢作家,缺乏口才 (3认同)
  • 由于Perl中的(缺少)类型系统,它需要两组比较运算符:`eq` vs.` ==`,`cmp` vs` <=>`.Ruby和Perl6没有这个问题,可以提供通用的比较.在Perl5中,字符串排序是一个合理的默认值.但你可以自由定义自己的`sub numsort {sort {$ a <=> $ b} @_}` (2认同)
  • 至于@ amon的第一点,你总是可以在*发布你的代码之后写一个解释*.请记住,SO上的答案不仅适用于OP,也适用于将来登陆此页面的其他人.话虽如此,非常好的解决方案. (2认同)