检查数组是否包含另一个数组的值

时间:2017-04-29 22:08:24

标签: arrays perl nested-loops

我有一个对象数组,以及一个特定方法的可接受返回值数组。如何将对象数组减少到只有那些方法在我的可接受值数组中返回值的那些?

现在,我有这个:

my @allowed = grep {
    my $object = $_;
    my $returned = $object->method;
    grep {
        my $value = $_;
        $value eq $returned;
    } @acceptableValues;
} @objects;

问题是这是一个复合循环,我想避免。该程序旨在扩展到任意大小,我希望最小化运行的迭代次数。

最好的方法是什么?

2 个答案:

答案 0 :(得分:7)

您可以将接受的返回值转换为哈希

my %values = map { $_ => 1 } @acceptedValues;

grep条件是密钥存在而不是您的密钥 原来的grep:

my @allowed = grep $values{ $_->method }, @objects;

无论如何,grep本身相当快,这只是一个想法 检查元素是否在数组中的常用方法。尽量不要 优化不需要的东西,因为它只值得非常大 阵列。然后你可以例如对接受的结果数组进行排序 使用二进制搜索,如果重复,则缓存结果。但同样,不要 担心这种优化,除非你处理数百个 成千上万的物品 - 或更多。

答案 1 :(得分:1)

假定存在于给定数组中的元素似乎是唯一的。所以,我将创建一个包含两个数组中元素数的哈希值。如果有任何计数大于1的元素,则表示它存在于两个数组中。

my %values;
my @allowed;
map {$values{$_}++} (@acceptableValues, @objects);
for (keys %values) {
    push @allowed, $_ if $values{$_} > 1;
}