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 в обратном числовом порядке (т. е. наибольшее число первым) результата его блока управления. Блок управления здесь просто суммирует все отдельные элементы каждого компонента.

Другие вопросы по тегам