9

私は次のことをしようとしています。特定のリストで「順序付け」として使用する定義済みのリストがあります。

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 と here で検索しましたが、答えが見つかりませんでした。

@listそのようにソートする必要があります:

sort @list using %orderby

並べ替え後に必要な印刷:

car, boat, chicken, mouse 

ところで、@list には重複したエントリを含めることができます。

my @list = ('boat', 'car', 'mouse', 'chicken', 'mouse', 'car');

その場合、印刷は次のようにする必要があります。

car, car, boat, chicken, mouse, mouse

あなたはそれに対する解決策を持っていますか?または別のアプローチかもしれません。ありがとう!!

4

3 に答える 3

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;
于 2013-02-06T13:56:13.667 に答える
0

その場合には、基数ソートが適しています。

use Sort::Key::Radix qw(ukeysort);
@sorted = ukeysort { $orderby{$_} } @data;
于 2013-02-11T08:56:42.397 に答える
0

確かに、すべての潜在的なアイテムのリストがあり、選択したいアイテムの小さなリストがある場合、これは実際には選択の問題であり、並べ替えの問題ではありませんか?

my %items = map { $_ => 1 } @list;
my @items = grep { $items{$_} } @orderby;

O(n log n) よりも O(n) 時間で実行されます:)

于 2013-02-10T13:23:39.653 に答える