【问题标题】:Finding any elements of array B that are not in array A查找数组 B 中不在数组 A 中的任何元素
【发布时间】:2014-05-21 23:17:53
【问题描述】:

请注意,我是一个 Perl 新手。

我正在寻找一个很好的速记来比较两个数组,比如 arrAarrB

我想知道arrB 中是否有不在arrA 中的元素。

如果重要的话,这些数组中的元素是字符串。

我知道我可以通过遍历数组并使用grep 来完成此操作,但我想知道是否有一个很好的速记方法来执行此操作。缺少我的 Perl-fu。

谢谢!

编辑:这是我正在寻找的内容,以防我在上面不清楚。

my @arrA = ( "aaa", "bbb", "ccc" );
my @arrB = ( "aaa", "bbb", "ccc", "ddd" );
my @BnotA = ();

# Something goes here, help!

print "Elements of arrB that are not in arrA: @BnotA\n";

不过,我对这里的数据结构并不挑剔;如果我可以稍微改变一下结构以提高效率,我就可以做到。

【问题讨论】:

标签: arrays perl


【解决方案1】:

最有效的方法是从@arrA 的内容构建散列。然后可以快速检查@arrB的元素是否存在于@arrA中。

这样

use strict;
use warnings;

my @arrA = ( "aaa", "bbb", "ccc" );
my @arrB = ( "aaa", "bbb", "ccc", "ddd" );

my %arrA_hash = map { $_ => 1 } @arrA;
my @BnotA = grep { not $arrA_hash{$_} } @arrB;

print "Elements of arrB that are not in arrA: @BnotA\n";

输出

Elements of arrB that are not in arrA: ddd

或者,如果您有Array::Utils 模块或愿意安装它,您可以使用该模块的array_minus 功能。应该是这样的

use strict;
use warnings;

use Array::Utils 'array_minus';

my @arrA = ( "aaa", "bbb", "ccc" );
my @arrB = ( "aaa", "bbb", "ccc", "ddd" );

my @BnotA = array_minus(@arrB, @arrA);

print "Elements of arrB that are not in arrA: @BnotA\n";

输出与上一个程序相同。

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2019-09-06
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多