我希望对字符串数组进行排序,以便字符串按以下顺序排列:
@set = ('oneM', 'twoM', 'threeM', 'sixM', 'oneY', 'twoY', 'oldest');
Run Code Online (Sandbox Code Playgroud)
你可能会注意到,这些代表时间段,所以oneM是第一个月,等等.我的问题是我想按时间段排序,但是对于字符串,我不能只使用'sort',所以我创建了这个哈希来表达字符串应该如何排序:
my %comparison = (
oneM => 1,
twoM => 2,
threeM => 3,
sixM => 6,
oneY => 12,
twoY => 24,
oldest => 25,
);
Run Code Online (Sandbox Code Playgroud)
我希望这会让我的生活更轻松,我可以做一些事情,比如:
foreach my $s (@set) {
foreach my $k (%comparison) {
if ($s eq $k) {
something something something
Run Code Online (Sandbox Code Playgroud)
我觉得这是一个漫长的做事方式,我不确定如果我找到相同的东西后我会如何实际排序......我想我有点想念自己的情节了所以任何帮助将不胜感激
根据要求,预期输出将如上所示在@set中显示.我应该已经提到@set中的值将是该集合的一部分,但不一定是所有这些值而不是相同的顺序.
给出输入的例子和你期望的结果会有所帮助.我猜这就是你要找的东西:
my @data = ( ... );
my %comparison = (
oneM => 1, twoM => 2, threeM => 3,
sixM => 6, oneY => 12, twoY => 24,
oldest => 25,
);
my @sorted = sort { $comparison{$a} <=> $comaprison{$b} } @data;
Run Code Online (Sandbox Code Playgroud)
sortperlfunc手册页中的函数文档中有很多示例.("perldoc -f sort")
您在预先计算数据时选择了良好的策略,以便于排序.您可以在排序本身内部计算这些数据,但是每次sort需要比较值时,您都会浪费时间进行重新计算,这会在整个过程中不止一次发生.另一方面,缓存的缺点显然是你需要额外的内存来存储它,它可能会在低内存条件下减慢你的排序,尽管整体计算量较少.
使用您当前的设置排序非常简单:
my @sorted = sort { $comparison{$a} <=> $comaprison{$b} } @set;
Run Code Online (Sandbox Code Playgroud)
如果你想以牺牲CPU为代价来节省内存,那就是:
my @sorted = sort { calculate_integer_based_on_input{$a} <=> calculate_integer_based_on_input{$b} } @set;
Run Code Online (Sandbox Code Playgroud)
具有单独的calculate_integer_based_on_input功能,可以在运行中转换oneY等等12或其他相应的值,或者只是将输入的内联转换为适合于排序的东西.
您可能还想查看用于使用缓存计算进行排序的常用习惯用法,例如Schwartzian变换和Guttman Rosler变换.