我正在尝试将数组拆分为500个批次,但我想要涵盖数组大小不均匀除以500的情况。例如:
Array = [1,...,1100]
subArray1 = [1..500]
subArray2 = [500..1000]
subArray3 = [1000..1100]
这是我到目前为止所做的:
my @array = [prepopulated];
my $array_size = scalar(@array);
my $start = 0;
my $end = 500;
while ($start < $array_size) {
my @subArray = @array[$start..$end];
print Dumper(\@subArray);
$start = $end;
if($end + 500 > $array_size) {
$end = $start + ($array_size % 500);
} else {
$end += 500;
}
}
这似乎有效,但有没有更好的方法可以做到这一点,或者在我看不到的情况下这是否会中断?
答案 0 :(得分:6)
builder.RegisterAssemblyTypes(typeof(UserService).GetTypeInfo().Assembly)
.Where(t => t.Name.EndsWith("Service") || t.Name.EndsWith("Repo"))
.AsImplementedInterfaces()
.SingleInstance();
涵盖了这类任务:
List::MoreUtils
use strict; use warnings;
use List::MoreUtils qw(natatime);
my @Array = (1..1100);
my $it = natatime 500, @Array;
while (my @vals = $it->()) {
printf "%d\n", 0+@vals;
}
无需重新发明轮子。
答案 1 :(得分:3)
我认为splice
会更简单,更清洁:
mediastreamvalidator
答案 2 :(得分:3)
请注意,perl的range运营商start..end
包含双方。 0..500
为您提供:0, 1, ..., 499, 500
假设您不想复制边界元素(例如,包含在两个子数组中的索引500),请尝试以下操作。
要点:
$end
初始化更改为499
$start = $end+1
>=
:$end + 500 >= $array_size
码
my @array = [prepopulated];
my $array_size = scalar(@array);
my $start = 0;
my $end = 499;
while ($start < $array_size) {
my @subArray = @array[$start..$end];
print Dumper(\@subArray);
$start = $end+1;
if($end + 500 >= $array_size) {
$end = $array_size-1;
} else {
$end += 500;
}
}
答案 3 :(得分:2)
为natatime
创建第二个索引数组非常浪费。
use List::Util qw( min );
for (my $start=0; $start<@array; $start+=500) {
my $end = min($start+500, 0+@array);
...
}