【问题标题】:How to sort a list with a given order?如何按给定顺序对列表进行排序?
【发布时间】:2013-02-06 13:49:24
【问题描述】:

我正在尝试执行以下操作。我有一个预定义的列表,可用作给定列表的“排序依据”。

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

你们有解决办法吗? 或者可能是另一种方法。 谢谢!!

【问题讨论】:

  • 更新,我的解决方案处理重复。
  • 是的,我已经测试过了!再次感谢!

标签: list perl sorting


【解决方案1】:
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;

【讨论】:

  • 要排序的数组是list,而不是orderby
  • 哦,天哪,那太快了。现在我将尝试理解地图。谢谢!
  • 对于传递给map 的列表中的每个元素,对其应用一个函数(花括号中的代码)。结果列表加入一个大列表并返回。在第一个 sn-p 中,我使用 map 生成您在问题中遇到的 %orderby,而无需对所有数字进行硬编码。
【解决方案2】:

当然,如果您有一个按顺序排列的所有潜在项目的列表,以及一个较小的要选择的项目列表,那么这实际上是一个选择问题,而不是排序问题?

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

运行时间为 O(n) 而不是 O(n log n) :)

【讨论】:

  • 这与我 4 天前发布的第二个解决方案基本相同,除了我的更好,因为它可以处理重复项,而你的不符合 OP 的规范,因为它不符合。
【解决方案3】:

对于这种情况,基数排序是一个不错的选择:

use Sort::Key::Radix qw(ukeysort);
@sorted = ukeysort { $orderby{$_} } @data;

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 2011-03-16
    • 1970-01-01
    • 2017-04-08
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多