检查数组元素是否连续

时间:2016-06-23 12:40:11

标签: arrays perl

我有以下数组

@array = qw(1 2 3 3A 3B 4 6)

我想检查我的数组中的元素是否是连续的

我有不同的连续情景。

案例1: 1,2,3,4被认为是连续的;

案例2: 14A,14B,14C,14D应视为连续;

案例3: 1,2,3,3A,3B,4,5也应视为连续的。

检查连续性的窗口是两个,当有不连续性时,我希望在它的位置返回一个星号(*),即考虑@array它应该在4到6之间返回*,因为5缺少,因此返回1 2 3 3A 3B 4 * 6.

虽然下面的代码在我的数组元素与 case 1 类似时有效,但由于@array有 case 3 中的元素,我的条件不起作用,我寻求一个解决这个问题的有效方法,即涵盖所有三种情况

for ($i=0;$i<=$#array;$i+=2)
{
    if($array[$i+1] == $array[$i]+1)
    {
        print $array[$i],$array[$i+1];
    }
    else
    {
        print $array[$i],"*";
    }
}

需要考虑的事项:

  • 数组元素将始终为数字(例如1,2,3)和与字母连接的数字(例如2A)。
  • 多个缺失元素需要多个星号,即星号的数量应与缺失元素的数量相匹配。

1 个答案:

答案 0 :(得分:2)

你不需要很多东西来解决你的问题:

  • 使用正则表达式分隔数字中的字母,
  • 使用ord来比较字母
  • 然后,编写正确的测试。

例如,此代码应该完成这项工作:

use warnings;
use strict;
my @array = qw(1 2 3 3A 3B 4 6);

$\ = ' '; # adds a space after each print
for my $i (0 .. $#array-1) {
    print $array[$i];
    my ($nb1, $letter1) = $array[$i] =~ /(\d+)([A-Z]*)/;
    my ($nb2, $letter2) = $array[$i+1] =~ /(\d+)([A-Z]*)/;
    if ($nb2 == $nb1 + 1) {
        next;
    } elsif ($nb2 > $nb1 + 1) {
        print '*' for $nb1 .. $nb2 - 2;
    } else {
        if (! $letter1) {
            unless ($letter2 && $letter2 eq 'A') {
                print '*';
            }
        } else {
            unless (ord($letter2) == ord($letter1) + 1) {
                print '*' for ord($letter1) .. ord($letter2) - 2;
            }
        }
    }
}
print $array[-1]

将打印:
1 2 3 3A 3B 4 * 6