0

以下代码应该在消息框中显示字符串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

Option Explicit 和 Strict 必须打开。提前致谢。

4

6 回答 6

2

我究竟做错了什么?

你正在寻找第二个a. 我猜你在想这个:

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

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

您的原始代码说“找到第一个 a 出现在第一个 a 之后的 3 个位置上或之后”,这只会让您到达第二个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
于 2009-03-21T23:54:05.810 回答
1

checkme.IndexOf("a")是 2。加 3 得到 5。所以整个表达式变为:

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

找到第二个。

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

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

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

于 2009-03-21T23:48:33.920 回答
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
于 2009-03-21T23:50:15.053 回答
0

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

indexnum = checkme.IndexOf("a")
indexnum = checkme.IndexOf("a", indexnum+1)
indexnum = checkme.IndexOf("a", indexnum+1)
于 2009-03-21T23:50:18.457 回答
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)。

于 2009-03-21T23:51:49.607 回答
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
于 2009-03-22T00:11:46.860 回答