Index des x Caractère Récurrent
Question
Le code suivant est censé afficher dans une boîte de message l'index du troisième a dans la chaîne checkme , mais quand je lance le programme, il ne me donne pas la bonne réponse (devrait être 12, au lieu que je reçois 9). Qu'est-ce que je fais mal et comment pourrais-je aller sur le faire fonctionner?
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 et stricte doit être activée. Merci à l'avance.
La solution
Vous ne trouver le deuxième « a ». Essayez d'utiliser une boucle comme ceci.
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
Autres conseils
Qu'est-ce que je fais mal?
Vous trouver la deuxième a
. Je devine que vous pensiez à ceci:
checkme.IndexOf("a", checkme.IndexOf("a", 3))
qui vraiment vous donner le bon résultat. (Il dit: « Trouver la première un qui se produit après la première qui se produit une ou après le 3ème caractère (qui se trouve être une a) »)
Votre code original dit « Trouver la première qui se produit une ou après 3 positions au-delà de la première a », qui ne vous arrive à la seconde IndexOf
.
Comment puis-je résoudre ce problème?
pourrait il suffit d'utiliser la boucle dans une -1
, réutilisant le dernier indice trouvé que le prochain index de départ.
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
Vous devez être prudent; si vous ne cochez pas à chaque tentative <=> et sortir immédiatement, vous pouvez vous retrouver avec des résultats erronés.
Si vous avez oublié ce (comme certains des autres postes semblent avoir), alors si vous recherchez le troisième dans une chaîne <=> avec un seul <=> vous retournerez en fait l'indice du premier <= > (Lorsque vous essayez de trouver le second a, vous réinitialiser votre index <=>, qui commence essentiellement la recherche sur)
Pour cette raison, il pourrait être plus claire juste pour écrire exactement ce que vous voulez dire:
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")
est 2. 3 donne 5. Ajout d'donc toute l'expression devient:
indexnum = checkme.IndexOf("a", 5)
qui trouve le second.
Si vous voulez trouver la Nième une, fois la boucle N, et chaque fois autour de la boucle do:
pos = checkme.IndexOf('a', pos + 1)
Avant la boucle, fixé pos soit -1.
Le code que vous avez ne produira pas l'effet désiré. Ce qu'il est plutôt en train de faire est de trouver le premier « a » qui est à la position 2. il est de trouver le premier « a » qui se produit après la position 5 (2 + 3). Si vous voulez que le troisième « a » vous pouvez utiliser quelque chose de similaire à ce qui suit
indexnum = checkme.IndexOf("a")
indexnum = checkme.IndexOf("a", indexnum+1)
indexnum = checkme.IndexOf("a", indexnum+1)
Pourquoi serait-il 12? Le prochain "a" après la position 5 est à la position 9. Votre code casse essentiellement à:
'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
Vous passez la 1ère "a" (position 2), puis trouver le 2ème "a" (position 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