我已经创建了一个数组,想过滤掉所有重复项,并留下一个仅包含一次出现的数字的新数组。
下面是我的代码。第一个数组捕获了我需要的所有数字,但是由于某种原因,第二个数组未按要求过滤掉,并输出与第一个相同的数字。感谢您对发现问题的任何帮助!
ReDim theArray(0 To dRange)
Dim singleValues()
Dim i
Dim q
'fill the array
For i = LBound(theArray) To UBound(theArray)
If (dRange - (dRange * i) <= dRange) Then
theArray(i) = (dHigh - (tSize * i))
End If
Next
'filter repeating elements
With CreateObject("Scripting.Dictionary")
'count each number qty
For i = 0 To dRange
.Item(theArray(i)) = .Item(theArray(i)) + 1
Next
'remove repeating
For Each q In .Keys()
If .Item(q) > 1 Then .Remove q
Next
'retrieve array
singleValues = .Keys()
End With
Debug.Print Join(theArray)
Debug.Print Join(singleValues)
答案 0 :(得分:0)
通常,dictionary structure does not support key repetition强烈反对:
每个项目都与唯一键相关联。该键用于检索单个项目,通常是整数或字符串,但可以是除数组之外的任何东西。
您可能想做的是增加键的值。
Option Explicit
Public Sub TestMe()
'Microsoft Scripting Runtime Library
Dim dict As New Scripting.Dictionary
'or Dim dict as CreateObject("Scripting.Dictionary")
Dim arr1 As Variant
Dim arr2 As Variant
arr1 = Array(1, 11, 11, 112, 34, 5, 6, 6, 7, 7)
Dim i As Long
For i = LBound(arr1) To UBound(arr1)
If Not dict.exists(arr1(i)) Then
dict.Add arr1(i), 1
Else
dict(arr1(i)) = dict(arr1(i) + 1)
End If
Next
ReDim arr2(dict.Count)
For i = 0 To dict.Count - 1
Debug.Print dict.Keys(i); " key is value - "; dict.Items(i)
arr2(i) = dict.Keys(i)
Next i
Debug.Print Join(arr1)
Debug.Print Join(arr2)
End Sub
它将打印以下两个数组:
1 11 11 112 34 5 6 6 7 7
1 11 12 112 34 5 6 7 8
我不确定如何将With CreateObject("Scripting.Dictionary")
和Keys
一起使用,因为分配键的语法如下:dict(arr1(i))
,因此毫无意义,您不能参考与对象。不过,仍然可能有解决方法。
上面的代码使用早期绑定,因此您必须向其中添加一个MS库,从长远来看,它的速度相当快。