计算Array中字符串出现次数的其他问题

时间:2012-06-07 16:55:02

标签: asp-classic vbscript

我正在从其他地方复制问题和答案,因为它部分地涉及我需要但不完全。

在ASP classic中,有没有办法计算字符串出现在字符串数组中的次数,并根据字符串和出现次数输出它们?

例如,如果我有一个包含以下内容的数组:

hello
happy
hello
hello
testing
hello
test
happy

输出结果为:

hello 4
happy 2
test 1
testing 1

给出的答案是:

我假设语言是VBScript(因为大多数人都使用经典ASP)。

您可以使用Dictionary对象来跟踪个别计数:

Function CountValues(pArray)
    Dim i, item
    Dim dictCounts
    Set dictCounts = Server.CreateObject("Scripting.Dictionary")
    For i = LBound(pArray) To UBound(pArray)
        item = pArray(i)
        If Not dictCounts.Exists(item) Then 
            dictCounts.Add item, 0
        End If
        dictCounts.Item(item) = dictCounts.Item(item) + 1
    Next
    Set CountValues = dictCounts
End Function 

这很棒,但我无法弄清楚如何抓住前2个最常用的单词,显示它们并能够将它们放在自己的变量中以供其他地方使用。

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您可以使用this method遍历字典对象。在该循环内部,用新数组或两个新变量跟踪前两个键及其计数。

答案 1 :(得分:0)

您无法在VBScript中对Dictionary对象进行排序,因此您必须使用其他内容。

我的建议是使用断开连接的Recordset对象来保存项目及其出现次数。这样的对象本身支持排序,并且它非常易于使用。要实现这一目标,请改为:

Function CountValues_Recordset(pArray)
    Dim i, item
    Dim oRS
    Const adVarChar = 200
    Const adInteger = 3
    Set oRS = CreateObject("ADODB.Recordset")
    oRS.Fields.Append "Item", adVarChar, 255
    oRS.Fields.Append "Occurrences", adInteger, 255
    oRS.Open
    For i = LBound(pArray) To UBound(pArray)
        item = pArray(i)
        oRS.Filter = "Item='" & Replace(item, "'", "''") & "'"
        If (oRS.EOF) Then
            oRS.AddNew
            oRS.Fields("Item").Value = item
            oRS.Fields("Occurrences").Value = 1
        Else  
            oRS.Fields("Occurrences").Value = oRS.Fields("Occurrences").Value + 1
        End If
        oRS.Update
        oRS.Filter = ""
    Next
    oRS.Sort = "Occurrences DESC"
    oRS.MoveFirst
    Set CountValues_Recordset = oRS
End Function

使用它来实现你想要的输出:

Dim myArray, oRS
myArray = Array("happy", "hello", "hello", "testing", "hello", "test", "hello", "happy")
Set oRS = CountValues_Recordset(myArray)
Do Until oRS.EOF
    Response.Write(oRS("item") & " " & oRS("Occurrences") & "<br />")
    oRS.MoveNext
Loop
oRS.Close
Set oRS = Nothing

使用后请不要忘记关闭并丢弃记录集。