我正在从其他地方复制问题和答案,因为它部分地涉及我需要但不完全。
在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个最常用的单词,显示它们并能够将它们放在自己的变量中以供其他地方使用。
任何人都可以帮忙吗?
答案 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
使用后请不要忘记关闭并丢弃记录集。