我使用以下代码对数组进行排序:
Array.Sort(arr, 0, intEndingPosition, New myIComparer)
我希望排序以索引0
开头,以索引intEndingPosition
结束。但是,最后一个元素arr(intEndingPosition)
被排除在外并且没有被排序。为什么呢?
intEndingPosition
预先计算如下:
Dim StringOfConcern As String
Dim OneChar(65534), FrqOne(65534) As String
Dim CntNewOnes, CntRptOnes As Integer
Dim c As Char
Dim i, j As Integer
Dim isNew As Boolean
StringOfConcern = TextBox1.Text
OneChar(0) = CStr(StringOfConcern(0))
FrqOne(0) = 1
i = 0
j = 0
For Each c In StringOfConcern.Substring(1)
isNew = True
For j = 0 To i Step 1
If CStr(c) = OneChar(j) Then
isNew = False
FrqOne(j) += 1
Exit For
End If
Next j
If isNew = True Then
i += 1
OneChar(i) = CStr(c)
FrqOne(i) = 1
End If
Next c
CntNewOnes = i + 1
CntRptOnes = 0
For i = 0 To CntNewOnes - 1 Step 1
If FrqOne(i) > 1 Then CntRptOnes += 1
Next i
这里的排序如下。我原来问题中的代码只是说明性的。实际的排序是:
Array.Sort(FrqOne, OneChar, 0, CntNewOnes - 1)
Array.Reverse(FrqOne, 0, CntNewOnes - 1)
Array.Reverse(OneChar, 0, CntNewOnes - 1)
答案 0 :(得分:4)
请注意Array.Sort
的方法声明Public Shared Sub Sort (
array As Array,
index As Integer,
length As Integer,
comparer As IComparer
)
第三个参数排序(length
)范围内的元素数量,而不是您建议的结束索引。
因此,我们假设你的intEndingPosition
是4
一分钟。这意味着您期望对5个元素进行排序,即索引0, 1, 2, 3, 4
处的元素。但是,数字4
是的长度,而不是结尾索引,因此您只对索引0, 1, 2, 3
处的元素进行排序。
这解释了为什么你观察到被排序的元素比你想象的要短。
简单地说,第三个参数应该指定要排序的元素的长度而不是结束索引。
另一个例子:
考虑Substring
类的String
方法:
Public Function Substring (
startIndex As Integer,
length As Integer
) As String
然后假设我们有这段代码:
Dim temp As String = "testing"
Dim result As String = temp.Substring(0, 4)
result
现在是一个包含4
字符的字符串,4
调用中的Substring
表示应该检索的长度而不是结束索引。
如果4
是结束索引,那么您希望result
包含5个字符。