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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top