VBScript にはネイティブの並べ替えがないため、友人の助けが必要です。あなたの場合、より複雑な並べ替え基準のために、友人は.NetのArrayList、JScriptの並べ替え、またはsort.exe(ここで紹介)ではなく、切断されたADOレコードセットである必要があります。
Const adInteger = 3 ' 00000003
Const adVarChar = 200 ' 000000C8
Dim sInp : sInp = "this is an example of a description"
Dim aInp : aInp = Split(sInp)
WScript.Echo "A:", Join(aInp)
Dim oRS : Set oRS = CreateObject("ADODB.Recordset")
oRS.Fields.Append "Word", adVarChar, 50
oRS.Fields.Append "Length", adInteger
oRS.Open
Dim sWord
For Each sWord In aInp
oRS.AddNew
oRS.Fields("Word").value = sWord
oRS.Fields("Length").value = Len(sWord)
oRS.UpDate
Next
oRS.Sort = "Length DESC, Word"
Dim aTable : aTable = oRS.GetRows()
ReDim aOut(UBound(aTable, 2))
Dim i
For i = 0 To UBound(aOut)
aOut(i) = aTable(0, i)
Next
WScript.Echo "B:", Join(aOut)
出力:
A: this is an example of a description
B: description example this an is of a
バックグラウンドについては、ここから開始してください。
追加 - ArrayList 愛好家向け:
データが本質的に表形式である場合 (並べ替え条件に要素の複数の側面/プロパティが含まれる場合)、Disconnected Recordset を最初に選択する必要があります。
VBScript での ArrayList の並べ替えは、単純なケースにのみ適しています。これは、AFAIK で比較関数を並べ替えメソッドに渡すことができないためです。私が間違っていることを証明してください!
より複雑な並べ替えに ArrayList を使用する必要がある場合は、
シュワルツ変換を検討してください。
- 比較を容易にするためにカスタマイズされた一時データを準備する
- 選別
- 元のデータを回復する
コード内:
Const csSep = "|"
Const cnMax = 100
Dim sInp : sInp = "this is an example of a description"
Dim aInp : aInp = Split(sInp)
WScript.Echo "A:", Join(aInp)
Dim oNAL : Set oNAL = CreateObject( "System.Collections.ArrayList" )
Dim oSB : Set oSB = CreateObject( "System.Text.StringBuilder" )
Dim sWord
For Each sWord In aInp
oSB.AppendFormat_3 "{0,4}{1}{2}", 100 - Len(sWord), csSep, sWord
sWord = oSB.ToString()
oSB.Length = 0
oNAL.Add sWord
Next
oNAL.Sort
ReDim aOut(oNAL.Count - 1)
Dim i
For i = 0 To UBound(aOut)
aOut(i) = Split(oNAL(i), csSep)(1)
Next
WScript.Echo "B:", Join(aOut)
出力:
A: this is an example of a description
B: description example this an is of a