VBScript编码挑战:在Split命令后按字符串长度排序数组

时间:2012-12-06 21:42:01

标签: arrays sorting vbscript string-length

我是VBScript编码的C学生,需要一些帮助。

我的代码执行split命令,如下所示:

outputArray = split(Description,“”)

现在在数组中使用Description中的单个单词,我想根据每个单词的字符串长度对数组进行排序。

因此,例如,如果Description等于“这是描述的示例”,那么我的数组值是[this,is,an,example,of a,description],对吗?

但我想求数组,以便最长的单词是第一个,即数组项按字符串长度排序。所以,在一些我似乎无法弄清楚的VBScript代码之后,数组看起来像这样:[description,example,this,an,is,of,a]

如果字符串长度有关系,则辅助排序将按字母顺序排列。

我非常感谢来自那里的A学生的一些帮助。感谢。

2 个答案:

答案 0 :(得分:3)

由于VBScript没有本机排序,因此需要朋友的帮助。在你的情况下 - 由于你更复杂的排序标准 - 朋友不应该是.Net的ArrayList,JScript的排序或sort.exe(introduced here),而是一个断开连接的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

背景开始here

ADDED - 对于ArrayList Aficionados:

如果您的数据本质上是一个断开连接的记录集应该是您的首选 表格(排序标准涉及元素的多个方面/属性)。

VBScript中的ArrayList排序仅适用于简单的情况,因为 - AFAIK - 你不能将比较函数传递给sort方法。拜托,证明我错了!

如果必须使用ArrayList进行更复杂的排序,请考虑使用 Schwartzian transform

  1. 准备自定义临时数据以便于比较
  2. 排序
  3. 恢复原始数据
  4. 在代码中:

      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
    

答案 1 :(得分:0)

这是一个有用的链接,关于如何按长度和字母顺序排序

http://www.webknowhow.net/dir/ASP/FAQ/array_faq.html