我在根据包含数字的字符串正确地对数组进行排序时遇到了一些麻烦:
因此,排序适用于所有字符串,直到我得到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
答案 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()
完成。