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
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
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
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. –
j'ai encore édité les fonctions encore, pouvez-vous le scruter pls – Smith
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.
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
les éléments de tableau sont des chaînes – Smith
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
Comme dans, étant donné deux tableaux, 'A' et' B', obtiennent le tableau d'éléments de 'A' qui est aussi présent dans' B'? –
non j'ai ajouté plus d'informations – Smith