0

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

@set = ('oneM', 'twoM', 'threeM', 'sixM', 'oneY', 'twoY', 'oldest');

您可能会注意到,这些代表时间段oneM,第一个月也是如此。我的问题是我想按时间段排序,但是对于字符串,我不能只使用“排序”,所以我创建了这个散列来表达字符串应该如何排序:

my %comparison = (
    oneM    => 1,
    twoM    => 2,
    threeM  => 3,
    sixM    => 6,
    oneY    => 12,
    twoY    => 24,
    oldest  => 25,
);

我希望这能让我的生活更轻松,我可以做一些事情,例如:

foreach my $s (@set) {
    foreach my $k (%comparison) {
        if ($s eq $k) {
            something something something

我感觉这是一种冗长的做事方式,而且我实际上不确定一旦找到等效项后我将如何对其进行排序……我想我有点想念自己的情节所以任何帮助将不胜感激

根据要求,预期的输出将类似于上面@set 中的显示方式。我应该提到@set 中的值将是该集合的一部分,但不一定是所有这些值,而且顺序也不相同。

4

2 回答 2

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;

sortperlfunc 手册页中的函数文档中有大量示例。(“perldoc -f 排序”)

于 2012-09-12T11:01:41.160 回答
5

您已经选择了预先计算数据以形成易于排序的良好策略。您可以在排序本身内部计算此数据,但是每次sort需要比较值时,您都会浪费时间进行重新计算,这在整个过程中会发生不止一次。另一方面,缓存的缺点显然是,您需要额外的内存来存储它,并且它可能会在内存不足的情况下减慢您的排序,尽管总体上进行的计算较少。

使用您当前的设置排序很简单:

my @sorted = sort { $comparison{$a} <=> $comaprison{$b} } @set;

如果你想以 CPU 为代价来节省内存,那就是:

my @sorted = sort { calculate_integer_based_on_input{$a} <=> calculate_integer_based_on_input{$b} } @set;

具有单独的calculate_integer_based_on_input函数,可以即时将oneY等转换为12或其他相应的值,或者只是将输入内联转换为适合排序的内容。

您可能还想查看使用缓存计算进行排序的常见习语,例如Schwartzian transformGuttman Rosler Transform

于 2012-09-12T11:07:58.873 回答