2

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

我的代码执行如下拆分命令:

outputArray = split(描述,"")

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

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

但我想使用数组,以便最长的单词排在第一位,即数组项按字符串长度排序。因此,在一些我似乎无法弄清楚的 VBScript 代码之后,数组将如下所示:[description, example, this, an, is, of, a]

如果字符串长度相同,则二级排序将按字母顺序排列。

我将非常感谢那里的 A 学生对此提供的一些帮助。谢谢。

4

2 回答 2

4

由于 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 爱好者:

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

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

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

  1. 准备定制的临时数据以方便比较
  2. 种类
  3. 恢复原始数据

在代码中:

  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
于 2012-12-07T06:25:57.683 回答
0

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

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

于 2012-12-06T21:47:01.563 回答