2016-06-23 130 views
2

我有以下阵列要检查数组元素是连续

@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

虽然下面的代码的工作,当我的阵列元件类似于壳体1但由于@array具有元素作为在壳体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)。
  • 需要多个星号表示多个缺失元素,即星号的数量应该与缺失元素的数量相匹配。
+0

做的字母必须以被认为持续?例如。 3A,3C,3B不会?你的'东西'总是数字+字母吗? – Sobrique

+0

'3B'->'4B'会被视为'连续'吗? – Sobrique

+0

而且 - 如果比一个差距更大,你是否需要投入多个星星? – Sobrique

回答

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

+1

对于更大的增量需要多个'*'。 – Sobrique

+0

哦,对,我没有看到他的评论。我加了'1 .. $ nb2 - $ nb1 -1',现在应该会更好。 – Dada

+0

@达达感谢您的回答,但我不明白第16行的目的,即除非($ letter2 && $ letter2 eq'A')。为什么两次检查$ letter2? –