如何排序2D数组Perl?

时间:2015-12-06 14:23:45

标签: perl sorting

可能是我错过了什么。首先它对我来说似乎太容易了。我想我可以使用map{}sort{}map{}轻松实现它,但现在它变得很复杂。

所以,最后问题是我有一个数组:

@array=(['b','e','d'],['s','a','f'],['g','i','h']);

我希望排序数组如

@sorted_array=(['a','f','s'],['b','d','e'],['g','h','i']);

我写了

##sort based on columns########
my @sorted_array= map{my @sorted=sort{$a cmp $b}@$_;[@sorted]}@array;

###sort on rows####
my @sorted_array= map{$_->[0]}sort{$a->[1] cmp $b->[1]} map{[$_,"@$_"]}@array;

但我不知道如何将它包装成一个(对于行和列)。我可以使用Schwartzian transform.

实现此目的

2 个答案:

答案 0 :(得分:2)

是的,你可以使用它,

use strict;
use warnings;

my @array =( [qw(b e d)], [qw(s a f)], [qw(g i h)] );

my @sorted_array = 
map { $_->[0] }
sort {
  $a->[1] cmp $b->[1]
}
map {
  my $r = [ sort @$_ ];
  [$r, "@$r"];
}
@array;

use Data::Dumper;
print Dumper \@sorted_array;

输出

$VAR1 = [
      [
        'a',
        'f',
        's'
      ],
      [
        'b',
        'd',
        'e'
      ],
      [
        'g',
        'h',
        'i'
      ]
    ];

答案 1 :(得分:1)

这是两种不同的排序。首先,您希望单独对内部数组进行排序,然后可以通过每个内部数组的第一个元素对外部数组进行排序。

use List::UtilsBy qw( sort_by );

my @array =( [qw(b e d)], [qw(s a f)], [qw(g i h)] );

# sort the inner ones individually
@$_ = sort @$_ for @array;

# sort the whole by the first element of each
my @sorted_array = sort_by { $_->[0] } @array;

或者,如果您喜欢一次性完成所有操作并避免暂时性突变:

my @sorted_array = sort_by { $_->[0] }
                   map { [ sort @$_ ] } @array;