【问题标题】:Sort Perl numeric array对 Perl 数值数组进行排序
【发布时间】:2011-03-17 20:12:04
【问题描述】:

我有一个如下所示的数组:

array[0]: 6 8
array[1]: 12 9 6
array[2]: 33 32 5
array[3]: 8 6

我想对这个数组进行排序,使其看起来像这样:

array[0]: 6 8
array[1]: 6 9 12
array[2]: 5 32 33
array[3]: 6 8

我知道我可以使用@newarray = sort {$a cmp $b} @array; 对数组进行排序,但我还需要对每一行中的元素进行排序。我该怎么做?

【问题讨论】:

  • 是数组还是字符串?

标签: perl arrays sorting numeric


【解决方案1】:

2021 年 3 月 16 日更新:亲爱的未来访客,我的答案已被接受,而且我仍在获得支持,但 @FMc's solution 显然比我的要好。 (FMc 和 dalton 的答案相同,但据我所知,FMc 是第一个到达那里的。)

无论如何,如果您遇到这种情况,请使用 Perl 的内置 map 而不是我原来的自定义子例程答案。

原始答案:假设你有一个字符串数组,并且你想要的只是对每个字符串进行排序,就好像它是一个数字子数组(但留下一个字符串? ):

#!/usr/bin/env perl
use strict;
use warnings;

my @array = ('6 8', '12 9 6', '33 32 5', '8 6');

foreach my $string (@array) {
    $string = split_sort($string);
}

sub split_sort {
    my $string = shift @_;
    my @internal_nums = split ' ', $string;
    @internal_nums = sort {$a <=> $b} @internal_nums;
    return join ' ', @internal_nums;
}

print "@array\n";

【讨论】:

    【解决方案2】:

    您也可以使用地图解决它:

    #!/usr/bin/env perl
    
    my @numbers = (
        '6 8',
        '12 9 6',
        '33 32 5',
        '8 6',
    );
    
    my @sorted;
    push (@sorted, map { join " ", sort { $a <=> $b }  (split / /, $_) } @numbers);
    
    
    print "$_\n" for @sorted;
    

    输出:

    6 8
    6 9 12
    5 32 33
    6 8
    

    【讨论】:

    • +1 表示比在每次迭代中调用子例程的 foreach 循环更短、更容易理解和更高效的解决方案。
    • +1 出于同样的原因,但可以大大缩短:map { join " ", sort split } @numbers 应该可以工作。
    • @Jon 实际上,不,那是行不通的。您仍然需要数字排序 - map { join " ", sort {$a &lt;=&gt; $b} split } @numbers
    • @Telemachus:该死。我猜我的 Perl 有点生疏了。
    【解决方案3】:

    您有一个要转换的项目列表。这是map 的完美候选人。还要注意split 的默认行为:它在$_ 上运行,在删除前导空格后分割空格。

    my @array = ('6 8', '12 9 6', '33 32 5', '8 6');
    @array = map { join ' ', sort {$a <=> $b} split } @array;
    

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多