x重复字符的索引

时间:2009-03-21 23:41:36

标签: vb.net counting recurring

以下代码应该在消息框中显示字符串 checkme 第三 a 的索引,但是当我运行时程序它没有给我正确的答案(应该是12,而不是我得到9)。我做错了什么以及如何让它成功?

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    Dim checkme As String = "thais is a sample sentence a"
    Dim indexnum As Integer
    indexnum = checkme.IndexOf("a", checkme.IndexOf("a") + 3)
    MessageBox.Show(CStr(indexnum))
End Sub

选项Explicit和Strict必须为On。提前谢谢。

6 个答案:

答案 0 :(得分:2)

我做错了什么?

你找到了第二个a。我猜你在想这个:

checkme.IndexOf("a", checkme.IndexOf("a", 3))

这实际上会给你正确的结果。 (它说“找到第一个发生在第三个字符之后或之后发生的第一个字符(恰好是a)”)

您的原始代码说“在第一个a之后的3个位置或之后发现第一个a”,这只会让您到达第二个a

如何解决?

可以在循环中使用IndexOf,将最后找到的索引重用为下一个起始索引。

Shared Public Function FindIndexOfNthChar(ByVal checkme as String, _
                                          ByVal checkChar as Char, _
                                          ByVal n as Integer) as Integer
   Dim lastIndex As Integer = -1

   For i As Integer = 1 To n
      lastIndex = checkme.IndexOf(checkChar, lastIndex + 1)
      If lastIndex = -1 Then Return -1
   Next i

   Return lastIndex
End Function

你必须小心;如果您在每次尝试时都没有检查-1并立即退出,则最终可能会得到错误的结果。

如果您忘记了这一点(正如其他一些帖子似乎有),那么如果您在单个a的字符串中搜索第三个a,您实际上会返回索引第一个a(当您尝试查找第二个a时,您会将索引重置为-1,这基本上会开始搜索)

出于这个原因,仅仅准确地写出你的意思可能更清楚:

Shared Public Function FindIndexOfNthChar(ByVal checkme as String, _
                                   ByVal checkChar as Char, _ 
                                   ByVal n as Integer) as Integer
   Dim count as Integer = 0

   For i as Integer = 0 To checkme.Length - 1
      If(checkme(i) = checkChar) Then
         count += 1
         If(count = n) Then Return i 
      End If
   Next i

   return -1
End Function

答案 1 :(得分:1)

checkme.IndexOf("a")是2.添加3给出5.所以整个表达式变为:

indexnum = checkme.IndexOf("a", 5)

找到第二个。

如果你想找到第N个,循环N次,每次循环循环:

pos = checkme.IndexOf('a', pos + 1)

在循环之前,将pos设置为-1。

答案 2 :(得分:1)

你只找到第二个“a”。尝试使用这样的循环。

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    Dim checkme As String = "thais is a sample sentence a"
    Dim indexnum As Integer = -1
    For i As Integer = 1 To 3
        indexnum = checkme.IndexOf("a", indexnum + 1)
    Next
    MessageBox.Show(CStr(indexnum))
End Sub

答案 3 :(得分:0)

您拥有的代码不会产生预期的效果。相反做的是找到位于第2位的第一个“a”。然后它找到在位置5(2 + 3)之后出现的第一个“a”。如果你想要第三个“a”,你可以使用类似于以下内容的东西

indexnum = checkme.IndexOf("a")
indexnum = checkme.IndexOf("a", indexnum+1)
indexnum = checkme.IndexOf("a", indexnum+1)

答案 4 :(得分:0)

为什么会是12?位置5之后的下一个“a”位于第9位。您的代码基本上分解为:

'thais is a sample...
'0123456789
Dim idxFirstA = checkme.IndexOf("a") ' equals 2

'thais is a sample...
'0123456789
Dim idxThirdA = checkme.IndexOf("a", 2 + 3) ' equals 9

你跳过第一个“a”(位置2),然后找到第二个“a”(位置9)。

答案 5 :(得分:0)

Private Sub Button4_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) _
                          Handles Button4.Click
    Dim checkme As String = "thais is a sample sentence a"
    Dim indexnum As Integer = -1, occrnc As Integer = 0
    For x As Integer = 0 To checkme.Length - 1
        indexnum = checkme.IndexOf("a", indexnum + 1)
        If indexnum <> -1 Then occrnc += 1
        If occrnc = 3 Then Exit For
    Next
    If occrnc = 3 Then MessageBox.Show(indexnum.ToString)
End Sub