更好的方法来排序具有不寻常值的数组

cr8*_*ith 4 arrays perl

我有这个数组:

@raw_stack = (
    '900244~dfasdf~ddd3',
    '900122~dfasdf~ddd1',
    '900244~dfasdf~ddd2',
    '900456~dfasdf~ddd4',
    '900312~dfasdf~ddd3',
    '900456~dfasdf~ddd5',
    );
Run Code Online (Sandbox Code Playgroud)

我想用第一个'〜'元素对它进行排序.有没有更优雅的方法来解决这个问题,而不是循环和分裂每个值?

Tot*_*oto 5

使用Schwartzian变换:

my @raw_stack = (
    '900244~dfasdf~ddd3',
    '900122~dfasdf~ddd1',
    '900244~dfasdf~ddd2',
    '900456~dfasdf~ddd4',
    '900312~dfasdf~ddd3',
    '900456~dfasdf~ddd5',
);
my @sorted = 
    map { $_->[0] }
    sort { $a->[1] <=> $b->[1] }
    map { [$_, (split/~/)[0]] } @raw_stack;
dump@sorted;
Run Code Online (Sandbox Code Playgroud)

基准测试:

#!/usr/bin/perl 
use 5.010;
use strict;
use warnings;
use Benchmark qw(:all);


my $s = '~dfasdf~ddd3';
my @arr = ();
for(0..20000) {
    push @arr, int(rand(100000)) . $s;
}
my $count = -3;
cmpthese($count, {
        'ST' => sub {
            my @sorted = 
                map { $_->[0] }
                sort { $a->[1] <=> $b->[1] }
                map { [$_, (split/~/)[0]] } @arr;
        },
        'SORT' => sub {
            my @sorted =
                sort {
                    my ($a_0) = split /~/, $a;
                    my ($b_0) = split /~/, $b;
                    $a_0 <=> $b_0
                } @arr;
        },
    });
Run Code Online (Sandbox Code Playgroud)

结果:

200个元素的数组:

      Rate SORT   ST
SORT 267/s   -- -61%
ST   689/s 158%   --
Run Code Online (Sandbox Code Playgroud)

2000个元素的数组:

       Rate SORT   ST
SORT 18.0/s   -- -71%
ST   61.5/s 242%   --
Run Code Online (Sandbox Code Playgroud)

20000个元素的数组:

       Rate SORT   ST
SORT 1.35/s   -- -73%
ST   4.96/s 266%   --
Run Code Online (Sandbox Code Playgroud)