Получить индекс из сравнения двух разных массивов длины - PullRequest
0 голосов
/ 25 сентября 2018
#!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.(сравниваемые значения, в том числе) выводится примерно так ([5,9,3], [1,5,0]).Значение b соответствует 5 в индексе 1.

Может кто-нибудь помочь мне с этим.Я пытался сначала получить соответствующие элементы массива и нажать индекс, когда совпадение найдено.Но я не получаю ожидаемого результата.

1 Ответ

0 голосов
/ 25 сентября 2018

Почему ваш код не работает

В вашем коде довольно простая опечатка.

#                 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.Он использует массив в виде 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-style for.

...