2015-12-06 3 views
0

Может быть, я что-то упустил. Сначала мне показалось, что это слишком легко. Я думал, что могу легко достичь этого, используя map{}sort{}map{}, но теперь мне стало сложно.Как сортировать 2D-массив Perl?

Итак, наконец-то проблема у меня есть массив:

@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.

+1

Было бы хорошая идея, чтобы показать нам код, который вы написали. –

ответ

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

Это два отдельных сортов. Сначала вы хотите отсортировать внутренние массивы индивидуально, тогда вы можете отсортировать внешний массив, возможно, первым элементом каждого из внутренних.

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; 
Смежные вопросы