Индекс х повторяющихся символов - PullRequest
0 голосов
/ 22 марта 2009

Следующий код должен показывать в окне сообщения индекс третьего a в строке checkme , но когда я запускаю программу, он не дает мне правильный ответ (должно быть 12, вместо этого я получаю 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
    indexnum = checkme.IndexOf("a", checkme.IndexOf("a") + 3)
    MessageBox.Show(CStr(indexnum))
End Sub

Опция Явная и Строгая должна быть включена. Заранее спасибо.

Ответы [ 6 ]

2 голосов
/ 22 марта 2009

Что я делаю не так?

Вы находите второе a. Я предполагаю, что вы думали об этом:

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

, что на самом деле даст вам правильный результат. (Там написано: «Найдите первое a, которое встречается после первого a, которое встречается на 3-м символе или после него (это a)»)

Ваш оригинальный код гласил: «Найдите первый a, который появляется на или после 3 позиций после первого a», что приводит вас только ко второму a.

Как это исправить?

Вы можете просто использовать IndexOf в цикле, повторно используя последний найденный индекс в качестве следующего начального индекса.

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

Вы должны быть осторожны; если вы не проверяете -1 при каждой попытке и сразу же завершаете работу, вы можете получить неверные результаты.

Если вы забыли об этом (как некоторые другие сообщения, похоже, имеют), то, если вы будете искать третий a в строке с одним a, вы фактически вернете индекс первого a (Когда вы попытаетесь найти второй a, вы сбросите свой индекс на -1, что, по сути, начнет поиск заново)

По этой причине может быть понятнее просто написать именно то, что вы имеете в виду:

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
1 голос
/ 22 марта 2009

Вы найдете только второе «а». Попробуйте использовать цикл так.

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
1 голос
/ 22 марта 2009

checkme.IndexOf("a") равно 2. Добавление 3 дает 5. Таким образом, все выражение становится:

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

Который находит второй.

Если вы хотите найти N-ую, сделайте N циклов, и каждый раз вокруг цикла:

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

Перед циклом установите pos равным -1.

0 голосов
/ 22 марта 2009
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
0 голосов
/ 22 марта 2009

С чего бы это было 12? Следующее «а» после позиции 5 находится в позиции 9. Ваш код в основном разбивается на:

'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

Вы пропускаете 1-е «а» (позиция 2), а затем находите 2-е «а» (позиция 9).

0 голосов
/ 22 марта 2009

Код, который вы используете, не даст желаемого эффекта. Вместо этого он находит первое «а», которое находится в позиции 2. затем он находит первое «а», которое появляется после позиции 5 (2 + 3). Если вы хотите третий «а», вы можете использовать что-то похожее на следующее

indexnum = checkme.IndexOf("a")
indexnum = checkme.IndexOf("a", indexnum+1)
indexnum = checkme.IndexOf("a", indexnum+1)
...