如何使用给定订单对列表进行排序?

Jon*_*han 9 sorting perl list

我正在尝试做以下事情.我有一个预定义的列表,用作给定列表上的"order by".

my @orderby = ( 'car', 'boat', 'chicken', 'cat', 'dog', 'mouse');
   or
my %orderby = ( 'car' => 0, 'boat' => 1, 'chicken' => 2, 'cat' => 3, 'dog' => 4, 'mouse' => 5);

my @list = ('boat', 'car', 'mouse', 'chicken');
Run Code Online (Sandbox Code Playgroud)

我尝试了无限的方式来对它进行排序,但我没有得到我想要的东西.我在谷歌上搜索过,但在这里,我没有找到答案.

@list 需要以这种方式排序:

sort @list using %orderby
Run Code Online (Sandbox Code Playgroud)

排序后我想要的打印件:

car, boat, chicken, mouse 
Run Code Online (Sandbox Code Playgroud)

BTW,@ list可以有重复的条目:

my @list = ('boat', 'car', 'mouse', 'chicken', 'mouse', 'car');
Run Code Online (Sandbox Code Playgroud)

在这种情况下,打印需要是:

car, car, boat, chicken, mouse, mouse
Run Code Online (Sandbox Code Playgroud)

你们有解决方案吗?或者另一种方法.谢谢!!

ike*_*ami 12

my @orderby = qw( car boat chicken cat dog mouse );
my @list    = qw( boat car mouse chicken );

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

my @sorted = sort { $orderby{$a} <=> $orderby{$b} } @list;
Run Code Online (Sandbox Code Playgroud)

或者如果你想弄乱人们的思想,

my @orderby = qw( car boat chicken cat dog mouse );
my @list    = qw( boat car mouse chicken );

my %counts; ++$counts{$_} for @list;
my @sorted = map { ($_) x ($counts{$_}||0) } @orderby;
Run Code Online (Sandbox Code Playgroud)

  • 对于传递给`map`的列表的每个元素,将一个函数应用于它(curlies中的代码).生成的列表将合并为一个大列表并返回.在第一个片段中,我使用`map`生成你问题中的`%orderby`,而没有对所有数字进行硬编码. (2认同)