vb.net array.sort()参数为什么1短?

时间:2018-02-23 21:34:55

标签: vb.net

我使用以下代码对数组进行排序:

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)

1 个答案:

答案 0 :(得分:4)

请注意Array.Sort

的方法声明
Public Shared Sub Sort (
    array As Array,
    index As Integer,
    length As Integer,
    comparer As IComparer
)

第三个参数排序length)范围内的元素数量,而不是您建议的结束索引。

因此,我们假设你的intEndingPosition4一分钟。这意味着您期望对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个字符。