【问题标题】:How to sort an array of strings containing numbers如何对包含数字的字符串数组进行排序
【发布时间】:2015-05-26 16:01:28
【问题描述】:

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

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

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

不幸的是,一旦我得到两位数字,它就不再正确排序。所以 "Issue 10:" "Issue 8:" 和 "Issue 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

【问题讨论】:

    标签: arrays vba ms-word


    【解决方案1】:

    字符串按其字符排序,因此字符串“10”、“1”和“8”的排序方式与数字 10,1 和 8 的排序方式不同。

    只需剥离字符串“Issue:”的数组并转换数组中的值,然后使用 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
    

    【讨论】:

    • 我似乎收到了一个编译时错误:“预期:)”
    • 这真的很漂亮。我真的需要学习如何操作数据类型来做我想让他们做的事情。你有关于这个问题的推荐文献吗?
    【解决方案2】:

    1) 将本文中的“onlyDigits”函数添加到您的模块How to find numbers from a string?

    2) 将函数的第一行改为

      Function onlyDigits(s As String) As Integer
    

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

     onlyDigits = CInt(retval)
    

    4) 然后换行

         If arr(i) > arr(j) Then
    

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

    完成。

    【讨论】:

    • 这意味着您在数组中的值不是字符串。由于您没有提供数组的定义,因此这并不明显。因此,首先将变量转换为字符串并像这样调用函数:onlyDigits(CStr(arr(i)))
    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2019-05-26
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多