Perl中的数组排序

amb*_*amb 5 perl

我是Perl的新手并且遇到了一个(很简单的)数组排序问题.

我继承了一些Perl代码,它将文本文件中的行读入三个1-D数组(x,y,z).我希望能够使用其中一个维度作为关键字对这些数组进行排序,并重新排序其他两个维度以匹配.

例如,如果我的输入是:

  • @x =(1,3,2)
  • @y =(11,13,12)
  • @z =(21,23,22)

我按x排序,我希望结果如下:

  • @x =(1,2,3)
  • @y =(11,12,13)
  • @z =(21,22,23)

如果能让生活更轻松,我可以将三个1-D阵列合并为2-D阵列.

mob*_*mob 10

将所有阵列合并在一起不是必需的.使用sort以获取中的元素正确的索引排序@x:

@sort_by_x = sort { $x[$a] <=> $x[$b] } 0 .. $#x;    #   ==> (0, 2, 1)
Run Code Online (Sandbox Code Playgroud)

然后将该索引顺序应用于任何其他数组:

@x = @x[@sort_by_x];
@y = @y[@sort_by_x];
@z = @z[@sort_by_x];
Run Code Online (Sandbox Code Playgroud)


zak*_*rya 3

use strict;
use warnings;
use Data::Dumper;

use List::Util qw(reduce);

my @x = (1, 3, 2);
my @y = (11, 13, 12);
my @z = (21, 23, 22);

my @combined = map { [ $x[$_], $y[$_], $z[$_] ] } 0 .. $#x;
my @sorted = sort { $a->[0] <=> $b->[0] } @combined;
my $split_ref = reduce { push @{$a->[$_]}, $b->[$_] for 0 .. $#$a; $a;} [[], [], []], @sorted;

print Dumper \@combined;
print Dumper \@sorted;
print Dumper $split_ref;
Run Code Online (Sandbox Code Playgroud)

这基本上会给你:

    [
      [
        1,
        2,
        3
      ],
      [
        11,
        12,
        13
      ],
      [
        21,
        22,
        23
      ]
    ];
Run Code Online (Sandbox Code Playgroud)