Indice di x ricorrente Character
Domanda
Il codice che segue si suppone per mostrare in una finestra di messaggio l'indice del terzo a nella stringa di checkme , ma quando corro il programma che non mi dà la risposta giusta (dovrebbe essere 12, invece ottengo 9). Che cosa sto facendo male e come potrei fare per farlo funzionare?
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 e rigoroso deve essere acceso. Grazie in anticipo.
Soluzione
Si sta trovando solo la seconda "a". Provare a utilizzare un ciclo in questo modo.
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
Altri suggerimenti
Che cosa sto facendo di sbagliato?
Si sta trovando la seconda a
. Sto indovinando stavi pensando di questo:
checkme.IndexOf("a", checkme.IndexOf("a", 3))
che effettivamente dare il risultato giusto. (Si dice "Trova il primo di una che si verifica dopo il primo che si verifica un o dopo il 3 ° carattere (che sembra essere un a)")
Il tuo codice originale ha dichiarato: "Trovare il primo di una che si verifica a partire dal 3 posizioni oltre il primo a", che si ottiene solo al secondo IndexOf
.
Come posso risolvere il problema?
potrebbero è sufficiente utilizzare il -1
in un ciclo, riutilizzando l'ultimo indice trovato come la prossima indice di partenza.
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
Bisogna stare attenti; se non si verifica per <=> su ogni tentativo e uscire immediatamente, si può finire con risultati errati.
Se hai dimenticato questo (come alcuni degli altri posti sembrano avere), quindi se si cerca la terza <=> in una stringa con un singolo <=> ci troveremo a restituire l'indice del primo <= > (Quando si tenta di trovare la seconda una, potrai reimpostare l'indice a <=>, che inizia essenzialmente la ricerca sopra)
Per questo motivo, potrebbe essere più chiaro solo per scrivere esattamente quello che vuoi 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")
è 2. Aggiunta 3 dà 5. Così l'intera espressione diventa:
indexnum = checkme.IndexOf("a", 5)
che trova la seconda.
Se si vuole trovare l'ennesimo uno, i tempi del ciclo N, e ogni volta il giro del ciclo do:
pos = checkme.IndexOf('a', pos + 1)
Prima del loop selezionate pos essere -1.
Il codice si dispone di non produrre l'effetto desiderato. Quello che sta facendo è invece trovare il primo "a", che è in posizione 2. allora è trovare la prima "a" che si verifica dopo la posizione 5 (2 + 3). Se si desidera che il terzo "a" si potrebbe usare qualcosa di simile al seguente
indexnum = checkme.IndexOf("a")
indexnum = checkme.IndexOf("a", indexnum+1)
indexnum = checkme.IndexOf("a", indexnum+1)
Perché sarebbe 12? Il prossimo "a" dopo la posizione 5 è in posizione 9. Il codice rompe sostanzialmente verso il basso per:
'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
È saltare la prima "a" (posizione 2), e poi trovare il 2 ° "a" (posizione 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