2013-01-02 65 views
0

我有一個數組說:VMHArray =(12,22,34,4)現在有另一個Arraylist對象說ArrayListTaskDetails保存數據爲(12,55,44,4,12,22,21,107,43,22,34 )現在我寫下如下代碼,用於從列表ArrayListTaskDetails中刪除不在VMHArray中的項目。我們可以在VBScript中重置For循環計數器嗎?

代碼

Dim Flag : Flag = true 
Dim Counter 
For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 step 4 

    Counter = 0 
    Do while Flag 

     If VMHArray(Counter) <> ArrayListTaskDetails (IndexSearch) Then 

      ArrayListTaskDetails.RemoveRange IndexSearch, 4 
      Flag = False 

     End If 
    Counter = Counter + 1 
    Loop 

Next 

現在假設在IndexSearch = 0找到了一個匹配,所以要根據它將在位置0,1,2,3刪除的元素 - 相當不錯。但由於刪除並使ArrayList對象的功能連續,其他元素將向左移動4。現在問題是For Loop已經增加了4,所以它將從location 4的下一次迭代開始。因此,現在數組列表中的新元素0 location永遠不會有機會測試與VMHArray數組元素的相等性。我們是否可以處理這種情況而不會失去預期的操作,或者如果我們可以將For Loop計數器設置到其即時位置,那麼剛剛找到的匹配和4個元素被刪除。

如果有任何問題要了解問題,請讓我知道!

編輯Go to將無法​​正常工作

CODE(按@Ankit建議)

Option Explicit 

Dim Flag : Flag = true 
Dim Counter 
Dim VMHArray : VMHArray = Array(12,22,34,4) 
Dim ArrayListTaskDetails : Set ArrayListTaskDetails = CreateObject("System.Collections.ArrayList") 

    ArrayListTaskDetails.Add(45) 
    ArrayListTaskDetails.Add(4) 
    ArrayListTaskDetails.Add(22) 
    ArrayListTaskDetails.Add(4) 
    ArrayListTaskDetails.Add(45) 
    ArrayListTaskDetails.Add(20) 
    ArrayListTaskDetails.Add(12) 
    ArrayListTaskDetails.Add(35) 
    ArrayListTaskDetails.Add(34) 

    Restart: 
For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 step 4 

    Counter = 0 
    Do while Flag 

     If VMHArray(Counter) <> ArrayListTaskDetails (IndexSearch) Then 

      ArrayListTaskDetails.RemoveRange IndexSearch, 4 
      Goto Restart 
      Flag = False 

     End If 
    Counter = Counter + 1 
    Loop 

Next 

MsgBox(Join(ArrayListTaskDetails.ToArray()),"$") 

Error

感謝,

+0

你嘗試'退出for'寫'for'或嘗試[此退出while循環(http://stackoverflow.com/questions/1271949/exit-a-while-loop- in-vbscripts) – bonCodigo

+0

@bonCodigo如果我使用'exit for',那麼剩下的元素將如何被檢查? – CodeLover

+0

試試我給出的代碼。坦率地說,對不起,我沒有閱讀完整的*完整的小說文本*,只是看看你的標題和代碼。 – bonCodigo

回答

4

兩個思路來解決問題:

  1. 使用字典來檢查的項目,以保持
  2. 循環向後

在代碼:

Option Explicit 

Dim alSrc : Set alSrc = CreateObject("System.Collections.ArrayList") 
Dim sE 
For Each sE In Split("a x x x b x x x c x x x d x x x e x x x f x x x a x x x") 
    alSrc.Add sE 
Next 
WScript.Echo "alSrc:", Join(alSrc.ToArray(), ".") 
Dim aKeep : aKeep  = Split("a d") 
WScript.Echo "aKeep:", Join(aKeep, ".") 
Dim dicKeep : Set dicKeep = CreateObject("Scripting.Dictionary") 
For Each sE In aKeep 
    dicKeep(sE) = 0 
Next 
WScript.Echo "dicKeep:", Join(dicKeep.Keys(), ".") 
Dim nI 
For nI = alSrc.Count - 4 To 0 Step -4 
    sE = alSrc(nI) 
    If Not dicKeep.Exists(sE) Then 
     alSrc.RemoveRange nI, 4 
    End If 
    WScript.Echo sE, nI, Join(alSrc.ToArray(), ".") 
Next 
WScript.Echo "alSrc:", Join(alSrc.ToArray(), ".") 

輸出:

alSrc: a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.e.x.x.x.f.x.x.x.a.x.x.x 
aKeep: a.d 
dicKeep: a.d 
a 24 a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.e.x.x.x.f.x.x.x.a.x.x.x 
f 20 a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.e.x.x.x.a.x.x.x 
e 16 a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.a.x.x.x 
d 12 a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.a.x.x.x 
c 8 a.x.x.x.b.x.x.x.d.x.x.x.a.x.x.x 
b 4 a.x.x.x.d.x.x.x.a.x.x.x 
a 0 a.x.x.x.d.x.x.x.a.x.x.x 
alSrc: a.x.x.x.d.x.x.x.a.x.x.x 

至於.Count之間的神祕面紗 - :

1 2 3 4 5 6 7 8 - Count 1 - 8 
0 1 2 3 4 5 6 7 - Idx 0 - 7 
A x x x B x x x - Count (8) - Step (4) = Pos to check (4) 
        Count (8) - Step + 1 (5) = Not the pos to check (3) 
+0

像往常一樣,你是最好的! – CodeLover

+0

你可以給我一個關於郵政的提示 - [Post](http://stackoverflow.com/questions/14119936/i-am-not-able-to-clear-and-reset-the-background-color- of-cell#comment19549322_14119936)。我在那裏嘗試過,但看起來是一個班輪,我知道這是可能的,因此請你幫忙!請 – CodeLover

+0

爲什麼'.Count-4'不是'.Count-5'。由於Count給我們元素的總數,並且訪問那個元素,我們總是使用ArrayList(Count-1)。糾正我,如果我錯了! – CodeLover

0

你可以嘗試這樣的事情

Dim Flag : Flag = true 
Dim Counter 
Restart: 
For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 step 4 
Counter = 0 
Do while Flag 

    If VMHArray(VMHArray) = ArrayListTaskDetails (IndexSearch) Then 

     ArrayListTaskDetails.RemoveRange IndexSearch, 4 
     Goto Restart 
     Flag = False 

    End If 
Counter = Counter + 1 
Loop 
Next 
+0

VBScript是否支持'Go To'語句,我認爲是'NO'。你能證實我嗎? – CodeLover

+0

它在VBScript上工作​​ – Ankit

+0

讓我試試吧! – CodeLover

0

重置For loop counter意味着你有些不讓它iterate。你必須非常小心,不要碰到infinite loop。坦白地說,沒有閱讀你的大文本。但看你的代碼和名稱,請嘗試以下方法:

For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 step 4 
    Counter = 0 
    Do while Flag 
     If VMHArray(Counter) = ArrayListTaskDetails (IndexSearch) Then 
      ArrayListTaskDetails.RemoveRange IndexSearch, 4 
      Flag = False 
      If IndexSearch >= 4 then 
      IndexSearch = IndexSearch - 4 '-- add this to go back to previous index 
      End If 
     End If 
     Counter = Counter + 1 
    Loop 
Next IndexSearch 
+0

什麼'IndexSearch + 4'呢? – CodeLover

+0

什麼'IndexSearch'呢? – bonCodigo

+1

請記住,循環仍然會嘗試迭代到原始的'ArrayListTaskDetails.Count - 1',導致'ArrayListTaskDetails(IndexSearch)'的下標超出範圍錯誤。在循環過程中,VBScript不會更新爲'from'和'to'值。 – AutomatedChaos