2013-01-02 61 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