Perl - просматривая два массива, чтобы найти «пробелы» - PullRequest
0 голосов
/ 07 сентября 2018

Итак, мой код настроен так, как показано ниже

#!/usr/bin/perl -w
# vim: set expandtab ts=2 bg=dark smartindent shiftwidth=2 softtabstop=2 :
#

use strict;
use Data::Dumper;
use Getopt::Long qw(GetOptions);
####use warnings;
use 5.010;


####my @arr1 = ( "0", "1", "2", "3", "4");    # OK
my @arr1 = ( "0", "1", "3", "4");             # Gap-1... seq2
my $arr1_len = scalar @arr1;
##
my @arr2 = ( "0", "1", "2", "3", "4");        # OK
####my @arr2 = ( "0", "1", "3", "4");         # Gap-2... seq2
my $arr2_len = scalar @arr2;

Я пытаюсь перебрать каждый список, сравнить его с каждым другим и обнаружить любые пробелы в последовательности (значения являются последовательными номерами каждого потока - на данный момент они последовательные, но они не должны быть / не будут в пример из реального мира)

EFFORT 1 = если я использую внутренний цикл for для arr2, он всегда начинается с indx 0 - т. Е. Указатель / число не помечается после того, как у нас есть совпадение

EFFORT 2 = если я делаю фальшивый внутренний цикл / arr2, то я не могу перейти к следующему j без увеличения счетчика i

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

УСИЛИЕ 1

ARR1: for (my $i=0; $i <= ($arr1_len-1); $i++) {
  print "i[$i]=$arr1[$i]\n";

  ARR2: for (my $j=0; $j <= ($arr2_len-1); $j++) {
    print "... j[$j]=$arr2[$j] -- ((i[$i]=$arr1[$i]))\n";

    # seq num match
    if ( $arr1[$i] eq $arr2[$j]){
      print "MATCH of seq_num [$arr1[$i]|$arr2[$j]]\n";
      shift @arr2;
      next ARR1;
    } # end of seq num match

    # gap in arr2
    if ( $arr1[$i] < $arr2[$j]){
      print "GAP in new [$arr1[$i]|$arr2[$j]]... New Missing $arr1[$i]\n";
      next ARR1;
    } # end of gap in arr2

    # gap in arr1
    if ( $arr2[$j] < $arr1[$i]){
      print "GAP in old [$arr1[$i]|$arr2[$j]]... Old Missing $arr2[$j]\n";
      next ARR2;
    } # end of gap in arr1
  } # end of j loop
} # i loop

УСИЛИЕ 2

my $j = 0;

ARR1: for (my $i=0; $i <= ($arr1_len-1); $i++) {
  print "i[$i]=$arr1[$i]\n";

  if ( $j <= ($arr2_len-1) ) {
    print "... j[$j]=$arr2[$j] -- ((i[$i]=$arr1[$i]))\n";

    # seq num match
    if ( $arr1[$i] eq $arr2[$j]){
      print "MATCH of seq_num [$arr1[$i]|$arr2[$j]]\n"; 
      $j++;
      next ARR1;
    } # end of seq_num match

    # probable gap in arr2
    if ( $arr1[$i] < $arr2[$j]){
      print "GAP in new [$arr1[$i]|$arr2[$j]]... New Missing $arr1[$i]\n";
      next ARR1;
    } # end of gap in arr2

    # probable gap in arr1
    if ( $arr2[$j] < $arr1[$i]){
      print "GAP in old [$arr1[$i]|$arr2[$j]]... arr1 Missing $arr2[$j]\n";
      # CANT NEXT J WITHOUT INCREASING I  ?!?
    } # end of gap in arr1

  } # end of fake j loop!
} # end of i loop

Ответы [ 2 ]

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

Определение дыры или пробела только в том случае, если оно в arr1, а не в arr2 - или наоборот ... и мне нужно выяснить это итеративным образом (например, при совпадении Iзатем сделайте еще несколько проверок этих объектов данных)

Хеш-таблицы - ваш друг.Примерно такой фрагмент:

use List::Util qw/max/;
my %hash1 = map { $_ => 1 } @arr1;
my %hash2 = map { $_ => 1 } @arr2;
my $len = max($arr1[$#arr1], $arr2[$#arr2]);
for my $n (0 .. $len) {
  if (exists $hash1{$n} and exists $hash2{$n}) {
    # n is in both lists
  } elsif (exists $hash1{$n}) {
    # n is only in the first one.
  } elsif (exists $hash2{$n}) {
    # n is only in the second one.
  } else {
    # Not in either one
  }
}

может помочь вам.

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

Я не знаю, решит ли это вашу проблему, но Set :: IntSpan может обнаружить «дыры» в последовательности s (даже если они неупорядочены)

#!/usr/bin/perl
use strict;
use warnings;
use Set::IntSpan;

my @arr1 = ( 0, 1, 3, 4);

my $set = Set::IntSpan->new(@arr1);

print $set->holes;

Отпечатки: 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...