Perl:基于元素值重新排列数组

时间:2016-04-06 13:36:06

标签: arrays perl splice

重新排列数组元素的最有效方法是什么,以便它们被排序&放置相应的索引值(减1)? $ dat变量是元素的最大数量(在数组中从不超出,但可能存在也可能不存在)。

$dat = 14;  
my @array = (1, 12, 14, 7, 8, 4)

换句话说:

my @new_array = (1, undef, undef, 4, undef, undef, 7, 8, undef, undef, undef, 12, undef, 14);

*** **** EDIT 富勒代码片段:

foreach $auth (keys %activity) {
my @value = @{ $activity{$auth} };
@value = uniq @value;
@value = sort @value;
s/^0// for @value;

my $count = scalar(grep $_, @value);
my $dat = max( @value );
@{$activity{$auth}} = @value;
}

2 个答案:

答案 0 :(得分:2)

简单快速(原件中可能出现重复):

my @new_array;
$new_array[$_ - 1] = $_ for @array;

就地(原件中不允许重复):

for (my $i = @array; $i--; ) {
   my $j = $array[$i]-1;
   if ($i < $j) {
      $array[$j] = $j+1;
      $array[$i] = undef;
   }
   elsif ($i > $j) {
      @array[$i, $j] = @array[$j, $i];
      redo;
   }
}

就地(原件中可能出现重复):

for (my $i = @array; $i--; ) {
   my $j = $array[$i]-1;
   if ($i < $j) {
      $array[$j] = $j+1;
      $array[$i] = undef;
   }
   elsif ($i > $j) {
      if ($array[$j] == $j+1) {
         $array[$i] = undef;
      }
      else {
         @array[$i, $j] = @array[$j, $i];
         redo;
      }
   }
}

pop(@array) while @array && !defined($array[-1]);

答案 1 :(得分:-1)

您可以创建一个新数组,在第一个中找到最大值后定义所有值,然后在这个新数组中取消定义不在第一个中的任何值:

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


my @array =  ('1', '4', '3');
my $max = (sort { $b <=> $a } @array)[0]; #should be 4

print Dumper(\@array);

my @new_arr;
foreach my $index (0 .. ($max - 1)) {
   $new_arr[$index] = ($index + 1);    
       #Array should be fully populated, @new_arr = ('1', '2', '3', '4');
   $new_arr[$index] = 'undef' unless (grep {$_ eq $new_arr[$index]} @array); 
       #Values not in the original array should be set to undef

}
#  @new_arr should be (''1', 'undef', '3', '4')

print Dumper(\@new_arr); 

输出:

$VAR1 = [
          '1',
          '4',
          '3'
        ];

$VAR1 = [
          1,
          'undef',
          3,
          4
        ];