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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top