0

質問と回答は、必要なものには部分的に入っていますが、完全には入っていないため、他の場所からコピーしています。

ASPクラシックで、文字列の配列に文字列が出現する回数をカウントし、文字列と出現回数に基づいて出力する方法はありますか?

たとえば、次を含む配列があるとします。

こんにちは
ハッピー
こんにちは
こんにちは
テスト
こんにちは
テスト
ハッピー

出力は次のようになります。

こんにちは 4
ハッピー 2
テスト1
テスト 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 つを取得して表示し、別の場所で使用するために独自の変数に入れる方法がわかりません。

誰でもこれを手伝ってもらえますか?

4

2 に答える 2

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

レコードセットを使用した後は、レコードセットを閉じて廃棄することを忘れないでください。

于 2012-06-10T08:23:12.030 に答える
0

このメソッドを使用して辞書オブジェクトをループできます。そのループ内で、上位 2 つのキーとそのカウントを新しい配列または 2 つの新しい変数で追跡します。

于 2012-06-07T21:21:11.960 に答える