Perl如何实现特殊规则字母排序:短串优先、同长按字母序排列
问题描述
我知道这个问题可能已经被多次提及,但我目前遇到卡点无法解决。我需要对一个数组进行排序,期望得到的排序结果如下:
A B Z AA BB
现有可用的排序方法都无法实现该排序效果,我不确定是否有可行方案。以下是我编写的Perl脚本和当前尝试的排序方式,请问我遗漏了什么?
# header use warnings; use strict; use Sort::Versions; use Sort::Naturally 'nsort'; print "Perl Starting ... \n\n"; my @testArray = ("Z", "A", "AA", "B", "AB"); #sort1 my @sortedArray1 = sort @testArray; print "\nMethod1\n"; print join("\n",@sortedArray1),"\n"; my @sortedArray2 = nsort @testArray; print "\nMethod2\n"; print join("\n",@sortedArray2),"\n"; my @sortedArray3 = sort { versioncmp($a,$b) } @testArray; print "\nMethod3\n"; print join("\n",@sortedArray3),"\n"; print "\nPerl End ... \n\n"; 1;
运行输出结果如下:
Perl Starting ... Method1 A AA AB B Z Method2 A AA AB B Z Method3 A AA AB B Z Perl End ...
解决方案
你需要的排序逻辑是优先按字符串长度升序排列,长度相同时再按常规字母字典序排列,之前使用的默认排序、自然排序、版本号排序都没有优先匹配长度的规则,因此不符合预期。
你可以自定义sort的比较规则,修改代码如下:
# 自定义排序规则:先比长度,再比字符串字典序 my @sortedArray = sort { length($a) <=> length($b) || $a cmp $b } @testArray;
修改后完整的测试代码:
use warnings; use strict; print "Perl Starting ... \n\n"; my @testArray = ("Z", "A", "AA", "B", "AB"); my @sortedArray = sort { length($a) <=> length($b) || $a cmp $b } @testArray; print "自定义排序结果:\n"; print join("\n",@sortedArray),"\n"; print "\nPerl End ... \n\n"; 1;
运行输出:
Perl Starting ... 自定义排序结果: A B Z AA AB Perl End ...
如果你的实际场景需要完全匹配Excel列名的排序逻辑(比如Z之后是AA、AB…AZ、BA…ZZ、AAA以此类推),上述自定义排序规则完全可以满足需求。
内容的提问来源于stack exchange,提问作者Sam B
相关产品推荐
相关产品推荐

