给定这些字符串的任意排序,如何对字符串数组进行排序?

dgB*_*gBP 0 sorting perl hash

我希望对字符串数组进行排序,以便字符串按以下顺序排列:

@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中的值将是该集合的一部分,但不一定是所有这些值而不是相同的顺序.

pma*_*olm 5

给出输入的例子和你期望的结果会有所帮助.我猜这就是你要找的东西:

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")


Ole*_*kov 5

您在预先计算数据时选择了良好的策略,以便于排序.您可以在排序本身内部计算这些数据,但是每次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变换.