vba比较两个数字列表的最快方法



我在MS Access 2010环境中工作。我有两串数字。我需要对它们进行比较,找出清单2中缺失的数字。这些列表可能非常大(超过100000个数字(,所以我需要一种快速的方法来比较它们。

我们假设列表如下:

L1:";1,2,4,5,6,8,9";

L2:";1,2,6,9";

所以我需要找到数字4、5和8。我如何才能最有效地做到这一点?我可以将它们放在一个数组中,并在两个数组中循环,但如果两个列表都包含超过100.000个值,恐怕速度会非常慢。

字典方法会更有效吗?如果是,如何?

请尝试下一个代码。它使用一个字典和两个数组中的字符串。每个数组只需要两次迭代,不需要花费太多时间。数组内容不需要排序。它在第三个数组中返回,其内容被Joined并在Immediate Window中返回。当然,根据您的需要,它可以用作阵列:

Sub testCompare1DArrays()
Dim arr1, arr2, noMatch, i As Long, k As Long, dict2 As Object

arr1 = Split("1,2,4,5,6,8,9", ",")
arr2 = Split("1,2,6,9", ",")
Set dict2 = CreateObject("scripting.dictionary")

'place the array to be checked in the dictionary (as keys)
For i = 0 To UBound(arr2)
dict2(arr2(i)) = vbNullString
Next i

ReDim noMatch(UBound(arr1)) 'set the array to keep the processed result to surelly have space for all occurrences
For i = 1 To UBound(arr1)
If Not dict2.exists(arr1(i)) Then noMatch(k) = arr1(i): k = k + 1 'buld the returned arry for elements not being found as keys
Next i

If k > 0 Then
ReDim Preserve noMatch(k - 1) 'keep only loaded elements
Debug.Print Join(noMatch, "|") 'return in Immediate Window (Ctrl + G)
Else
Debug.Print "All elements of arr2 exists in arr1..."
End If
End Sub

实现此期望结果的另一种方法是使用collections对象。

首先,循环浏览第二个列表,将每个数字添加到集合中,并将每个数字用作自己的项目键。

第二,循环浏览第一个列表,对照第二个列表的键测试每个数字。

如果密钥不存在,请将数字添加到丢失密钥的集合中。

Private Sub compareLists()
Dim list1 As Variant, list2 As Variant
Dim testNumbers As New Collection, _ 
missingNumbers As New Collection
Dim i As Long
Dim number As String
list1 = Split("1,2,4,5,6,8,9", ",")
list2 = Split("1,2,6,9", ",")

'Prepare numbers from list2
For i = 0 to UBound(list2)
number = list2(i)
testNumbers.Add number, number
Next i
'Identify numbers in list1 missing from list2
For i = 0 to UBound(list1)
number = list1(i)
On Error Resume Next
testNumbers.Item number
If Err.Number = 5 And Err.Number <> 457 Then _
missingNumbers.Add number, number
Next i
End Sub

也许存在一个更快的解决方案,但我倾向于使用集合。

最新更新