从两个不同长度数组的比较中获取索引

时间:2018-09-25 09:11:40

标签: perl comparison matching

#!usr/bin/perl -W

use strict;

my @a = (3,5,8,6,7,9);
my @b = (3,7,8);
my @index;
my $match;

foreach my $i (0 .. $#a) {
    $match = 0;
    foreach my $j (0 .. $#b) {
        if ($a[$i] == $b[$i]) {
            $match = 1;
            push (@index, $j);
            last;
        }            
    }
    if ($match == 1) {
        print "the values which got matched are $a[$i] at a and index is $i\n";
    }
}

print "the index of b matched is @index";

嗨,我想获取数组元素匹配的索引和值。

my @a=(3,5,8,6,7,9); 
my @b=(5,9,3);

我想比较@a和@b并从a获取匹配值的索引。 (比较值,ia) 输出为类似这样的内容([5,9,3],[1,5,0])。 b值5与索引1中的a匹配。

有人可以帮我吗?我试图首先获取匹配的数组元素,并在找到匹配项时推送索引。但是没有得到预期的结果。

1 个答案:

答案 0 :(得分:1)

为什么您的代码不起作用

您的代码中有一个非常简单的错字。

#                 V
if ($a[$i] == $b[$i]) {
    $match = 1;

    #              V
    push (@index, $j);
    last;
}

您正在使用$i中当前元素的@a索引来每次访问@b中的相同值,然后按下从未使用过的$j比较。您需要将$a[$i]$b[$j]进行比较。换一个字母就能使程序正常工作。

if ($a[$i] == $b[$j]) {
    $match = 1;
    push (@index, $j);
    last;
}

一种更好的方法

您的实现效率很低。您要做的是从@b中查找@a中的内容。一种简单的方法是建立一个查找哈希(或一个 index ,例如电话簿侧面的字母)。

use strict;
use warnings;
use 5.012; # for say and each on array

my @a = ( 3, 5, 8, 6, 7, 9 );
my @b = ( 5, 9, 3 );
my @index;
my $match;

my %index_of_a;
while ( my ( $index, $value ) = each @a ) {
  $index_of_a{$value} = $index;    # will overwrite
}

foreach my $value (@b) {
  if ( exists $index_of_a{$value} ) {
    say "The index of '$value' in \@a is '$index_of_a{$value}'";
  }
}

代码遍历@a的值。它使用array form of each 1 ,它是Perl 5.12中添加的。然后将它们按值放入哈希中,以便在知道值时可以查找索引。

然后我们迭代@b中的值,并检查我们的哈希中是否有@a的当前值索引。

输出看起来像这样

The index of '5' in @a is '1'
The index of '9' in @a is '5'
The index of '3' in @a is '0'

如果一个值在@a中存在多次,则将使用最后一次出现的值。我的代码无法跟踪何时匹配@b的哪个索引。我会留给你的。


1)虽然我通常不喜欢使用each,但是对于同时需要值和索引的数组,我发现它比C风格的{{1} }循环。