使用另一个数组vb6过滤数组

时间:2011-02-03 18:57:06

标签: arrays vb6

如何使用另一个数组vb6过滤数组

编辑 给定一个数组A,从数组A中删除数组B中的所有元素

4 个答案:

答案 0 :(得分:0)

在这种情况下,我只是对一个数组进行排序,然后遍历第二个数组,如果找到它们,则从第一个数组中删除它们。这个算法似乎需要O(n lg n)并且做你想做的事。

答案 1 :(得分:0)

假设它们是整数数组:

Dim FilteredArray() As Integer
Dim X as Long
Dim Y as Long
Dim Z as Long
Dim bDupe as Boolean

Z = -1
For X = 0 to UBound(A)
     bDupe = False
     For Y = 0 to UBound(B)
          If A(X) = B(Y) Then
               bDupe = True
               Exit For
          End If
     Next
     If Not bDupe Then
          Z = Z + 1
          ReDim Preserve FilteredArray(Z)
          FilteredArray(Z) = A(X)
     End If
Next

答案 2 :(得分:0)

尝试这样的事情

Option Explicit

Private Sub Form_Load()
    Dim vElem           As Variant

    For Each vElem In SubstractArray(Array("aa", "b", "test"), Array("c", "aa", "test"))
        Debug.Print vElem
    Next
End Sub

Private Function SubstractArray(arrSrc As Variant, arrBy As Variant) As Variant
    Dim cIndex          As Collection
    Dim vElem           As Variant
    Dim vRetVal         As Variant
    Dim lIdx            As Long

    If UBound(arrSrc) < LBound(arrSrc) Then
        Exit Function
    End If
    '--- build index collection
    Set cIndex = New Collection
    For Each vElem In arrBy
        cIndex.Add vElem, "#" & vElem
    Next
    '--- allocate output array
    lIdx = LBound(arrSrc)
    ReDim vRetVal(lIdx To UBound(arrSrc)) As Variant
    '--- iterate source and seek in index
    For Each vElem In arrSrc
        On Error Resume Next
        IsObject cIndex("#" & vElem)
        If Err.Number <> 0 Then
            vRetVal(lIdx) = vElem
            lIdx = lIdx + 1
        End If
        On Error GoTo 0
    Next
    '--- shrink output array
    If lIdx = LBound(vRetVal) Then
        vRetVal = Split(vbNullString)
    Else
        ReDim Preserve vRetVal(0 To lIdx - 1) As Variant
    End If
    SubstractArray = vRetVal
End Function

答案 3 :(得分:-1)

我自己找到了答案,感谢所有贡献者

Function FilterArray(ByVal Source As String, ByVal Search As String, Optional _
    ByVal Keep As Boolean = True) As String


    Dim i As Long
    Dim SearchArray()      As String
    Dim iSearchLower       As Long
    Dim iSearchUpper       As Long

    If LenB(Source) <> 0 And LenB(Search) <> 0 Then
        SearchArray = Split(Search, " ")
    Else
        FilterArray = Source
        Exit Function
    End If
    iSearchLower = LBound(SearchArray)
    iSearchUpper = UBound(SearchArray)

    For i = iSearchLower To iSearchUpper
        DoEvents
        Source = Join(Filter(Split(Source, " "), SearchArray(i), Keep, _
            vbTextCompare), " ")
    Next i
    FilterArray = Source
End Function