Lil*_*ith 6 arrays perl nested-loops
我有一个对象数组,以及一个特定方法的可接受返回值数组.如何将对象数组减少到只有那些方法在我的可接受值数组中返回值的对象?
现在,我有这个:
my @allowed = grep {
my $object = $_;
my $returned = $object->method;
grep {
my $value = $_;
$value eq $returned;
} @acceptableValues;
} @objects;
Run Code Online (Sandbox Code Playgroud)
问题是这是一个复合循环,我想避免.该程序旨在扩展到任意大小,我想最小化运行的迭代次数.
最好的方法是什么?
您可以将接受的返回值转换为哈希值
my %values = map { $_ => 1 } @acceptedValues;
Run Code Online (Sandbox Code Playgroud)
并且 grep条件是密钥存在而不是原始grep:
my @allowed = grep $values{ $_->method }, @objects;
Run Code Online (Sandbox Code Playgroud)
无论如何,grep它本身相当快,这只是一个检查元素是否在数组中的常用方法的想法.尽量不要优化不需要的东西,因为它只适用于非常大的数组.然后你可以例如对接受的结果数组进行排序并使用二进制搜索,或者如果它们重复则缓存结果.但是,除非你要处理数十万件物品,否则不要担心这种优化.