我有2D数组(@AoA),它包含对其他字符串数组的引用。每次@AoA的大小都不同。我想将这些字符串中的每一个相互比较 为了比较第一个字符串数组,我可以使用这样的东西:
for (my $i=0; $i < $#AoA; $i++) {
my $lcm = List::Compare->new( $aAoA[$i], $AoA[$i+1] );
my @intersection = $lcm->get_intersection;
if (@intersection) {
#some code here
}
但是,将每个阵列相互比较的最佳方法是什么? 我希望结果如下:
Arr1 Arr2 …. ArrN
Arr1 x 1 match 3 matches 0 matches
Arr2 x N matches 3 matches
…. x 1 match
ArrN x
答案 0 :(得分:0)
如果您对List :: Compare感到满意,那么您可以使用它而不是我的函数intersect_count
。
#!/usr/bin/perl
use strict;
use warnings;
use List::MoreUtils 'uniq';
use List::Util 'any';
my @AoA = ([1,2,3,4,], [3,4,5,6], [4,7,8,9], [11,22,33]);
my @hdrs = map "Array_$_", 1 .. @AoA;
my $fmt = "%-10s" . "%-10s" x @hdrs . "\n";
printf $fmt, ' ', @hdrs;
for (my $i=0; $i < $#AoA; $i++) {
my @matches;
for (my $j = $i+1; $j < @AoA; $j++) {
$matches[$j] = intersect_count( $AoA[$i], $AoA[$j]);
}
printf $fmt, $hdrs[$i], map $_ // ' ', @matches;
}
sub intersect_count {
my ($a1, $a2) = @_;
my $cnt;
for my $item (uniq @$a1) {
$cnt += any {$item eq $_} uniq @$a2;
}
return $cnt;
}
打印
. Array_1 Array_2 Array_3 Array_4
Array_1 2 1 0
Array_2 1 0
Array_3 0