2016-06-20 4 views
0

Я хочу, чтобы отсортировать ниже элементов с использованием природного сортировки:Natural Сортировка с использованием VB Script

"Z1", "Z3", "Z2", "Z20", "Z10"

После сортировки, я ожидая заказа ниже:

"Z1", "Z2", "Z3", "Z10", "Z20"

Когда я попытался использовать список массивов,

Set oAlist=CreateObject("System.Collections.ArrayList") 
oAlist.sort 

Я получаю результат сортировки на основе ASCII:

Z1, Z10, Z2, Z20, Z3

Пожалуйста, помогите мне о том, как сделать эту естественную сортировку с использованием VB Script

+0

Эта ссылка, как представляется, связана с вашим вопросом: [http://stackoverflow.com/questions/25068977/can-an-arraylist -of-объекты-быть отсортированы по--а-пользовательских-метод-в-VBScript] (http://stackoverflow.com/questions/25068977/can-an-arraylist-of-objects-be-sorted-by- a-custom-method-in-vbscript) –

+0

Почему бы не преобразовать массив строк в числовые значения ArrayList и затем отсортировать? Также вы можете написать свою функцию сортировки, например. г. куча сортировать или сортировать по полю aux отключенного набора записей. – omegastripes

ответ

3

Для теории см here (следуйте ссылкам!). Практическая демонстрация

записей:

Option Explicit 

Const adInteger   =   3 ' 00000003 
Const adVarChar   =  200 ' 000000C8 

Dim sInp : sInp = "Z1,Z3,Z2,Z20,Z10" 
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 = Left(sWord, 1) 
    oRS.Fields("Length").value = CInt(Mid(sWord, 2)) 
    oRS.UpDate 
Next 
oRS.Sort = "Word, Length" 

Dim aTable : aTable = oRS.GetRows() 
ReDim aOut(UBound(aTable, 2)) 
Dim i 
For i = 0 To UBound(aOut) 
    aOut(i) = aTable(0, i) & aTable(1, i) 
Next 
WScript.Echo "B:", Join(aOut) 

ArrayList

Option Explicit 

Dim sInp : sInp = "Z1,Z3,Z2,Z20,Z10,E1,D3,C2,B20,A10" 
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_2 "{0}{1,4}", Left(sWord, 1), CInt(Mid(sWord, 2)) 
    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) = Left(oNAL(i), 1) & CInt(Mid(oNAL(i), 2)) 
Next 
WScript.Echo "B:", Join(aOut) 
Смежные вопросы