我有一个字符串列表,其值来自固定集.我需要以任意顺序对此列表进行排序.
集合的顺序由所有可能字符串的另一个列表指定,按数组顺序排序.
这是一个例子:
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)
一种不同的方法(如果要排序的列表可能包含需要保留的重复项,则该方法不起作用):
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)
| 归档时间: |
|
| 查看次数: |
1219 次 |
| 最近记录: |