2011-02-03 2 views
0

Как отфильтровать массив с помощью другого массива VB6фильтра массив с помощью другого массива VB6

Edit дано массив А, удалить все элементы в массиве B из массива А

+2

Как и, учитывая два массива, 'A' и' B', получают массив элементов из 'A', который также присутствует в' B'? –

+0

no я добавил дополнительную информацию – Smith

ответ

0

я нашел ответ сам, спасибо всем, кто способствовал

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 
+0

Просто предупреждение, Redim Preserve - это SLOOOOOW, если у вас есть большой массив и множество элементов для удаления, вы можете захотеть создать strTemp того же размера, что и SearchArray, отслеживая количество элементов в strTemp и сохраняя только redim в конце функции. –

+0

Я еще редактировал функции, вы можете тщательно изучить их PLS – Smith

0

В этом случае, I» d просто сортировать один массив, а затем перебирать второй, удаляя вещи из первого массива, если они найдены. Этот алгоритм, по-видимому, принимает O (n lg n) и делает то, что вы хотите.

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 
+0

массивы элементов являются строками – Smith

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 
Смежные вопросы