题
下面的代码应该在消息框中显示的索引的第三强> 一字符串 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
不隶属于 StackOverflow