如何对包含数字的字符串数组进行排序

时间:2015-05-26 16:01:28

标签: arrays vba ms-word word-vba

我在根据包含数字的字符串正确地对数组进行排序时遇到了一些麻烦:

因此,排序适用于所有字符串,直到我得到2位数字。

例如,如果数组包含“问题2:”“问题5:”和“问题3:”,则它会正确地将字符串排序为2,3,5。

不幸的是,一旦我得到两位数字,它就不再正确排序。所以“问题10:”“问题8:”和“问题13:”不会排序。

我很确定这与我尝试基于字符串而不是数值进行排序的事实有关。有没有办法让它通过字符串正确排序?或者是否有一种“简单”的方法将字符串数字更改为实际数值。

   'This creates a list of what we want to sort by.  
   'The string format will always be "Issue 1:" "Issue 3:" "Issue 2:" "Issue 11:"
   'Issue x:" etc.

    IssueListActual = CreateIssueListFromSection(sectionFind)

    'This creates a duplicate array to be sorted
    IssueListSorted = IssueListActual

    'Sorts the array as seen in below subroutine
    BubbleSort IssueListSorted

Sub BubbleSort(arr)

Dim strTemp As String
Dim i As Long
Dim j As Long
Dim lngMin As Long
Dim lngMax As Long
lngMin = LBound(arr)
lngMax = UBound(arr)
For i = lngMin To lngMax - 1
  For j = i + 1 To lngMax
    If arr(i) > arr(j) Then
      strTemp = arr(i)
      arr(i) = arr(j)
      arr(j) = strTemp
    End If
  Next j
Next i
End Sub

2 个答案:

答案 0 :(得分:2)

字符串按其字符排序,因此字符串" 10"," 1"和" 8"将按不同的方式排序,然后是数字10,1和8。

只需删除字符串数组"问题:"并在使用CLng函数将它们与Longs进行比较之前转换数组中的值,如下所示:CLng(arr(i))。你的代码看起来像这样(我没有测试它):

Sub BubbleSort(arr)
  Dim strTemp As String
  Dim i As Long
  Dim j As Long
  Dim lngMin As Long
  Dim lngMax As Long
  lngMin = LBound(arr)
  lngMax = UBound(arr)
  For i = lngMin To lngMax - 1
    For j = i + 1 To lngMax
      If GetNumber(arr(i)) > GetNumber(arr(j)) Then
        strTemp = arr(i)
        arr(i) = arr(j)
        arr(j) = strTemp
      End If
    Next j
  Next i
End Sub

Function GetNumber(str)
    Dim no As String
    no = CStr(str)
    no = Mid(no, InStr(no, " ") + 1, InStr(no, ":") - InStr(no, " ") - 1)
    GetNumber = CLng(no)
End Function

Sub Test()
   Dim arr(0 To 2) As String
   arr(0) = "Issue 13:"
   arr(1) = "Issue 12:"
   arr(2) = "Issue 5:"
   Call BubbleSort(arr)
End Sub

答案 1 :(得分:1)

1)添加功能" onlyDigits"从这篇文章到你的模块How to find numbers from a string?

2)将函数的第一行更改为

 onlyDigits = CInt(retval)

3)将函数的最后一行更改为

     If arr(i) > arr(j) Then

4)然后改变你的行

     If onlyDigits(arr(i)) > onlyDigits(arr(j)) Then

parseInt()

完成。