我正在尝试执行以下操作。我有一个预定义的列表,可以在给定列表中用作“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');
我尝试了无限的方法来对它进行排序,但我没有得到我想要的东西。我在google上搜索过,但是我没有找到答案。
@list
需要以这种方式排序:
sort @list using %orderby
排序后我想要的打印件:
car, boat, chicken, mouse
BTW,@ list可以有重复的条目:
my @list = ('boat', 'car', 'mouse', 'chicken', 'mouse', 'car');
在这种情况下,打印需要:
car, car, boat, chicken, mouse, mouse
你们有解决方案吗? 或者另一种方法。 谢谢!
答案 0 :(得分: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;
或者如果你想弄乱别人的想法,
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;
答案 1 :(得分:0)
当然,如果您有一个订单中所有潜在商品的清单,以及您想要选择的项目的较小清单,那么这实际上是一个选择问题,而不是排序问题?
my %items = map { $_ => 1 } @list;
my @items = grep { $items{$_} } @orderby;
在O(n)时间而不是O(n log n)运行:)
答案 2 :(得分:0)
Radix sort是这种情况的不错选择:
use Sort::Key::Radix qw(ukeysort);
@sorted = ukeysort { $orderby{$_} } @data;