在ArrayList中计算唯一项的数量

5

有没有办法在不遍历整个列表的情况下计算ArrayList中项的唯一实例数量?以下是我的代码,我想计算Orange的实例数而不必遍历整个列表 - 我希望有一种方法可以做到这一点。 实际上,该ArrayList将有数十万个项目。

Private Sub TestArrayList2()

    Dim TestAR As Object
    Dim Count As Integer

    Set TestAR = CreateObject("System.Collections.ArrayList")

    TestAR.Add "Apple"
    TestAR.Add "Orange"
    TestAR.Add "Orange"
    TestAR.Add "Orange"
    TestAR.Add "Pear"

    Count = TestAR.Count

End Sub

1
没有内置的方法。您可以使用字典,但这涉及到循环。 - SJR
3个回答

5

我找不到内置的单个函数,但一旦数组列表排序,定位你要查找的字符串的第一个(.IndexOf)和最后一个(.lastIndexOf)出现是一个简单的操作:

lookingfor = "Orange"
TestAR.Sort
occurrences = TestAR.lastIndexOf(lookingfor) - TestAR.IndexOf(lookingfor, 0) + 1

是否有一个在线资源详细介绍了ArrayList可用的所有方法?当我搜索时,我发现可用于C#或Java实现的ArrayList的方法与Excel VBA的方法不同。 - mediaeval

4
您可以使用 .ToArray 然后筛选数组:
Private Sub TestArrayList2()

    Dim TestAR As Object
    Dim Count As Integer, CountOrange As Long

    Set TestAR = CreateObject("System.Collections.ArrayList")

    TestAR.Add "Apple"
    TestAR.Add "Orange"
    TestAR.Add "Orange"
    TestAR.Add "Orange"
    TestAR.Add "Pear"

    CountOrange = UBound(Filter(TestAR.toarray, "Orange", True, vbTextCompare)) + 1
 'or Siddharth's

MsgBox Application.Count(Application.Match(TestAR.toarray, Array("Orange"), 0))  

End Sub

3
不错,还有另一种方法... MsgBox Application.Count(Application.Match(TestAR.toarray, Array("Orange"), 0)) - Siddharth Rout
@SiddharthRout,你能把你的评论发表为答案吗? - GMalc
@GMalc:不太确定。已经有一个被接受的答案了。而且我的回答与EvR的回答类似。他也可以把它加入到他的回答中:D - Siddharth Rout
@GMalc和SiddharthRout,刚刚添加了。;-) - EvR

0

我不知道你是否真的需要它是一个 ArrayList,但你可以像这样使用一个 Scripting.Dictionary

Option Explicit
Private Sub TestArrayList2()

    Dim TestAR As Object
    Set TestAR = CreateObject("Scripting.Dictionary")

    Dim i As Long
    With ThisWorkbook.Sheets("Test")
        For i = 1 To .UsedRange.Rows.Count
            If Not TestAR.Exists(.Cells(i, 1).Value) Then
                TestAR.Add .Cells(i, 1).Value, 1
            Else
                TestAR(.Cells(i, 1).Value) = TestAR(.Cells(i, 1).Value) + 1
            End If
        Next i
    End With
    Dim Count As Long
    Count = TestAR("Orange")

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接