Perl Array Order
Я новичок в Perl и придерживаюсь следующего упражнения. У меня есть мульти-массив и хочу упорядочить его элемент по убыванию суммы внутренних массивов. Я хочу сделать заказ с преобразованием Шварца.
Это мой вектор:
my @vectors = ( [1], [ 1, 2, 3 ], [4], [ 2, 2, 1 ] );
Это ожидаемый вектор:
@sorted_vectors = ( [1,2,3], [2,2,1], [4], [1] );
До сих пор я пробовал с этим:
(1) #! / Usr / bin / perl
use strict;
use warnings;
use Data::Dumper;
my @vectors = ( [1], [ 1, 2, 3 ], [4], [ 2, 2, 1 ] );
my @sorted_vectors;
# @sorted_vectors = ( [1,2,3], [2,2,1], [4], [1] );
my %hash=();
for(my $i=0;$i< scalar @vectors;$i++){
$hash{$i}=@vectors[$i];
}
for my $key ( sort { $hash{$b}[1] <=> $hash{$a}[1] } keys %hash ) {
push(@sorted_vectors,[@{$hash{$key}}]);
}
print Dumper( \@sorted_vectors );
(2)
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @vectors = ( [1], [ 1, 2, 3 ], [4], [ 2, 2, 1 ] );
my @sorted_vectors;
# @sorted_vectors = ( [1,2,3], [2,2,1], [4], [1] );
my @sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, foo($_)] }
@vectors;
sub foo{
my $res = 0;
foreach my $x (@_) {
$res+= $x;
}
return $res;
}
print Dumper(\@sorted);
2 ответа
Решение
Ваш код работает с небольшими изменениями,
my @sorted = map { $_->[0] }
# sort { $a->[1] cmp $b->[1] } # string sort, ascending order
sort { $b->[1] <=> $a->[1] } # numeric sort, descending order
# map { [$_, foo($_)] } # foo() expects list, not array reference
map { [$_, foo(@$_)] } # dereferencing $_ aref for foo()
@vectors;
или то же самое, но используя sum()
из основного модуля List::Util
use List::Util 'sum';
my @vectors = ( [1], [ 1, 2, 3 ], [4], [ 2, 2, 1 ] );
my @sorted_vectors = map $_->[0],
sort { $b->[1] <=> $a->[1] }
map [ $_, sum(@$_) ],
@vectors;
use Data::Dumper; print Dumper \@sorted_vectors;
выход
$VAR1 = [
[
1,
2,
3
],
[
2,
2,
1
],
[
4
],
[
1
]
];
Это просто с List::UtilsBy::rev_nsort_by
а также List::Util::sum
:
my @vectors = ( [1], [ 1, 2, 3 ], [4], [ 2, 2, 1 ] );
my @sorted = rev_nsort_by { sum @$_ } @vectors;
Это сортирует список @vectors
в обратном числовом порядке (т. е. наибольшее число первым) результата его блока управления. Блок управления здесь просто суммирует все отдельные элементы каждого компонента.