下面的代码应该在消息框中显示的索引的第三 字符串 checkme ,在但是当我跑该方案不给我正确的答案(应为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

选项显式和严格必须打开。由于事先。

有帮助吗?

解决方案

你只是找到第二个“一”。尝试使用循环像这样。

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

其他提示

我在做什么错了?

您正在寻找第二a。我猜你所想的这样的:

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

这将真正给你正确的结果。 (它说“查找出现的第一个一后上或第三字符(这恰好是后发生的第一方式的一个)”)

您的原始代码表示“寻找首先发生日或之后超越了第一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的索引(当您尝试找到第二个一个,你会重置指数-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

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

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

指找到第二个。

如果你想找到的第n个,循环N次,每次轮循环做的:

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

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

你拥有的代码将不会产生所希望的效果。它是什么而不是做是找出第一“一个”,其是在2位则在找到第一个“一”该位置5(2 + 3)之后发生。如果你想在第三个“一”,你可以使用类似下面的内容。

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

它为什么会是12?接下来的“一个”之后的位置5是在位置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

您跳过第一 “一”(位置2),然后找到第二 “一”(位置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 = -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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top