如何以任意顺序对Perl列表进行排序?

NXT*_*NXT 5 algorithm perl

我有一个字符串列表,其值来自固定集.我需要以任意顺序对此列表进行排序.

集合的顺序由所有可能字符串的另一个列表指定,按数组顺序排序.

这是一个例子:

my @all_possible_strings_in_order = ('name', 'street', 'city','state', 'postalcode');

my @list_that_needs_to_be_sorted = ('city', 'state', 'name');
Run Code Online (Sandbox Code Playgroud)

我在perl工作.我认为最好的办法是自动创建一个将字符串与序数相关联的哈希值,然后通过引用这些序数进行排序.

集合中有大约300个可能的字符串.典型列表将包含30个需要排序的字符串.这不会在紧密的循环中调用,但它也不会很慢.由于程序的结构,无法提前自动构建序数散列.

我愿意就更好的方法提出建议.谢谢!

编辑:你们真棒.我今晚不能再抬起头了,但是明天早上我会花时间真正理解你的建议......这是我精通map()和grep()的时候了.

Gre*_*con 10

用字符串设置字符串与各自位置之间的关联

# Define your custom order of all possible strings.
my @custom_order = qw/ name street city state postalcode /;

my %order = map +($custom_order[$_] => $_), 0 .. $#custom_order;
Run Code Online (Sandbox Code Playgroud)

现在,您可以创建一个比较函数,以便与Perl的sort运算符一起使用:

sub by_order { $order{$a} <=> $order{$b} }
Run Code Online (Sandbox Code Playgroud)

例如:

my @sorted = sort by_order qw/ city state name /;
print "@sorted\n";
# prints: name city state
Run Code Online (Sandbox Code Playgroud)

  • `我的%订单; @order {@all_possible_strings_in_order} = 1 .. @ all_possible_strings_in_order` - 少点邪恶/更具可读性?:) (4认同)
  • @gbacon:然后`@ $ _ {@ all} = 1 .. @ all for\my%order;` (2认同)

yst*_*sth 7

一种不同的方法(如果要排序的列表可能包含需要保留的重复项,则该方法不起作用):

my %set;
@set{ @list_that_needs_to_be_sorted } = ();
my @sorted = grep exists $set{$_}, @all_possible_strings_in_order;
Run Code Online (Sandbox Code Playgroud)