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