Вопрос

Предполагается, что следующий код должен показывать в окне сообщения индекс третий a в строке проверь меня, но когда я запускаю программу, она не дает мне правильного ответа (должно быть 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

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

Это было полезно?

Решение

Вы находите только вторую букву "а".Попробуйте использовать цикл, подобный этому.

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

Другие советы

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

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

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

что на самом деле дало бы вам правильный результат.(Там написано "Найдите первую букву "а", которая встречается после первой буквы "а", которая встречается на или после 3-го символа (который, оказывается, является буквой "а")")

В вашем исходном коде говорилось "Найдите первое 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 (Когда вы попытаетесь найти второе а, вы сбросите свой индекс на -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

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

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

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

Если вы хотите найти N-й элемент, выполните цикл N раз, и каждый раз в цикле выполняйте:

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

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

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

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

Почему это должно быть 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).

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top