2016-06-23 133 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? –