2011-02-03 1 views
0

Comment filtrer un tableau en utilisant une autre matrice VB6filtre un tableau en utilisant un autre réseau VB6

Modifier donné une matrice A, supprimer tous les éléments dans le tableau B du tableau A

+2

Comme dans, étant donné deux tableaux, 'A' et' B', obtiennent le tableau d'éléments de 'A' qui est aussi présent dans' B'? –

+0

non j'ai ajouté plus d'informations – Smith

Répondre

0

j'ai trouvé la réponse moi-même, merci pour tous ceux qui ont contribué

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

Juste un avertissement, Redim Preserve est SLOOOOOW, si vous avez un grand tableau et beaucoup d'éléments à supprimer, vous pouvez envisager de créer strTemp pour avoir la même taille que SearchArray, en gardant une trace du nombre d'éléments dans strTemp, et en ne faisant que redim preserve à la fin de la fonction. –

+0

j'ai encore édité les fonctions encore, pouvez-vous le scruter pls – Smith

0

Dans ce cas, I » d juste trier un tableau, puis itérer à travers le second, en supprimant les choses du premier tableau si elles sont trouvées. Cet algorithme semble prendre O (n lg n) et fait ce que vous voulez qu'il fasse.

0

En supposant qu'ils sont des tableaux entiers:

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

les éléments de tableau sont des chaînes – Smith

0

Essayez quelque chose comme ça

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 
Questions connexes