重新排列数组元素的最有效方法是什么,以便它们被排序&放置相应的索引值(减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;
}
答案 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
];