Frage

Der folgende Code sollte in einem Meldungsfeld zeigt den Index der dritte a in der Zeichenfolge Pruefe , aber wenn ich laufe das Programm gibt mir nicht die richtige Antwort (sollte 12 sein, sondern ich 9). Was mache ich falsch und wie würde ich mich darum, es?

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 und Strenge muss eingeschaltet sein. Vielen Dank im Voraus.

War es hilfreich?

Lösung

Sie finden nur die zweite „a“. Versuchen Sie es mit einer Schleife wie so.

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

Andere Tipps

Was mache ich falsch?

Sie finden den zweiten a. Ich vermute, das Sie dieses Denkens:

checkme.IndexOf("a", checkme.IndexOf("a", 3))

, die würden Sie tatsächlich geben das richtige Ergebnis. (Er sagt: „Finden Sie das erste ein, das auftritt, nach dem ersten ein, die am oder nach dem 3. Zeichen auftritt (die ein a) passiert sein“)

Ihr Original-Code sagte: „Finden Sie die ersten ein, die am oder nach dem 3 Positionen jenseits des ersten a auftritt“, die man nur mit dem zweiten a wird.

Wie kann ich fix it?

Sie könnte nur die IndexOf in einer Schleife, die letzte fand Index als der nächste Startindex erneut verwenden.

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

Sie müssen vorsichtig sein; wenn Sie nicht sofort auf jedem Versuch und Ausfahrt -1 überprüfen, können Sie sich mit falschen Ergebnissen führen.

Wenn Sie dies vergessen haben (wie einige der anderen Beiträge zu haben scheinen), dann, wenn Sie für den dritten a in einem String mit einem einzigen a suchen werden Sie tatsächlich den Index des ersten a zurückkehren (Wenn Sie versuchen, finden die zweite ein, werden Sie Ihren Index -1 zurückgesetzt, die im wesentlichen die Suche beginnt über)

Aus diesem Grunde könnte es klarer sein nur genau zu schreiben, was Sie bedeuten:

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") ist 2. 3 Hinzufügen gibt 5. So ist der ganze Ausdruck wird:

indexnum = checkme.IndexOf("a", 5)

Welche die zweite findet.

Wenn Sie den N-ten, Schleife N mal finden, und jedes Mal rund um die Schleife zu tun:

pos = checkme.IndexOf('a', pos + 1)

Vor der Schleife gesetzt po -1.

Der Code, den Sie haben nicht die gewünschte Wirkung erzeugen. Was es stattdessen tut, ist die erste „a“ zu finden, die an Position 2. dann wird es zu finden die erste „a“, dass nach Position auftritt 5 (2 + 3). Wenn Sie die dritte wollen „a“ Sie etwas ähnliches wie das folgende

verwenden könnte
indexnum = checkme.IndexOf("a")
indexnum = checkme.IndexOf("a", indexnum+1)
indexnum = checkme.IndexOf("a", indexnum+1)

Warum sollte es 12 sein? Die nächste "a" nach Position 5 an Position 9. Ihr Code im Grunde bricht an:

'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

Sie haben die ersten überspringen "a" (Position 2), und dann wird die zweite "a" (Position 9) finden.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top