Как отфильтровать массив с помощью другого массива VB6фильтра массив с помощью другого массива VB6
Edit дано массив А, удалить все элементы в массиве B из массива А
Как отфильтровать массив с помощью другого массива VB6фильтра массив с помощью другого массива VB6
Edit дано массив А, удалить все элементы в массиве B из массива А
я нашел ответ сам, спасибо всем, кто способствовал
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
Просто предупреждение, Redim Preserve - это SLOOOOOW, если у вас есть большой массив и множество элементов для удаления, вы можете захотеть создать strTemp того же размера, что и SearchArray, отслеживая количество элементов в strTemp и сохраняя только redim в конце функции. –
Я еще редактировал функции, вы можете тщательно изучить их PLS – Smith
В этом случае, I» d просто сортировать один массив, а затем перебирать второй, удаляя вещи из первого массива, если они найдены. Этот алгоритм, по-видимому, принимает O (n lg n) и делает то, что вы хотите.
Предполагая, что они являются целыми массивами:
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
массивы элементов являются строками – Smith
попробовать что-то вроде этого
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
Как и, учитывая два массива, 'A' и' B', получают массив элементов из 'A', который также присутствует в' B'? –
no я добавил дополнительную информацию – Smith